参考文档:Mybatis-plus

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

1. 快速入门

2. 核心功能

2.1 代码生成器

生成的代码:

entity

@Data
@EqualsAndHashCode(callSuper = false)
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 姓名
     */
    private String name;

    /**
     * 年龄
     */
    private Integer age;

    /**
     * 邮箱
     */
    private String email;
}

mapper 接口

public interface UserMapper extends BaseMapper<User> {
}

controller

@RestController
@RequestMapping("/user")
public class UserController {
}

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.example.springboottest.mapper.UserMapper">
</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 方法。

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

2.2.3 LambdaQueryWrapper

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

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

2.2.4 AbstractChainWrapper

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

看两个例子就明白了。

QueryChainWrapper<User> chainWrapper = new QueryChainWrapper<>(userMapper);
User user = chainWrapper.eq("name", "zhangsan").one();

LambdaQueryChainWrapper<User> wrapper = new LambdaQueryChainWrapper<>(userMapper);
List<User> users = wrapper.eq(User::getName, "zhangsan").list();

2.2.5 UpdateWrapper

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

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

生成的 sql 为

UPDATE
    user 
SET
    age=200
WHERE
    (
        name = 'wangwu'
    )

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

User user = new User();
user.setName("wangwu");
user.setAge(200);

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

生成的 sql 为

UPDATE
    user 
SET
    name='wangwu',
    age=200,
    age=100 
WHERE
    (
        name = 'wangwu'
    )

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

3. 扩展

4. 插件