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.如果前后端分离,开始前端。