SpringBoot 整合 MyBatis 及引入事务

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=countSql

3、在启动类中加扫描


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
       *     2updateByPrimaryKeySelective 不会
       */
//    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


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值