[Spring 05] Mybatis-spring整合 事务支持
Spring_05 Mybatis-Spring
6. Mabatis-Spring
1. 环境搭建:
数据库: Mybatis.user(id int(20), name varchar(30), pwd varchar(30))
pojo类: User @Data
核心配置:mybatis-config.xml,
UserMapper接口, UserMapper.xml实现类, 测试类(读配置文件,连接数据库,openSession()等等)
2. Spring整合Mybatis的方法一:注册SqlSessionTemplate的bean
- 原有的mybatis-config.xml:
环境:四个属性;mappers:映射接口的实现类UserMapper.xml的位置
保留: AliasType别名管理、Setting设置管理,其他的都放置到Spring-dao.xml配置中。
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/roy/mapper/UserMapper.xml"/>
</mappers>
- 改变为: spring-dao.xml(本质是一个Spring的配置文件),可以注册Beans
其中,需要注册:数据源的类, SqlSessionFactory的类(可以连接mybatis-config.xml的地方), SqlSessionTemplate的类(以前的SqlSession)
<?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: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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 获取DataSource-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<!-- 获取SqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 此处可以防止mybatis-config中的各种配置: 如把配置连接过来、取别名,注册Mappers等-->
<!-- 通常情况下,在mybatis-config中留下别名管理和设置管理,其他的都写在这个配置文件中-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="mapperLocations" value="classpath:com/roy/mapper/*.xml"/>
</bean>
<!-- 获取SqlSession, spring中,用SqlSessionTemplate对象获取-->
<!-- 这个类中没有setter方法,只能用constructor-args注入-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactory"/>
</bean>
</beans>
-
添加一个UserMapperImpl.java实现类:
原因: 这个类需要在Spring的配置文件中注册bean,所以必须要有对应的实现类,
同时,要使用set注入,所以要添加一个SqlSessionTemplate私有属性和set方法。
public class UserMapperImpl implements UserMapper{
private SqlSessionTemplate sqlSessionTemplate;
public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
this.sqlSessionTemplate = sqlSessionTemplate;
}
public List<User> getUser() {
UserMapper mapper = sqlSessionTemplate.getMapper(UserMapper.class);
return mapper.getUser();
}
}
- 添加一个applicationContext.xml配置文件,把之前的spring-dao.xml文件导入,实现数据库管理和dao层bean管理的分离
<?xml version="1.0" encoding="UTF-8"?>
<beans Spring头文件>
<import resource="spring-dao.xml"/>
<bean id="userMapperImpl" class="com.roy.mapper.UserMapperImpl">
<property name="sqlSessionTemplate" ref="sqlSession"/>
</bean>
</beans>
- 测试类(相当于service层的调用)
@Test
public void test() throws IOException {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserMapper userMapperImpl = context.getBean("userMapperImpl", UserMapper.class);
for (User user : userMapperImpl.getUser()) {
System.out.println(user);
}
}
3. Spring整合Mybatis的方法二:实现类继承SqlSessionDaoSupport并实现原有接口
实现的UserMapper.java:
public class UserMapperImpl extends SqlSessionDaoSupport implements UserMapper{
public List<User> getUser() {
SqlSession sqlSession = getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
return mapper.getUser();
}
}
applicationContext.xml注册文件为: (注入的为: SSFactory, 不用写SqlSessionTemplate)
<bean id="userMapperImpl" class="com.roy.mapper.UserMapperImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
4. 流程:
流程:
- pom.xml: 依赖_(junit, spring-webmvc,数据库的: mysql-connector-java, mybatis, spring-jdbc, mybatis-spring, aspectjweaver), 配置build使java文件夹下的xml文件可以正常编译
- mybatis-config.xml配置typealias,setting;(mybatis的头文件)
- spring-mybatis.xml配置datasource, SqlSessionFactory(包括接入mybatis-config.xml的配置)(Spring头文件)
- applicationContext.xml, import配置文件spring-mybatis.xml; 管理注册的bean(Spring头文件)
- pojo, UserMapper接口,UserMapper.xml(mybatis头文件)
- UserMapper类,继承SqlSessionDaoSupport类并实现UserMapper接口,注入SqlSessionFactory,或 只实现接口但注入时用SqlSessionTemplate。(对应上述两种方式)
- 在applicationContext.xml中注册UserMapping的bean
- 写测试类,CPX获取bean并执行
7. 声明式事务
两种方式:
- AOP声明式事务
- 编程式事务
1的步骤:
- 配置一个声明式事务,id, class为固定的DataSourceTransactionManager,是用有参构造注入
- 配置一个事务通知,相当于AOP中写一个Aspect和其中的Advice
- 配置切面位置(使得某个方法为事务方法)
<!--配置声明式事务(官网)-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<constructor-arg ref="dataSource" />
</bean>
<!--配置事务通知(类似于在aop中写一个aspect和advice-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- 配置事务切入点-->
<aop:config>
<aop:pointcut id="txPointCut" expression="execution(* com.roy.mapper.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
</aop:config>