SpringBoot整合mybatis-plus

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());
        }
    }

运行项目
在这里插入图片描述
查看响应的表
在这里插入图片描述
在这里插入图片描述
我们手动抛出一个错误
在这里插入图片描述

重启项目
在这里插入图片描述
查看数据库,并没有添加相应的用户,说明回滚成功
在这里插入图片描述

参考文章

MybatisPlus实现多表联查、分页查询

mybatis-plus超详细讲解

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值