SpringBoot 整合 MyBatis 及引入事务
2018-03-29 19:38
429 查看
1、导入需要的包 <!--mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>RELEASE</version>
</dependency>
<!--mapper -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>RELEASE</version>
</dependency>
<!--pagehelper (分页插件)-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>RELEASE</version>
</dependency>
2、在 application.properties 中配置相关属性############################################################
#
# mybatis 配置
#
############################################################
# mybatis 配置
mybatis.type-aliases-package=com.zzq.pojo
mybatis.mapper-locations=classpath:mapper/*.xml
# 通用 Mapper 配置
mapper.mappers=com.zzq.utils.MyMapper
mapper.not-empty=false
mapper.identity=MYSQL
# 分页插件配置
pagehelper.helperDialect=mysql
pagehelper.reasonable=true
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql3、在启动类中加扫描
4、通用 mapper
5、建立 mapper 继承通用Mapper
也可使用自定义的 Mapper 自己书写 sql 语句
自定义的 mapper 对应的 xml 文件<?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="com.zzq.mapper.SysUserMapperCustom" >
<!-- 查询简单的用户信息 -->
<select id="queryUserSimplyInfoById" resultType="com.zzq.entity.SysUser"
parameterType="java.lang.String" >
select
*
from
sys_user
where
id = #{id,jdbcType=VARCHAR}
</select>
</mapper>6、ServiceImpl
注:
1 关于propagation属性的7个传播行为
REQUIRED:指定当前方法必需在事务环境中运行,如果当前有事务环境就加入当前正在执行的事务环境,如果当前没有事务,就新建一个事务。这是默认值。
SUPPORTS:指定当前方法加入当前事务环境,如果当前没有事务,就以非事务方式执行。
MANDATORY:指定当前方法必须加入当前事务环境,如果当前没有事务,就抛出异常。
REQUIRES_NEW:指定当前方法总是会为自己发起一个新的事务,如果发现当前方法已运行在一个事务中,则原有事务被挂起,自己创建一个属于自己的事务,
一直我自己这个方法commit结束,原先的事务才会恢复执行。
NOT_SUPPORTED:指定当前方法以非事务方式执行操作,如果当前存在事务,就把当前事务挂起,等我以非事务的状态运行完,再继续原来的事务。
NEVER:指定当前方法绝对不能在事务范围内执行,如果方法在某个事务范围内执行,容器就抛异常,只有没关联到事务,才正常执行。
NESTED:指定当前方法执行时, 如果已经有一个事务存在,则运行在这个嵌套的事务中.如果当前环境没有运行的事务,就新建一个事务,
并与父事务相互独立,这个事务拥有多个可以回滚的保证点。就是指我自己内部事务回滚不会对外部事务造成影响,只对DataSourceTransactionManager事务管理器起效。
SpringBoot 常用技术整合项目 github 地址:https://github.com/EERINESS/springboot-integration
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>RELEASE</version>
</dependency>
<!--mapper -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>RELEASE</version>
</dependency>
<!--pagehelper (分页插件)-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>RELEASE</version>
</dependency>
2、在 application.properties 中配置相关属性############################################################
#
# mybatis 配置
#
############################################################
# mybatis 配置
mybatis.type-aliases-package=com.zzq.pojo
mybatis.mapper-locations=classpath:mapper/*.xml
# 通用 Mapper 配置
mapper.mappers=com.zzq.utils.MyMapper
mapper.not-empty=false
mapper.identity=MYSQL
# 分页插件配置
pagehelper.helperDialect=mysql
pagehelper.reasonable=true
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql3、在启动类中加扫描
4、通用 mapper
5、建立 mapper 继承通用Mapper
也可使用自定义的 Mapper 自己书写 sql 语句
自定义的 mapper 对应的 xml 文件<?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="com.zzq.mapper.SysUserMapperCustom" >
<!-- 查询简单的用户信息 -->
<select id="queryUserSimplyInfoById" resultType="com.zzq.entity.SysUser"
parameterType="java.lang.String" >
select
*
from
sys_user
where
id = #{id,jdbcType=VARCHAR}
</select>
</mapper>6、ServiceImpl
package com.zzq.service.impl; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.thymeleaf.util.StringUtils; import com.github.pagehelper.PageHelper; import com.zzq.mapper.SysUserMapper; import com.zzq.mapper.SysUserMapperCustom; import com.zzq.entity.SysUser; import com.zzq.service.UserService; import tk.mybatis.mapper.entity.Example; @Service public class UserServiceImpl implements UserService { @Autowired private SysUserMapper userMapper; @Autowired private SysUserMapperCustom userMapperCustom; //支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 @Override @Transactional(propagation = Propagation.REQUIRED) public void saveUser(SysUser user) throws Exception { userMapper.insert(user); } @Override @Transactional(propagation = Propagation.REQUIRED) public void updateUser(SysUser user) { /** * 1、使用 updateByPrimaryKey 方法当你传的对象的字段并没有全部赋值时,它会将数据库中你 * 没有赋值的字段值全部设置为 null * 2、updateByPrimaryKeySelective 不会 */ // userMapper.updateByPrimaryKey(user); userMapper.updateByPrimaryKeySelective(user); } @Override @Transactional(propagation = Propagation.REQUIRED) public void deleteUser(String userId) { userMapper.deleteByPrimaryKey(userId); } //支持当前事务,如果当前没有事务,就以非事务方式执行。 @Override @Transactional(propagation = Propagation.SUPPORTS) public SysUser queryUserById(String userId) { return userMapper.selectByPrimaryKey(userId); } @Override @Transactional(propagation = Propagation.SUPPORTS) public List<SysUser> queryUserList(SysUser user) { Example example = new Example(SysUser.class); Example.Criteria criteria = example.createCriteria(); if (!StringUtils.isEmptyOrWhitespace(user.getUsername())) { // criteria.andEqualTo("username", user.getUsername()); criteria.andLike("username", "%" + user.getUsername() + "%"); } if (!StringUtils.isEmptyOrWhitespace(user.getNickname())) { criteria.andLike("nickname", "%" + user.getNickname() + "%"); } List<SysUser> userList = userMapper.selectByExample(example); return userList; } @Override @Transactional(propagation = Propagation.SUPPORTS) public List<SysUser> queryUserListPaged(SysUser user, Integer page, Integer pageSize) { // 开始分页(参数:当前页数、每页行数) PageHelper.startPage(page, pageSize); Example example = new Example(SysUser.class); Example.Criteria criteria = example.createCriteria(); if (!StringUtils.isEmptyOrWhitespace(user.getNickname())) { criteria.andLike("nickname", "%" + user.getNickname() + "%"); } example.orderBy("registTime").asc(); List<SysUser> userList = userMapper.selectByExample(example); return userList; } @Override @Transactional(propagation = Propagation.SUPPORTS) public SysUser queryUserByIdCustom(String userId) { List<SysUser> userList = userMapperCustom.queryUserSimplyInfoById(userId); if (userList != null && !userList.isEmpty()) { return (SysUser)userList.get(0); } return null; } @Override @Transactional(propagation = Propagation.REQUIRED) public void saveUserTransactional(SysUser user) { userMapper.insert(user); int a = 1 / 0; user.setIsDelete(1); userMapper.updateByPrimaryKeySelective(user); } }
注:
1 关于propagation属性的7个传播行为
REQUIRED:指定当前方法必需在事务环境中运行,如果当前有事务环境就加入当前正在执行的事务环境,如果当前没有事务,就新建一个事务。这是默认值。
SUPPORTS:指定当前方法加入当前事务环境,如果当前没有事务,就以非事务方式执行。
MANDATORY:指定当前方法必须加入当前事务环境,如果当前没有事务,就抛出异常。
REQUIRES_NEW:指定当前方法总是会为自己发起一个新的事务,如果发现当前方法已运行在一个事务中,则原有事务被挂起,自己创建一个属于自己的事务,
一直我自己这个方法commit结束,原先的事务才会恢复执行。
NOT_SUPPORTED:指定当前方法以非事务方式执行操作,如果当前存在事务,就把当前事务挂起,等我以非事务的状态运行完,再继续原来的事务。
NEVER:指定当前方法绝对不能在事务范围内执行,如果方法在某个事务范围内执行,容器就抛异常,只有没关联到事务,才正常执行。
NESTED:指定当前方法执行时, 如果已经有一个事务存在,则运行在这个嵌套的事务中.如果当前环境没有运行的事务,就新建一个事务,
并与父事务相互独立,这个事务拥有多个可以回滚的保证点。就是指我自己内部事务回滚不会对外部事务造成影响,只对DataSourceTransactionManager事务管理器起效。
SpringBoot 常用技术整合项目 github 地址:https://github.com/EERINESS/springboot-integration
相关文章推荐
- SpringBoot系列七:SpringBoot 整合 MyBatis(配置 druid 数据源、配置 MyBatis、事务控制、druid 监控)
- spring和mybatis整合进行事务管理
- springboot整合mybatis mapper注入时显示could not autowire的解决
- MyBatis整合Spring的Transaction事务处理
- spirng整合mybatis的事务(接口开发配置)
- spring整合 mybatis 事务管理不生效原因
- SpringMVC+Spring+Mybatis整合,使用druid连接池,声明式事务,maven配置
- spring与mybatis整合及事务控制
- springboot 整合mybatis 遇到的问题
- spring mvc与mybatis事务整合
- SpringBoot学习:Hibernate,Mybatis分别与Springboot的整合
- SpringBoot--整合Mybatis和Redis
- mybatis与spring整合事务管理
- SpringBoot整合mybatis,shiro,redisjiyushujuku细粒度动态权限管理
- springboot、mybatis、thymeleaf、bootstrap整合框架
- spring整合 mybatis 事务管理不生效原因
- [置顶] SpringBoot整合CXF,实现Restful api 与 WebService api dao层使用Mybatis
- Spring + mvc,Mybatis整合 (含事务配置,分页功能)
- Spring 与 mybatis整合---事务管理
- maven+springMVC+mysql+mybatis+velocity+事务整合