您的位置:首页 > 编程语言 > Java开发

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
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: