ssm整合(一)整合步骤分析
1.前言
1.ssm整合,是指什么?
S(SpringMVC)S(Spring)M(Mybatis)
-
Spring SpringMVC Mybatis ,简称ssm
-
Spring整合SpringMVC
-
Spring整合Mybatis
2.整合的实现方案
-
注解 + XML 【推荐】
注解: 自定义的类(dao、service)
XML: jar包中的类(DataSource,DataSourceTransactionManager)
-
纯XML
-
纯注解
3. 整合流程
-
Spring整合SpringMVC
-
Spring整合Mybatis**[ssm整合完成]**
2. spring整合springmvc关键的步骤
<!--
spring整合springmvc存在的问题:
tomcat在启动的时候首先就会加载web.xml文件,但是在web.xml文件上
并没有加载applicationContext文件,所以导致service层的对象没有得到创建
我们的目标:tomcat服务器启动的时候需要加载applicationContext的文件。
解决方案: tomcat服务器启动的时候会为每一个web应用创建一个ServerContext对象。
我们可以利用ServletContext的监听器去加载。
-->
-
在web.xml文件上创建一个监听器: ContextLoaderListener 用于加载applicationContext.xml
-
配置一个context-param的参数
<!-- 配置Spring提供的监听器,用于加载applicationContext.xml --> <!-- 注意:加载文件的路径问题 1)默认会加载WEB-INF目录下applicationContext.xml 2)想修改加载文件的路径,通过contextConfigLocation参数进行修改 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
3.Spring整合Mybatis环境、测试 [重要]
spring整合mybatis最核心是什么?
- 把sqlMapConfig.xml配置的参数迁移applicationContext文件中。配置:applicationContext.xml
- 配置数据源
- 配置SqlSessionFactory工程对象,把mybatis创建Dao接口代理对象,交给Spring管理
- 包扫描.
01 单独测试mybatis环境
/**
* 单独测试mybatis环境
*/
public class Test_MyBatis {
@Test
public void testFindAll() throws IOException {
//1.加载SqlMapConfig.xml
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.创建SqlSession对象
SqlSession sqlSession = factory.openSession();
//4.生成Dao接口代理
AccountDao accountDao = sqlSession.getMapper(AccountDao.class);
//5.调用Dao方法
System.out.println(accountDao.findAll());
//6.关闭资源
sqlSession.close();
in.close();
}
}
02 applicationContext.xml
<!--开启包扫描-->
<context:component-scan base-package="com.itheima.service"/>
<!--加载配置文件-->
<context:property-placeholder location="classpath:db2.properties"/>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--创建SqlSessionFactory对象,因为每一个dao的代理对象都需要从SqlSession中获取,每一个SqlSession又必须从SqlSessionFactory中产生。-->
<bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--创建一个对象进行包扫描, 扫描mybatis-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.itheima.dao"/>
</bean>
4.SSM完整的配置
1 db2.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///db1
jdbc.username=root
jdbc.password=abc123
2 applicationContext.xml
<description>Spring整合MyBatis配置</description>
<!--1. 扫描service包-->
<!--开启包扫描-->
<context:component-scan base-package="cn.itcast.service"/>
<!--加载配置文件-->
<context:property-placeholder location="classpath:db2.properties"/>
<!--2. 创建连接池-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/saas-export?characterEncoding=utf8"/>
<property name="user" value="root"/>
<property name="password" value="root"/>
</bean>
<!--3. Spring整合MyBatis配置(1)创建SqlSessionFactoryBean对象-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!--A.注入数据源-->
<property name="dataSource" ref="dataSource"/>
<!--
<property name="typeAliasesPackage" value="扫描包,配置别名"/>
<property name="configLocation" value="配置SqlMapConfig.xml"/>
<property name="mapperLocations" value="配置加载的映射文件"/>
-->
</bean>
<!--4. Spring整合MyBatis配置(2)创建映射扫描配置-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--A. 自动加载该路径下的Mapper映射文件-->
<!--B. 自动加载该路径下的dao接口文件(读取方法上的注解)-->
<!--C. 自动对包下的所有接口生成代理对象-->
<property name="basePackage" value="cn.itcast.dao"/>
</bean>
<!-- Spring声明式事务 -->
<!-- 1.事务管理器 封装事务管理代码 commit,rollbac-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--5.2 开启事务注解支持 等于下面2和3 需要在对应方法和实现类(service层) 加上@Transactional
<tx:annotation-driven transaction-manager="transactionManager"/>
-->
<!-- 2.事务通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!-- 事务特性 -->
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" isolation="DEFAULT"/>
</tx:attributes>
</tx:advice>
<!-- 3.事务切面 = 通知+切入点 -->
<aop:config>
<!-- 3.1 切入点 -->
<aop:pointcut id="pt" expression="execution(* com.itheima.service.*ServiceImpl.*(..))"/>
<!-- 3.2 通知+切入点 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/>
</aop:config>
3 springmvc.xml
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--开启注解扫描-->
<context:component-scan base-package="com.itheima.web"/>
<!--3. 开启注解驱动(自动创建处理器映射器、处理器适配器、类型转换器)-->
<!--RequestMappingHandlerMapping、RequestMappingHandlerAdapter-->
<mvc:annotation-driven/>
4 web.xml
<!--1. 【servlet】SpringMVC前端控制器-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--加载springmvc的配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!--注意写斜杠要放行静态资源-->
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--2. 【filter】SpringMVC编码过滤器-->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--
spring整合springmvc存在的问题:
tomcat在启动的时候首先就会加载web.xml文件,但是在web.xml文件上
并没有加载applicationContext文件,所以导致service层的对象没有得到创建
我们的目标:tomcat服务器启动的时候需要加载applicationContext的文件。
解决方案: tomcat服务器启动的时候会为每一个web应用创建一个ServerContext对象。
我们可以利用ServletContext的监听器去加载。
-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>