用IDEA整合SSM

假設(shè)已經(jīng)有了一個(gè)spring mvc的啟動(dòng)項(xiàng)目,可以參考文章:
http://www.reibang.com/p/39299910b2da

1呈队、打開(kāi)pom.xml文件,配置如下依賴(lài)項(xiàng)

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    <spring.version>5.0.7.RELEASE</spring.version>
  </properties>

  <!--依賴(lài)管理設(shè)置,例如類(lèi)庫(kù)A和類(lèi)庫(kù)B都依賴(lài)類(lèi)庫(kù)C,如果A依賴(lài)的C為1.0版本,B依賴(lài)的C為1.2版本,那么在此處明確指定C的版本,這樣就A和B就會(huì)依賴(lài)相同的C版本-->
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-framework-bom</artifactId>
        <version>${spring.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

 <dependencies>
        <!--單元測(cè)試的依賴(lài)-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>

        <!--數(shù)據(jù)庫(kù)-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>


        <!--MyBatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.2</version>
        </dependency>

        <!--spring mvc的核心依賴(lài)-->
        <!--然后依賴(lài)的spring core包等會(huì)自動(dòng)導(dǎo)入-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
        </dependency>


        <!--JSON支持-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.6</version>
        </dependency>

        <!--文件上傳-->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.3</version>
        </dependency>

        <!--日志-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.25</version>
        </dependency>


    </dependencies>

2唱歧、配置web.xml文件宪摧,內(nèi)容如下,具體含義看注釋

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         id="WebApp_ID" version="3.0">

<display-name>Spring MVC material</display-name>

    <!--指定Spring的配置文件地址-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring.xml</param-value>
    </context-param>

    <!--監(jiān)視spring的生命周期-->
    <listener>
        <description>spring監(jiān)聽(tīng)器</description>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- 阿里巴巴數(shù)據(jù)源配置啟用Web監(jiān)控統(tǒng)計(jì)功能 -->
    <!-- 通過(guò) http://ip:port/druid/ 地址訪問(wèn)即可 -->
    <servlet>
        <servlet-name>DruidStatView</servlet-name>
        <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
        <init-param>
            <param-name>allow</param-name>
            <param-value>127.0.0.1</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>DruidStatView</servlet-name>
        <url-pattern>/druid/*</url-pattern>
    </servlet-mapping>

    <!--配置Spring MVC 的DispatcherServlet,指定配置文件的路徑,攔截所有的請(qǐng)求-->
    <servlet>
        <!--這個(gè)名稱(chēng)如果不特別指定的話颅崩,跟配置文件名稱(chēng)有關(guān)聯(lián)几于。如果特別指定配置文件了,則此名稱(chēng)就無(wú)所謂了-->
        <servlet-name>springMvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <description>spring mvc 配置文件</description>
            <!--contextConfigLocation這個(gè)參數(shù)可以不配置沿后,如果不配置的話沿彭,那么默認(rèn)的value就是/WEB-INF/[servlet名字]-servlet.xml-->
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <!--表示啟動(dòng)容器時(shí)初始化該Servlet-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springMvc</servlet-name>
        <!--mvc-dispatcher攔截所有的請(qǐng)求-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!-- Spring 字符編碼配置 -->
    <filter>
        <description>字符集過(guò)濾器</description>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <description>字符集編碼</description>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>



</web-app>

3、配置數(shù)據(jù)庫(kù)連接
在resources文件夾下新建一個(gè)jdbc.properties文件尖滚,內(nèi)容如下:

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/student_manage?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=

4喉刘、配置mybatis

4.1 在resources文件夾下新建一個(gè)mybatis-config.xml文件瞧柔,作為mybatis的通用設(shè)置文件,內(nèi)容如下:

<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 配置全局屬性 -->
    <settings>
        <!-- 使用jdbc的getGeneratedKeys獲取數(shù)據(jù)庫(kù)自增主鍵值 -->
        <setting name="useGeneratedKeys" value="true"/>

        <!-- 使用列別名替換列名 默認(rèn):true -->
        <setting name="useColumnLabel" value="true"/>

        <!-- 開(kāi)啟駝峰命名轉(zhuǎn)換:Table{create_time} -> Entity{createTime} -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
</configuration>


4.2 配置spring集成mybatis的文件
在resources文件夾下新建一個(gè)spring-mybatis.xml文件睦裳,內(nèi)容如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 配置整合mybatis過(guò)程 -->
    <!-- 1.配置數(shù)據(jù)庫(kù)相關(guān)參數(shù)properties的屬性:${url} -->
    <!-- 使用數(shù)據(jù)庫(kù)配置文件解耦 -->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!-- 下面的druid配置都是基本配置,具體優(yōu)化設(shè)置可以上網(wǎng)查詢,也可以去github上面直接搜索druid -->
    <!-- 2.數(shù)據(jù)庫(kù)連接池 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <!-- 配置連接池屬性 -->
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>

        <!-- 配置初始化大小造锅、最小、最大 -->
        <property name="initialSize" value="10"/>
        <property name="minIdle" value="20"/>
        <property name="maxActive" value="100"/>

        <!-- 配置獲取連接等待超時(shí)的時(shí)間 -->
        <property name="maxWait" value="10000"/>

        <!-- 配置間隔多久才進(jìn)行一次檢測(cè)廉邑,檢測(cè)需要關(guān)閉的空閑連接哥蔚,單位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000"/>

        <!-- 配置一個(gè)連接在池中最小生存的時(shí)間,單位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="300000"/>

        <property name="testWhileIdle" value="true"/>

        <!-- 這里建議配置為T(mén)RUE蛛蒙,防止取到的連接不可用 -->
        <property name="testOnBorrow" value="true"/>
        <property name="testOnReturn" value="false"/>

        <!-- 打開(kāi)PSCache糙箍,并且指定每個(gè)連接上PSCache的大小 -->
        <property name="poolPreparedStatements" value="true"/>
        <property name="maxPoolPreparedStatementPerConnectionSize"
                  value="20"/>

        <!-- 這里配置提交方式,默認(rèn)就是TRUE牵祟,可以不用配置 -->

        <property name="defaultAutoCommit" value="true"/>

        <!-- 驗(yàn)證連接有效與否的SQL深夯,不同的數(shù)據(jù)配置不同 -->
        <property name="validationQuery" value="select 1 "/>
        <property name="filters" value="stat"/>
        <property name="proxyFilters">
            <list>
                <ref bean="logFilter"/>
            </list>
        </property>
    </bean>

    <!-- 3.配置SqlSessionFactory對(duì)象 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 注入數(shù)據(jù)庫(kù)連接池 -->
        <property name="dataSource" ref="dataSource"/>
        <!-- 配置MyBaties全局配置文件:mybatis-config.xml -->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <!-- 掃描entity包 使用別名 -->
        <property name="typeAliasesPackage" value="com.xiaozhao.domain"/>
        <!-- 掃描sql配置文件:mapper需要的xml文件 -->
        <property name="mapperLocations" value="classpath*:mapper/**/*.xml"/>
    </bean>

    <!-- 4.配置掃描Dao接口包,動(dòng)態(tài)實(shí)現(xiàn)Dao接口课舍,注入到spring容器中 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 注入sqlSessionFactory -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <!-- 給出需要掃描Dao接口包 -->
        <property name="basePackage" value="com.xiaozhao.dao"/>
    </bean>

    <!-- 上面的druid的配置 -->
    <bean id="logFilter" class="com.alibaba.druid.filter.logging.Slf4jLogFilter">
        <property name="statementExecutableSqlLogEnable" value="false"/>
    </bean>
</beans>


然后打開(kāi)resources文件夾下的spring.xml文件塌西,加入屬性配置文件和新建的spring-mybatis文件

在最下面添加如下代碼:

 <!-- 引入屬性文件 -->
    <bean id="propertyConfigurer"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
        <property name="ignoreResourceNotFound" value="true" />
        <property name="locations">
            <list>
                <value>classpath:jdbc.properties</value>
            </list>
        </property>
    </bean>

<import resource="spring-mybatis.xml"/>

spring.xml文件最終如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--啟動(dòng)DI管理-->
    <context:annotation-config/>

    <!-- 在主容器中不掃描@Controller注解,在SpringMvc中只掃描@Controller注解 -->
    <!--把控制器從包掃描中排除出去-->
    <context:component-scan base-package="com.demo">
        <context:exclude-filter type="annotation"
                                expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!-- 引入屬性文件 -->
    <bean id="propertyConfigurer"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
        <property name="ignoreResourceNotFound" value="true" />
        <property name="locations">
            <list>
                <value>classpath:jdbc.properties</value>
            </list>
        </property>
    </bean>


    <import resource="spring-mybatis.xml"/>

</beans>

5筝尾、建立對(duì)應(yīng)的代碼文件

5.1 新建一個(gè)com.demo.domain包捡需,添加一個(gè)Role類(lèi):

package com.demo.domain;

/**
 * @author xiaozhao
 * @date 2018/8/6上午10:27
 */
public class Role {
    private Integer id;
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

5.2 新建一個(gè)com.demo.dao包,添加一個(gè)RoleMapper接口:

package com.demo.dao;

import com.demo.domain.Role;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * @author xiaozhao
 * @date 2018/8/6上午10:28
 */
@Mapper
public interface RoleMapper {
    /**
     * 查詢所有角色
     *
     * @return
     */
    List<Role> queryAll();
}

5.3 新建一個(gè)com.demo.service包筹淫,添加一個(gè)RoleService類(lèi):

package com.demo.service;

import com.demo.dao.RoleMapper;
import com.demo.domain.Role;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author xiaozhao
 * @date 2018/7/20下午4:38
 */
@Service
public class RoleService {

    @Autowired
    private RoleMapper roleMapper;

    public List<Role> queryAll() {
        return roleMapper.queryAll();
    }
}

5.4 在controller包下站辉,新建一個(gè)RoleController類(lèi):

package com.demo.controller;

import com.demo.domain.Role;
import com.demo.service.RoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

/**
 * @author xiaozhao
 * @date 2018/8/6上午10:30
 */
@Controller
@RequestMapping("/role")
public class RoleController {
    @Autowired
    private RoleService roleService;

    @RequestMapping("/list")
    @ResponseBody
    public List<Role> findAll() {
        return roleService.queryAll();
    }
}

6、建立對(duì)應(yīng)的查詢語(yǔ)句
在resources文件夾下新建一個(gè)mapper文件夾损姜,然后在此文件夾下新建一個(gè)RoleMapper.xml文件:

  <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--namespace 這里不是實(shí)體類(lèi)名稱(chēng)饰剥,而是映射接口的全路徑!4菰摹汰蓉!-->
<mapper namespace="com.demo.dao.RoleMapper">
    <resultMap id="RoleResult" type="com.demo.domain.Role">
        <id column="id" jdbcType="INTEGER" property="id"/>
        <result column="name" jdbcType="VARCHAR" property="name"/>
    </resultMap>

    <select id="queryAll" resultMap="RoleResult">
        SELECT id,name from role
    </select>
</mapper>

7、運(yùn)行后在地址欄輸入:http://localhost:8080/role/list

image.png

8棒卷、數(shù)據(jù)庫(kù)內(nèi)容

image.png

9顾孽、一些說(shuō)明

配置文件中出現(xiàn)了包名的地方,都要和自己項(xiàng)目中的包名一致比规。

具體代碼參考:https://github.com/xiaozhaowen/ssmstart

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末若厚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蜒什,更是在濱河造成了極大的恐慌测秸,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異霎冯,居然都是意外死亡铃拇,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)肃晚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)锚贱,“玉大人,你說(shuō)我怎么就攤上這事关串。” “怎么了监徘?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵晋修,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我凰盔,道長(zhǎng)墓卦,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任户敬,我火速辦了婚禮落剪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘尿庐。我一直安慰自己忠怖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布抄瑟。 她就那樣靜靜地躺著凡泣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪皮假。 梳的紋絲不亂的頭發(fā)上鞋拟,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音惹资,去河邊找鬼贺纲。 笑死,一個(gè)胖子當(dāng)著我的面吹牛褪测,可吹牛的內(nèi)容都是我干的猴誊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼汰扭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼稠肘!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起萝毛,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤项阴,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體环揽,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡略荡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了歉胶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汛兜。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖通今,靈堂內(nèi)的尸體忽然破棺而出粥谬,到底是詐尸還是另有隱情,我是刑警寧澤辫塌,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布漏策,位于F島的核電站,受9級(jí)特大地震影響臼氨,放射性物質(zhì)發(fā)生泄漏掺喻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一储矩、第九天 我趴在偏房一處隱蔽的房頂上張望感耙。 院中可真熱鬧,春花似錦持隧、人聲如沸即硼。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)谦絮。三九已至,卻和暖如春洁仗,著一層夾襖步出監(jiān)牢的瞬間层皱,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工赠潦, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叫胖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓她奥,卻偏偏與公主長(zhǎng)得像瓮增,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子哩俭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355