参考文档: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 为准。