SpringBoot整合mybatis-plus
1.简单使用
创建一个SpringBoot项目,导入相应依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--json-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.51</version>
</dependency>
创建响应的数据库表
配置文件
spring:
datasource:
username: root
password: 3fa4d180
url: jdbc:mysql://localhost:3306/young?useSSL=false&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
global-config:
db-config:
logic-delete-field: flag
logic-delete-value: 1
logic-not-delete-value: 0
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper-locations: mapper/*
创建返回对象
ResultVO.java
public class ResultVO<T>{
private Integer code;
private String msg;
private T data;
public ResultVO(){
}
public ResultVO(Integer code, String msg){
this.code=code;
this.msg=msg;
}
public ResultVO(Integer code, String msg, T data){
this.code=code;
this.msg=msg;
this.data=data;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
返回对象工具类ResultVOUtil.java
public class ResultVOUtil {
public static ResultVO success(){
return new ResultVO<>(200,"操作成功");
}
public static ResultVO success(Object data){
return new ResultVO<>(200,"操作成功",data);
}
public static ResultVO error(Integer code, String msg){
return new ResultVO<>(code,msg);
}
}
实体类User.java
@AllArgsConstructor
@NoArgsConstructor
@Data
@TableName(value = "t_user")
public class User {
@TableId(type = IdType.AUTO)
private Integer id;
@TableField(value = "username")
private String username;
@TableField(value = "password")
private String password;
@TableField(value = "age")
private Integer age;
@TableField(value = "email")
private String email;
@TableField(value = "create_time")
private Date createTime;
@TableField(value = "update_time")
private Date updateTime;
@Version
private Integer version;
@TableLogic(value = "is_delete")
private Integer isDelete;
}
dao层,继承BaseMapper,因为MyBatis-plus 是在mybati的基础上进行修改的,所有也可以配置相应的xml文件
@Mapper
public interface UserMapper extends BaseMapper<User> {
List<User>getUserByUsername(String username);
}
UserMapper.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.young.demo06.dao.UserMapper">
<select id="getUserByUsername" parameterType="string" resultType="com.young.demo06.entity.User">
select *
from t_user
where username=#{username}
</select>
</mapper>
测试类
package com.young.demo06;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.young.demo06.dao.UserMapper;
import com.young.demo06.entity.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.*;
@SpringBootTest
class Demo06ApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void insertUser(){
User user=new User();
user.setUsername("陈晓扬" );
user.setPassword("123456");
user.setAge(21);
user.setVersion(0);
user.setIsDelete(0);
user.setEmail("2526262@qq.com");
user.setCreateTime(new Date());
user.setUpdateTime(new Date());
int a=userMapper.insert(user);
System.out.println("addNum:"+a);
}
@Test
public void updateUser(){
User user=userMapper.selectById(7);
user.setEmail("2827523200@qq.com");
int a=userMapper.updateById(user);
System.out.println("updateNum:"+a);
}
@Test
public void deleteUser(){
int a=userMapper.deleteById(7);
System.out.println("deleteNum:"+a);
}
@Test
public void selectAll(){
List<User>list=userMapper.selectList(null);
list.forEach(System.out::println);
}
@Test
public void selectByBatch(){
List<User>list=userMapper.selectBatchIds(Arrays.asList(1,2,3));
list.forEach(System.out::println);
}
@Test
public void selectUserByMap(){
Map<String,Object>map=new HashMap<>();
map.put("username","陈晓扬");
map.put("password","123456");
List<User>list=userMapper.selectByMap(map);
list.forEach(System.out::println);
}
@Test
public void selectByPage(){
Page<User>page=new Page<>(1,3);
userMapper.selectPage(page,null);
long total=page.getTotal();
System.out.println("total:"+total);
List<User>list=page.getRecords();
list.forEach(System.out::println);
}
@Test
public void test1(){
QueryWrapper<User> wrapper=new QueryWrapper<>();
wrapper.isNotNull("username")
.eq("email","2827523200@qq.com")
.ge("age",10);
userMapper.selectList(wrapper).forEach(System.out::println);
User user=userMapper.selectOne(wrapper);
System.out.println("user="+user);
}
@Test
public void test2(){
QueryWrapper<User>wrapper=new QueryWrapper<>();
wrapper.between("age",10,20);
Long count=userMapper.selectCount(wrapper);
System.out.println(count);
}
@Test
public void test3(){
QueryWrapper<User>wrapper=new QueryWrapper<>();
wrapper.like("username","dhi")
.notLike("username","cxy")
.likeRight("email","com")
.likeLeft("email","2");
System.out.println(userMapper.selectMaps(wrapper));
}
@Test
public void test4(){
QueryWrapper<User>wrapper=new QueryWrapper<>();
wrapper.orderByDesc("id");
wrapper.eq("is_delete",0);
userMapper.selectList(wrapper).forEach(System.out::println);
}
@Test
public void test5(){
QueryWrapper<User>wrapper=new QueryWrapper<>();
wrapper.groupBy("version").having("version=1");
userMapper.selectList(wrapper).forEach(System.out::println);
}
@Test
public void test6(){
List<User>userList=userMapper.getUserByUsername("cxy");
for(User user:userList) {
System.out.println(user);
}
}
@Test
void contextLoads() {
}
}
2.多表查询
新建几个表,如下
ResultVO.java
@Data
public class ResultVO <T>{
private Integer code;
private String msg;
private T data;
public ResultVO(){}
public ResultVO(Integer code,String msg){
this.code=code;
this.msg=msg;
this.data=null;
}
public ResultVO(Integer code,String msg,T data){
this.code=code;
this.msg=msg;
this.data=data;
}
}
ResultVOUtil
public class ResultVOUtil {
public static ResultVO success(){
return new ResultVO<>(200,"操作成功");
}
public static ResultVO success(Object data){
return new ResultVO<>(200,"操作成功",data);
}
public static ResultVO error(Integer code,String msg){
return new ResultVO<>(code,msg);
}
}
实体类
Role.java
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "t_role")
public class Role {
@TableId(type = IdType.AUTO)
private Integer id;
private String name;
}
User.java
@TableName(value = "t_user")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
@TableId(type = IdType.AUTO)
private Integer id;
private String username;
private String password;
@TableField(value = "create_time",fill= FieldFill.INSERT)
private Date createTime;
@TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
@Version
private Integer version;
@TableLogic
@TableField(value = "is_delete")
private Integer isDelete;
@TableField(exist = false)
private List<Role>roles;
}
mapper层
UserMapper.java
public interface UserMapper extends BaseMapper<User> {
User getUserById(Integer id);
Page<User> getUserList(IPage<User>iPage);
}
RoleMapper.java
public interface RoleMapper extends BaseMapper<Role> {
}
service层
UserService.java
public interface UserService {
ResultVO addUser(JSONObject jsonObject);
ResultVO getUserById(Integer id);
ResultVO getUserList(Integer pageNum,Integer pageSize);
}
UserServiceImpl.java
@Service
@Slf4j
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public ResultVO addUser(JSONObject jsonObject) {
try{
String username=jsonObject.getString("username");
String password=jsonObject.getString("password");
User user=new User();
user.setUsername(username);
user.setPassword(password);
int addNum=userMapper.insert(user);
if(addNum<=0){
return ResultVOUtil.error(500,"添加用户失败");
}else{
Map<String,Object>res=new HashMap<>();
res.put("addNum",addNum);
res.put("id",user.getId());
return ResultVOUtil.success(res);
}
}catch (Exception e){
log.error(e.getMessage());
return ResultVOUtil.error(500,"添加用户失败"+e.getMessage());
}
}
@Override
public ResultVO getUserById(Integer id) {
try{
User user=userMapper.getUserById(id);
return ResultVOUtil.success(user);
}catch (Exception e){
log.error(e.getMessage());
return ResultVOUtil.error(500,"获取用户详情失败"+e.getMessage());
}
}
@Override
public ResultVO getUserList(Integer pageNum, Integer pageSize) {
try{
Page<User>pages=new Page<>(pageNum,pageSize);
pages=userMapper.getUserList(pages);
List<User>list=pages.getRecords();
Long count=userMapper.selectCount(null);
Map<String,Object>res=new HashMap<>();
res.put("list",list);
res.put("count",count);
return ResultVOUtil.success(res);
}catch (Exception e){
log.error(e.getMessage());
return ResultVOUtil.error(500,"获取用户列表失败"+e.getMessage());
}
}
}
配置类
MyBatisPlusConfig.java
@Configuration
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor mybatisPlusInterceptor=new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return mybatisPlusInterceptor;
}
}
MyMetaObjectHandler.java
@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("-----createTime--------");
this.strictInsertFill(metaObject,"createTime", Date.class,new Date());
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("--------updateTime-------------");
this.strictUpdateFill(metaObject,"updateTime", Date.class,new Date());
}
}
控制类
UserController.java
@Slf4j
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value = "/getUserById",method= RequestMethod.GET)
public ResultVO getUserById(@RequestParam(value = "id",required = true)Integer id){
log.info("-------getUserById---------");
return userService.getUserById(id);
}
@RequestMapping(value = "/getUserList",method = RequestMethod.GET)
public ResultVO getUserList(@RequestParam(value = "pageNum",required = true)Integer pageNum,
@RequestParam(value = "pageSize",required = true)Integer pageSize){
log.info("------getUserList----------");
return userService.getUserList(pageNum,pageSize);
}
}
xml文件
UserMapper.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.young.demo13.mapper.UserMapper">
<resultMap id="userBean" type="com.young.demo13.entity.User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
<result property="createTime" column="create_time"/>
<result property="updateTime" column="update_time"/>
<result property="version" column="version"/>
<result property="isDelete" column="is_delete"/>
<collection property="roles" ofType="com.young.demo13.entity.Role">
<id property="id" column="rid"/>
<result property="name" column="name"/>
</collection>
</resultMap>
<select id="getUserById" parameterType="int" resultMap="userBean">
select u.*,r.id rid,r.name
from t_user u left join t_user_role ur
on u.id=ur.uid
left join t_role r
on r.id=ur.rid
where u.id=#{id} and u.is_delete=0
</select>
<select id="getUserList" resultMap="userBean">
select u.*,r.id rid,r.name
from t_user u left join t_user_role ur
on u.id=ur.uid
left join t_role r
on r.id=ur.rid
where u.is_delete=0
</select>
</mapper>
配置文件application.yml
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/young?useSSL=false&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
global-config:
db-config:
logic-not-delete-value: 0
logic-delete-value: 1
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
完整文件目录
添加一些数据
运行项目,测试
使用VO
UserRoleVO.java
@Data
public class UserRoleVO {
private Integer uid;
private String username;
private String password;
private Date createTime;
private Date updateTime;
private Integer isDelete;
private Integer version;
private Integer rid;
private String name;
}
修改UserMapper.java
public interface UserMapper extends BaseMapper<User> {
User getUserById(Integer id);
Page<User> getUserList(IPage<User>iPage);
Page<UserRoleVO>getUserRoleList(IPage<UserRoleVO>iPage);
}
修改UserService.java
public interface UserService {
ResultVO addUser(JSONObject jsonObject);
ResultVO getUserById(Integer id);
ResultVO getUserList(Integer pageNum,Integer pageSize);
ResultVO getUserRoleList(Integer pageNum,Integer pageSize);
}
修改UserServiceImpl.java
@Service
@Slf4j
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public ResultVO addUser(JSONObject jsonObject) {
try{
String username=jsonObject.getString("username");
String password=jsonObject.getString("password");
User user=new User();
user.setUsername(username);
user.setPassword(password);
int addNum=userMapper.insert(user);
if(addNum<=0){
return ResultVOUtil.error(500,"添加用户失败");
}else{
Map<String,Object>res=new HashMap<>();
res.put("addNum",addNum);
res.put("id",user.getId());
return ResultVOUtil.success(res);
}
}catch (Exception e){
log.error(e.getMessage());
return ResultVOUtil.error(500,"添加用户失败"+e.getMessage());
}
}
@Override
public ResultVO getUserById(Integer id) {
try{
User user=userMapper.getUserById(id);
return ResultVOUtil.success(user);
}catch (Exception e){
log.error(e.getMessage());
return ResultVOUtil.error(500,"获取用户详情失败"+e.getMessage());
}
}
@Override
public ResultVO getUserList(Integer pageNum, Integer pageSize) {
try{
Page<User>pages=new Page<>(pageNum,pageSize);
pages=userMapper.getUserList(pages);
List<User>list=pages.getRecords();
Long count=userMapper.selectCount(null);
Map<String,Object>res=new HashMap<>();
res.put("list",list);
res.put("count",count);
return ResultVOUtil.success(res);
}catch (Exception e){
log.error(e.getMessage());
return ResultVOUtil.error(500,"获取用户列表失败"+e.getMessage());
}
}
@Override
public ResultVO getUserRoleList(Integer pageNum,Integer pageSize){
try{
Page<UserRoleVO>pages=new Page<>(pageNum,pageSize);
pages=userMapper.getUserRoleList(pages);
List<UserRoleVO>list=pages.getRecords();
Long count=pages.getTotal();
Map<String,Object>res=new HashMap<>();
res.put("list",list);
res.put("count",count);
return ResultVOUtil.success(res);
}catch (Exception e){
log.error(e.getMessage());
return ResultVOUtil.error(500,"获取用户列表失败"+e.getMessage());
}
}
}
修改UserController.java
@Slf4j
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value = "/getUserById",method= RequestMethod.GET)
public ResultVO getUserById(@RequestParam(value = "id",required = true)Integer id){
log.info("-------getUserById---------");
return userService.getUserById(id);
}
@RequestMapping(value = "/getUserList",method = RequestMethod.GET)
public ResultVO getUserList(@RequestParam(value = "pageNum",required = true)Integer pageNum,
@RequestParam(value = "pageSize",required = true)Integer pageSize){
log.info("------getUserList----------");
return userService.getUserList(pageNum,pageSize);
}
@RequestMapping(value = "/getUserRoleList",method = RequestMethod.GET)
public ResultVO getUserRoleList(@RequestParam(value = "pageNum",required = true)Integer pageNum,
@RequestParam(value = "pageSize",required = true)Integer pageSize){
log.info("------getUserRoleList----------");
return userService.getUserRoleList(pageNum,pageSize);
}
}
测试
3.事务回滚
添加一个实体类
@TableName(value = "t_user_role")
@Data
public class UserRoleId {
@TableField(value = "uid")
private Integer uid;
@TableField(value = "rid")
private Integer rid;
}
添加UserRoleMapper和RoleMapper类,继承BaseMapper
修改UserServiceImpl.java
@Autowired
private UserMapper userMapper;
@Autowired
private UserRoleIdMapper userRoleIdMapper;
@Autowired
private RoleMapper roleMapper;
@Override
@Transactional(rollbackFor = {RuntimeException.class,Exception.class})
public ResultVO addUser(JSONObject jsonObject) {
try{
String username=jsonObject.getString("username");
String password=jsonObject.getString("password");
User user=new User();
user.setUsername(username);
user.setPassword(password);
int addNum=userMapper.insert(user);
if(addNum<=0){
return ResultVOUtil.error(500,"插入失败");
}else{
//添加用户成功
//添加用户权限
UserRoleId userRoleId=new UserRoleId();
//添加用户时,默认为user权限
//获取用户权限为user的Role
QueryWrapper<Role>wrapper=new QueryWrapper<>();
wrapper.eq("name","user");
Role role=roleMapper.selectOne(wrapper);
userRoleId.setRid(role.getId());
userRoleId.setUid(user.getId());
//添加t_user_role记录
addNum=userRoleIdMapper.insert(userRoleId);
if(addNum>=0){
Map<String,Object>res=new HashMap<>();
res.put("addNum",addNum);
res.put("id",user.getId());
return ResultVOUtil.success(res);
}else{
throw new RuntimeException();
}
}
}catch (Exception e){
log.error(e.getMessage());
//手动回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return ResultVOUtil.error(500,e.getMessage());
}
}
运行项目
查看响应的表
我们手动抛出一个错误
重启项目
查看数据库,并没有添加相应的用户,说明回滚成功