mybatis plus

2022-01-16/2022-01-18

参考文档:Mybatis-plus

此篇文章只记录使用过程中用到的问题,具体使用教程,请参考官网

1. 快速入门

2. 核心功能

2.1 代码生成器

生成的代码:

entity

 1@Data
 2@EqualsAndHashCode(callSuper = false)
 3public class User implements Serializable {
 4
 5    private static final long serialVersionUID = 1L;
 6
 7    /**
 8     * 姓名
 9     */
10    private String name;
11
12    /**
13     * 年龄
14     */
15    private Integer age;
16
17    /**
18     * 邮箱
19     */
20    private String email;
21}

mapper 接口

1public interface UserMapper extends BaseMapper<User> {
2}

controller

1@RestController
2@RequestMapping("/user")
3public class UserController {
4}

mapper.xml

1<?xml version="1.0" encoding="UTF-8"?>
2<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
3<mapper namespace="com.example.springboottest.mapper.UserMapper">
4</mapper>

2.2 条件构造器

2.2.1 AbstractWrapper

QueryWrapper(LambdaQueryWrapper) 和 UpdateWrapper(LambdaUpdateWrapper) 的父类
用于生成 sql 的 where 条件, entity 属性也用于生成 sql 的 where 条件。

里面有 eq/in/or 等通用方法。

2.2.2 QueryWrapper

继承自 AbstractWrapper,多了 select 方法。

1QueryWrapper<User> wrapper = new QueryWrapper<>();
2wrapper.eq("name", "zhangsan");
3userMapper.selectOne(wrapper);

2.2.3 LambdaQueryWrapper

可以通过 new QueryWrapper().lambda() 获取,区别在于可以使用 lambda 表达式表示列名

1// 相当于 new LambdaQueryWrapper<>(entityClass); 不推荐使用 new
2LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery(User.class);
3wrapper.eq(User::getName, "zhangsan");
4userMapper.selectOne(wrapper);

2.2.4 AbstractChainWrapper

相当于 AbstractWrapper 的扩展,增加 one (代替 selectOne), list (代替 selectList) 等链式方法。

看两个例子就明白了。

1QueryChainWrapper<User> chainWrapper = new QueryChainWrapper<>(userMapper);
2User user = chainWrapper.eq("name", "zhangsan").one();
3
4LambdaQueryChainWrapper<User> wrapper = new LambdaQueryChainWrapper<>(userMapper);
5List<User> users = wrapper.eq(User::getName, "zhangsan").list();

2.2.5 UpdateWrapper

set(String column, Object val) set 方法设置的是 set 片段,不是 where 片段,举个例子

1LambdaUpdateChainWrapper<User> wrapper = new LambdaUpdateChainWrapper<>(userMapper);
2wrapper.eq(User::getName, "wangwu").set(User::getAge, 200).update();

生成的 sql 为

1UPDATE
2    user 
3SET
4    age=200
5WHERE
6    (
7        name = 'wangwu'
8    )

需要注意的是 BaseMapper update 的另外一个重载方法 update(T entity)

1User user = new User();
2user.setName("wangwu");
3user.setAge(200);
4
5LambdaUpdateChainWrapper<User> wrapper = new LambdaUpdateChainWrapper<>(userMapper);
6wrapper.eq(User::getName, "wangwu").set(User::getAge,100).update(user);

生成的 sql 为

 1UPDATE
 2    user 
 3SET
 4    name='wangwu',
 5    age=200,
 6    age=100 
 7WHERE
 8    (
 9        name = 'wangwu'
10    )

可见,entity 会自动加入到 set 片段中(为 null 的字段不加入),并且与 set 有冲突,但以 set 为准。

3. 扩展

4. 插件

评论
发表评论
       
       
取消