SSM(SpringMVC+Spring+MyBatis)初步的整合
SSM(SpringMVC+Spring+MyBatis)初步的整合
SpringMVC:MVC的解耦
Spring:IOC,AOP
MyBaits:ORM (MyBaits不是ORM框架)
前端:MVVM
3者是一个完美的结合体,但是整合的时候有点啰嗦,不过不影响写代码。
为了简化这个整合的复杂过程,有3种办法。
1、 多练(老师推荐)【效果:自由切换,不需要看任何笔记】
2、 复制粘贴
3、 可以采用Spring boot 【近年来有上升的趋势】
现阶段:SSH(Struts2+Spring+Hibernate)以SSM(SpringMVC+Spring+MyBatis)为主
一、创建项目(小公司有可能不划分module,甚至不使用maven,直接Eclipse)
1.通过maven创建一个根层项目(root),名字自定义,把根层src目录删除。
2.创建5个module(entity,dao,service,action、web-view默认打成jar包)
web-view(放前端页面以及打成war包,依赖上面4个模块,最后war文件是交付给客户),把src删除
3.添加module之间的依赖
dao——>entity
service——>dao,entity
action——>entity,servicde
web-view——>entity,dao,servicce,action
4.配置web-view打成war包
a、在web-view层下的POM.XML中添加 <packaging>war</packaging>
b、建立2个目录:
webapp/WEB-INF
resources
把web.xml文件复制到webapp/WEB-INF下
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<!--这是springmvc的配置-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--这是spring的配置-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- Spring监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
c、web-view层下的POM.XML中添加
<build>
<resources>
<resource>
<directory>resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<webResources>
<resource>
<directory>webapp</directory>
</resource>
</webResources>
</configuration>
</plugin>
</plugins>
</build>
二、配置Maven第三方依赖包

<properties>
<spring-version>5.1.0.RELEASE</spring-version>
<jackson-version>2.9.7</jackson-version>
<jstl-version>1.2</jstl-version>
<mybatis-version>3.4.6</mybatis-version>
<mybatis-spring-version>1.3.2</mybatis-spring-version>
<c3p0-version>0.9.5.2</c3p0-version>
<mysql-version>8.0.12</mysql-version>
<aopalliance-version>1.0</aopalliance-version>
<aspectj-version>1.9.1</aspectj-version>
</properties>
Spring包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring-version}</version>
</dependency>
Spring项目中融合需要的东西
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring-version}</version>
</dependency>
Spring AOP
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>${aopalliance-version}</version>
</dependency>
Aspectj 框架的2个核心包,JDK扩展,织入的支持
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj-version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj-version}</version>
</dependency>
SpringMVC中,ResponseBody时要用到的默认的JSON解析引擎
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson-version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson-version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson-version}</version>
</dependency>
Spring MVC包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring-version}</version>
</dependency>
JSP的JSTL依赖,如果没有可以不写
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>${jstl-version}</version>
</dependency>
MyBatis的依赖包
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis-version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring-version}</version>
</dependency>
1.MyBatis的SqlSession提供指定的方法来处理编程式的事务(手动写commit或rollback等代码)
2.但当使用mybatis-spring这个组件时,bean会使用Spring管理的SqlSession。
Spring通常都是处理事务(不用程序员来写commit)
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>${c3p0-version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-version}</version>
</dependency>
三、配置SSM
1、 配置jdbc.properties
在war包中module(web-view-module)的resources目录,添加jdbc.properties
mysql配置
jdbc.driverClassName=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/batis?serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true jdbc.username=root jdbc.password=123456
oracle配置
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver jdbc.url=jdbc:oracle:thin:@192.168.88.3:1521:orcl jdbc.username=oa jdbc.password=123456
2、 配置Spring的配置文件applicationContext.xml(包含融入mybatis相关内容)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" 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/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 自动扫描 --> <context:component-scan base-package="com.youyou" /> <!-- 引入配置文件,spring2.5以后的写法,之前的是bean class=org.springframework.beans.factory.config.PropertyPlaceholderConfigurer --> <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder> <!--配置C3P0 dataSource--> <bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driverClassName}"></property> <property name="jdbcUrl" value="${jdbc.url}"></property> <property name="user" value="${jdbc.username}"></property> <property name="password" value="${jdbc.password}"></property> <!-- 连接池中保留的最小连接数,默认为:3 --> <property name="minPoolSize" value="3" /> <!-- 连接池中保留的最大连接数。默认值: 15 --> <property name="maxPoolSize" value="15" /> <!-- 初始化连接池中的连接数,取值应在minPoolSize与maxPoolSize之间,默认为3 --> <property name="initialPoolSize" value="3"/> </bean> <!-- 此处,SqlSessionFactory以及MapperScannerConfigurer就是书本12.4章的内容 作用:实现书本第3章代码,一行都不用写,直接生成dao的实现类,不用任何编码 也不需要写一行mybatis的代码。 ps.这就是依赖于spring神的帮助 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="myDataSource"></property> <property name="mapperLocations" value="classpath*:mapper/*.xml"></property> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!--扫描dao层的接口interface--> <property name="basePackage" value="com.youyou.dao" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> </bean> <!--mapper xml文件就像实现类,它是怎么知道对应哪个dao层的接口的?--> <!--声明式事务管理--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="myDataSource" /> </bean> <tx:annotation-driven transaction-manager="transactionManager"/> </beans>
在war包中module(web-view-module)的resources目录,添加applicationContext.xml
- 配置自动扫描<context:component-scan>
- 配置引入jdbc.properties文件(context:property-placeholder)
- 配置c3p0的DataSource
- 配置sqlSessionFactory
- 配置MapperScannerConfigurer
- 配置transactionManager
- 配置<tx:annotation-driven>实现使用注解来执行事务
补充说明:在老项目中,可能见到aop的方式处理事务,这种方法已经不流行。但大家还是要看懂。
3、 配置SpringMVC的配置文件springmvc.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" xmlns:aop="http://www.springframework.org/schema/aop" 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 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <context:component-scan base-package="com.youyou"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" /> </context:component-scan> <!--mvc:annotation-driven 是告诉springmvc需要解析:@ResponseBody--> <!--如果使用jackson,可以不写里面的bean,因为是默认--> <mvc:annotation-driven></mvc:annotation-driven> <mvc:resources mapping="/img/*.*" location="/img/"/> <!-- 自动创建代理植入切面工作--> <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy> <!--<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">--> <!--<property name="prefix" value="/WEB-INF/jsp/"></property>--> <!--<property name="suffix" value=".jsp"></property>--> <!--</bean>--> </beans>
在war包中module(web-view-module)的resources目录,添加springmvc.xml
a. 配置自动扫描包<context:component-scan>
添加一个
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Service" />
否则@Transactional不会回滚
b. 配置注解驱动<mvc:annotation-driven> (@ResponseBody需要用上)
默认使用jackson
c. 配置试图解释器<bean class=”… InternalResourceViewResolver”>
d. 配置AOP:<aop:aspectj-autoproxy/>
4、 配置web容器一启动,就启动SpringMVC
在web.xml添加1个Servelt(DispatcherServlet,关联上springmvc.xml)
启动tomcat可以见到这一句话:
initServletBean FrameworkServlet 'springmvc': initialization started
5、 配置web容器一启动, 就启动Spring。
- 配置<context-param>contextConfigLocation定义applicationContext.xml
- 配置一个ContextLoaderListener(就是WebApplicationContext)
四、编码
1、编写实体类(entity)
-
实体类的属性要跟数据库表的字段要一一对应。(详细的对应在Mapper.xml描述)
-
一对多的关系(主实体类中要定义从表实体的List)
private List<Book> bookList = new ArrayList();
一对一的关系(主实体类中定义一个从表的属性)
private Notebook notebook;
2、编写Dao层的类(dao),此层只做数据库读和写,不参与任何的业务逻辑
- 根据实体类的名字,写一个接口(interface)StudentMapper,记录有多少个操作数据库的方法,例如getAll…,getXxxById,getXxxByName,queryXxxFor..,非常注意返回的类型到底是1个实体,还是多个实体
- 编写XxxMapper.xml
- 注意:<mapper namespace="com.nf.dao.StudentMapper">
- 这个namespace就是上一步的接口
- 在mapper文件中,每一个id项,就是对应接口的方法名
- 特别说明:Dao层实现是不需要手动写代码,12.4章中的mybatis-spring中的.MapperScannerConfigurer会自动读取XxxMapper.xml和对应的接口(interface),在内存中自动创建一个实现类,并且new一个实例,放在ioc容器中,等待service的@Autowired接收。
- 编写Service层代码
-
新建一个接口(interface),例如:StudentService,定义好各个方法(根据需求)。
- 新建一个接口的实现类StudentServiceImpl,实现接口所有的方法。注意,还需要在StudentServiceImpl实现类中写一个注解@Service,把这个组件申明托管在ioc容器中。
- 而且每个包含事务的方法,前面要添加一个@Transactional
- 在Service实现类,如果要取数据库数据,绝对不能直接访问数据库,只可以调用dao层来间接访问。2行代码。声明一个dao层的实例
- private StudentMapper studentMapper;
第2行@Autowired
- 编写Action层代码
- 此层不用写接口,直接创建一个普通的java类,不用继承任何东西(struts的Action要继承ActionSupport),显得SpringMVC简单很多,就是一个普普通通的java类。
- 在Action前添加一个注解@Controller
- 编写我们响应方法
(方法1:返回jsp界面,方法返回类型是String,return jsp文件名)
(方法2:返回JSON数据,没有界面,添加一个@ResponseBody注解)
5.如果前后端分离,开始前端。

浙公网安备 33010602011771号