配置Spring事务的ACID原则
1.实体类
package com.hui.dao;
import com.hui.pojo.User;
import java.util.List;
public interface UserMapper {
public List<User> selectUser();
public void addUser(User user);
}
2.配置映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hui.dao.UserMapper">
<select id="selectUser" resultType="user">
select * from mybatis.user
</select>
<insert id="addUser" parameterType="com.hui.pojo.User">
insert into user(id,name,pwd) value (#{id},#{name},#{pwd})
</insert>
</mapper>
3.实现类
package com.hui.dao;
import com.hui.pojo.User;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import java.util.List;
public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper {
public List<User> selectUser() {
//模拟事务的ACID准则 原子性 持久性 一致性
UserMapper mapper = getSqlSession().getMapper(UserMapper.class);
User user = new User(9,"阿里","2332423");
mapper.addUser(user);
return getSqlSession().getMapper(UserMapper.class).selectUser();
}
public void addUser(User user) {
getSqlSession().getMapper(UserMapper.class).addUser(user);
}
}
4.配置beans.xml
<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" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 其视spring整合mybatis后mybatis的config文件可以完全不要 因为spring已经可以完全
将其配置-->
<!-- 使用Spring 的数据源替换Mybatis的配置
我们这里使用Spring 的JDBC
DataSource-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSLL=true"></property>
<property name="username" value="root"></property>
<property name="password" value="2811085093"></property>
</bean>
<!-- 1.sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<!-- 绑定mybatis配置文件 将mybatis的配置文件连起来-->
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<!-- 也可以注册映射器-->
<property name="mapperLocations" value="classpath:com/hui/dao/*.xml"></property>
</bean>
<!-- 获取sqlsesion对象 利用SqlSessionTemplate(模板)进行创建 就是我们说的sqlsession一样的-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"></constructor-arg>
</bean>
<!-- 实现spring的事务管理-->
<!-- 配置声明式事务 结合AOP-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 结合AOP实现事务的织入-->
<!-- 配置事务通知 先导入顶部约束-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!-- 给哪些方法配置事务-->
<!-- 配置事务的传播特性-->
<tx:attributes>
<tx:method name="selectUser" propagation="REQUIRED"/>
<!-- 为所有方法配置事务-->
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
<!-- -->
</tx:advice>
<!-- 配置事务的切入点-->
<aop:config>
<!-- 首先定义切入点 执行在 dao接口下面的所有类 所有方法 无论多少个参数-->
<!-- 也就是说 dao下的所有方法 都会编制上这个事务 -->
<aop:pointcut id="txPointCut" expression="execution(* com.hui.dao.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"></aop:advisor>
</aop:config>
</beans>
测试
@Test
public void test() throws IOException {
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
UserMapper userMapper = (UserMapper) context.getBean("userMapper2");
List<User> users = userMapper.selectUser();
for (User user : users) {
System.out.println(user);
}
}