Spring整合Mybatis(二)------增加事务管理(编程的方式)
来源:互联网 发布:new event js 编辑:程序博客网 时间:2024/06/06 00:50
前言
上一节介绍了Spring是如何整合Mybatis的,这一节是在此基础上结合Spring做事务管理。
讲解
我们将使用transactionManager方式做事务管理。
目录结构
源码
依旧从上到下依次介绍。
UserDaoImpl
这里我们增加了UserDaoImpl作为具体的执行有事务之间的隔离实现。并在原有的基础上增加了insertUser方法作为本次事务控制展示的方法。
package cn.ceres.architecture.integration.dao.impl;import cn.ceres.architecture.integration.dao.UserDao;import cn.ceres.architecture.integration.dao.model.User;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.support.SqlSessionDaoSupport;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.datasource.DataSourceTransactionManager;import org.springframework.stereotype.Repository;import org.springframework.transaction.TransactionDefinition;import org.springframework.transaction.TransactionStatus;import org.springframework.transaction.support.DefaultTransactionDefinition;import javax.annotation.Resource;@Repositorypublic class UserDaoImpl extends SqlSessionDaoSupport implements UserDao { @Autowired private DataSourceTransactionManager transactionManager; @Resource public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) { super.setSqlSessionFactory(sqlSessionFactory); } @Override public User getUser(Long id) { User user = this.getSqlSession().selectOne("cn.ceres.architecture.integration.dao.UserMapper.getUser", id); return user; } @Override public void insertUser(User user) { DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); TransactionStatus status = transactionManager.getTransaction(def); this.getSqlSession().insert("cn.ceres.architecture.integration.dao.UserMapper.insertUser", user); transactionManager.commit(status); }}
User
依旧是那个PoJo类,作为数据层的映射,做了一点点的改动就是将long改成了包装类型Long
package cn.ceres.architecture.integration.dao.model;public class User { private Long id; private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + '}'; }}
UserDao
这里我们增加了UserDao,作为接口方法的定义,具体实现参照UserDaoImpl
package cn.ceres.architecture.integration.dao;import cn.ceres.architecture.integration.dao.model.User;public interface UserDao { public User getUser(Long id); public void insertUser(User user);}
UserMapper
这个接口在这里已经不需要了,可以删除
UserMapper.xml
这里增加了insertUser的Sql实现
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="cn.ceres.architecture.integration.dao.UserMapper"> <resultMap id="userMap" type="cn.ceres.architecture.integration.dao.model.User"> <id column="id" property="id"/> <result column="name" property="name"/> </resultMap> <!-- 查询 此处如果多参数,建议使用Bean作为参数体--> <select id="getUser" parameterType="java.lang.Long" resultMap="userMap"> SELECT <include refid="QUERY_COLUMN_LIST"/> FROM <include refid="TABLE"/> WHERE id = #{id} </select> <!-- 查询 此处如果多参数,建议使用Bean作为参数体--> <insert id="insertUser" useGeneratedKeys="true" parameterType="cn.ceres.architecture.integration.dao.model.User"> INSERT INTO <include refid="TABLE"/> (`name`) VALUES (#{name}) </insert> <!-- 所有查询列 --> <sql id="QUERY_COLUMN_LIST"> <![CDATA[ `id`,`name` ]]> </sql> <!-- 表--> <sql id="TABLE"><![CDATA[ user ]]></sql> <!-- 全部条件(更多功能可以通过queryData扩展实现) --> <sql id="QUERY_WHERE_CLAUSE"> <where> <if test="id != null and id != ''"><![CDATA[AND `id` = #{id}]]></if> <if test="name != null and name != ''"><![CDATA[AND `name` = #{name}]]></if> </where> </sql> <!-- 智能排序与分页 --> <sql id="QUERY_ORDER_LIMIT_CONDITION"> <if test="orderField != null and orderField != '' and orderFieldType != null and orderFieldType != ''"><![CDATA[ORDER BY ${orderField} ${orderFieldType}]]></if> <if test="startIndex != null and startIndex >= 0 and pageSize != null and pageSize > 0"><![CDATA[LIMIT #{startIndex},#{pageSize}]]></if> </sql></mapper>
spring-config-dao.xml
这里不再使用MapperScannerConfigurer作代理,并且在sessionFactory内增加了mapperLocations属性节点,作为映射文件的扫描
<?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: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/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd" default-autowire="byName"> <!-- BoneCP configuration --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="user" value="${spring.datasource.username}"/> <property name="password" value="${spring.datasource.password}"/> <property name="jdbcUrl" value="${spring.datasource.url}"/> <property name="driverClass" value="${spring.datasource.driverClassName}"/> <property name="acquireIncrement" value="${spring.datasource.c3p0.acquireIncrement}"/> <property name="idleConnectionTestPeriod" value="${spring.datasource.c3p0.idleConnectionTestPeriod}"/> <property name="initialPoolSize" value="${spring.datasource.c3p0.initialPoolSize}"/> <property name="maxIdleTime" value="${spring.datasource.c3p0.maxIdleTime}"/> <property name="maxPoolSize" value="${spring.datasource.c3p0.maxPoolSize}"/> <property name="minPoolSize" value="${spring.datasource.c3p0.minPoolSize}"/> <!--增加 数据库库测试连接--> <!--<property name="automaticTestTable" value="c3p0_test"/>--> <!--<property name="testConnectionOnCheckin" value="true"/>--> <property name="preferredTestQuery" value=" select 1 "/> </bean> <tx:annotation-driven transaction-manager="transactionManager" /> <!-- Transaction Manager --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 启用事务注解 --> <bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="mapperLocations" value="classpath:cn/ceres/architecture/integration/dao/*Mapper.xml" /> <property name="dataSource" ref="dataSource"/> </bean> <!--自动查找类路径下的映射器并将它们自动装配--> <!--<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">--> <!--<property name="sqlSessionFactoryBeanName" value="sessionFactory" />--> <!--<property name="basePackage" value="cn.ceres.architecture.integration.dao"/>--> <!--</bean>--></beans>
application.properties
用于替换配置文件中的属性占位符
spring.datasource.driverClassName=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:28827/architecture_integration?characterEncoding=UTF-8spring.datasource.username=rootspring.datasource.password=passw0rdspring.datasource.c3p0.acquireIncrement=2spring.datasource.c3p0.idleConnectionTestPeriod=50spring.datasource.c3p0.initialPoolSize=5spring.datasource.c3p0.maxIdleTime=90spring.datasource.c3p0.maxPoolSize=3spring.datasource.c3p0.minPoolSize=1
总结
这一节使用的是编程的方式控制事务。
阅读全文
0 0
- Spring整合Mybatis(二)------增加事务管理(编程的方式)
- mybatis与spring整合(方式二)
- spring整合mybatis的事务管理
- Spring+SpringMVC+mybatis+easyui整合实例(二)注解方式的mybatis的使用
- Spring整合mybatis方式二
- (二)Mybatis整合Spring
- mybatis与spring整合事务管理
- spring mvc整合mybatis事务管理
- mybatis与spring整合事务管理
- mybatis与spring整合(方式一)
- Spring事务管理(二)
- Spring MVC+Mybatis 框架整合(二)
- 【Spring】(二)使用Spring进行事务管理的几种方式
- 学习Spring的事务管理(二)
- Mybatis源码(二)之Spring整合mybatis创建SqlSession
- spring、hibernate事务管理的区别及整合方式
- spring mvc+spring+mybatis+maven整合篇(二)
- (spring-mybatis-mysql整合)纯Java配置类配置事务管理
- 网络的七层协议
- springBoot 连接打包成jar包运行时,获取图片上传文件、前端页面等文件
- 初学Unity——Flappy Bird 开发实战
- Centos 6.5安装Tomcat (前提:已成功安装jdk)
- SAI零基础手绘入门教程
- Spring整合Mybatis(二)------增加事务管理(编程的方式)
- CentOS配置Google 动态认证,以及认证失败解决办法
- Linux下对lvm逻辑卷分区大小的调整(针对xfs和ext4不同文件系统)
- linux 查看用户的uid,gid
- 2.1.3 Sorting a Three-Valued Sequence 三值的排序
- Spark On Yarn 提交任务报错ERROR SparkContext: Error initializing SparkContext.
- 视觉SLAM资料
- python读写文件中文问题
- Request笔记