通用 CRUD 封装baseMapper (opens new window)接口,为 Mybatis-Plus 启动时自动解析实体表关系映射转换为 Mybatis 内部对象注入容器泛型 T 为任意实体对象参数 Serializable 为任意类型主键 Mybatis-Plus 不推荐使用复合主键约定每一张表都有自己的唯一 id 主键对象 Wrapper 为 条件构造器
Insert
// 插入一条记录
int insert(T entity);
参数说明
类型
参数名
描述
T
entity
实体对象
Delete
// 根据 entity 条件,删除记录
int delete(@Param(Constants.WRAPPER) Wrapper wrapper);
// 删除(根据ID 批量删除)
int deleteBatchIds(@Param(Constants.COLLECTION) Collection extends Serializable> idList);
// 根据 ID 删除
int deleteById(Serializable id);
// 根据 columnMap 条件,删除记录
int deleteByMap(@Param(Constants.COLUMN_MAP) Map columnMap)
参数说明
类型
参数名
描述
Wrapper
wrapper
实体对象封装操作类(可以为 null)
Collection
idList
主键 ID 列表(不能为 null 以及 empty)
Serializable
id
主键 ID
Map
columnMap
表字段 map 对象
Update
// 根据 whereWrapper 条件,更新记录
int update(@Param(Constants.ENTITY) T updateEntity, @Param(Constants.WRAPPER) Wrapper whereWrapper);
// 根据 ID 修改
int updateById(@Param(Constants.ENTITY) T entity);
@TableName("sys_user")
public class User {
@TableId
private Long id;
@TableField("nickname")
private String name;
private Integer age;
private String email;
}
between 值1 and 值2 例: between(“age”, 18, 30) —> age between 18 and 30
notBetween
not between 值1 and 值2 例: notBetween(“age”, 18, 30) —> age not between 18 and 30
like
LIKE ‘%值%’ 例: like(“name”, “王”) —> name like '%王%'
notLike
NOT LIKE ‘%值%’ 例: notLike(“name”, “王”) —> name not like '%王%'
likeLeft
LIKE ‘%值’ 例: likeLeft(“name”, “王”) —> name like '%王’
likeRight
LIKE ‘值%’ 例: likeRight(“name”, “王”) —> name like '王%'
isNull
字段 IS NULL 例: isNull(“name”) —> name is null
isBotNull
字段 IS NOT NULL 例: isNotNull(“name”) —> name is not null
in
字段 IN (value.get(0), value.get(1), …) 例: in(“age”,{1,2,3}) —> age in (1,2,3) 字段 IN (v0, v1, …) 例: in(“age”, 1, 2, 3) —> age in (1,2,3)
notIn
字段 NOT IN (value.get(0), value.get(1), …) 例: notIn(“age”,{1,2,3}) —> age not in (1,2,3) 字段 NOT IN (v0, v1, …) 例: notIn(“age”, 1, 2, 3) —> age not in (1,2,3)
inSql
字段 IN ( sql语句 ) 例: inSql(“age”, “1,2,3,4,5,6”) —> age in (1,2,3,4,5,6) 例: inSql(“id”, “select id from table where id < 3”) —> id in (select id from table where id < 3)
notInSql
字段 NOT IN ( sql语句 ) 例: notInSql(“age”, “1,2,3,4,5,6”) —> age not in (1,2,3,4,5,6) 例: notInSql(“id”, “select id from table where id < 3”) —> id not in (select id from table where id < 3)
groupBy
分组:GROUP BY 字段, … 例: groupBy(“id”, “name”) —> group by id,name
orderByAsc
排序:ORDER BY 字段, … ASC 例: orderByAsc(“id”, “name”) —> order by id ASC,name ASC
orderByDesc
排序:ORDER BY 字段, … DESC 例: orderByDesc(“id”, “name”) —> order by id DESC,name DESC
orderBy
排序:ORDER BY 字段, … 例: orderBy(true, true, “id”, “name”) —> order by id ASC,name ASC
having
HAVINg ( sql语句 ) 例: having(“sum(age) > 10”) —> having sum(age) > 10 例: having(“sum(age) > {0}”, 11) —> having sum(age) > 11
继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件
及 LambdaQueryWrapper, 可以通过 new QueryWrapper().lambda() 方法获取
1.1、组装查询条件
@Test
public void test01() {
//查询用户名含有a且年龄在20和30之间且邮箱信息不为空的用户信息
//SELECT id,user_name,password,name,age,email,is_deleted FROM tb_user WHERe is_deleted=0 AND (user_name LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL)
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.like("user_name", "a")
.between("age", 20, 30)
.isNotNull("email");
userMapper.selectList(wrapper).forEach(System.out ::println);
}
1.2、组装排序条件
@Test
public void test02() {
//查询用户信息,按照年龄的降序排序,若年龄相同,则按照id的升序排序
//SELECT id,user_name,password,name,age,email,is_deleted FROM tb_user WHERe is_deleted=0 ORDER BY age DESC,id ASC
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.orderByDesc("age")
.orderByAsc("id");
userMapper.selectList(wrapper).forEach(System.out ::println);
}
1.3、组装删除条件
@Test
public void test03() {
//删除邮箱地址为空的用户信息
//UPDATE tb_user SET is_deleted=1 WHERe is_deleted=0 AND (email IS NULL)
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.isNull("email");
int delete = userMapper.delete(wrapper);
System.out.println(delete);
}
1.4、组装修改条件
@Test
public void test04() {
//将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改
// Preparing: UPDATE tb_user SET user_name=?, password=?, name=?, age=?, email=? WHERe is_deleted=0 AND (age > ? AND user_name LIKE ? OR email IS NULL)
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.gt("age", 20)
.like("user_name", "a")
.or()
.isNull("email");
User user = new User();
user.setName("小明");
user.setEmail("test@ly.com");
int i = userMapper.update(user, wrapper);
System.out.println(i);
}
1.5、条件的优先级
@Test
public void test05() {
//将用户名中含有a(年龄大于20或邮箱为null)的用户信息修改
//lambda中的条件优先执行
//UPDATE tb_user SET user_name=?, password=?, name=?, age=?, email=? WHERe is_deleted=0 AND (user_name LIKE ? AND (age > ? OR email IS NULL))
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.like("user_name","a")
.and(i->i.gt("age",20).or().isNull("email"));
User user = new User();
user.setName("Tom");
user.setEmail("Tom@ly.com");
int i = userMapper.update(user, wrapper);
System.out.println(i);
}
1.6、组装select子句
@Test
public void test06() {
//查询用户的用户名,年龄,邮箱信息
//SELECT user_name,age,email FROM tb_user WHERe is_deleted=0
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.select("user_name","age","email");
userMapper.selectMaps(wrapper).forEach(System.out::println);
}
1.7、实现子查询
@Test
public void test07() {
//查询id 小于等于10的用户信息
//SELECT id,user_name,password,name,age,email,is_deleted FROM tb_user WHERe is_deleted=0 AND (id IN (select id from tb_user where id <= 10))
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.inSql("id","select id from tb_user where id <= 10");
userMapper.selectList(wrapper).forEach(System.out::println);
}
2、UpdateWrapper
说明:
继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件
及 LambdaUpdateWrapper, 可以通过 new UpdateWrapper().lambda() 方法获取!
@Test
public void test08() {
//将用户名中含有a(年龄大于20或邮箱为null)的用户信息修改
//UPDATE tb_user SET name=?,email=? WHERe is_deleted=0 AND (user_name LIKE ? AND (age > ? OR email IS NULL))
UpdateWrapper wrapper = new UpdateWrapper<>();
wrapper.like("user_name","a")
.and(i->i.gt("age",20).or().isNull("email"));
wrapper.set("name","小黑").set("email","abc@ly.com");
int i = userMapper.update(null, wrapper);
System.out.println(i);
}
3、模拟开发中组装的情况
3.1、UpdateWrapper
@Test
public void test09() {
//SELECT id,user_name,password,name,age,email,is_deleted FROM tb_user WHERe is_deleted=0 AND (user_name LIKE ? AND age <= ?)
String username = "a";
Integer ageBegin = null;
Integer ageEnd = 30;
QueryWrapper wrapper = new QueryWrapper<>();
if (StringUtils.isNotBlank(username)) {
//isNotBlank判断某个字符串是否不为空字符串,不为null,不为空白符
wrapper.like("user_name", username);
}
if (ageBegin != null){
wrapper.ge("age",ageBegin);
}
if (ageEnd != null) {
wrapper.le("age", ageEnd);
}
userMapper.selectList(wrapper).forEach(System.out::println);
}
@Test
public void test10() {
//SELECT id,user_name,password,name,age,email,is_deleted FROM tb_user WHERe is_deleted=0 AND (user_name LIKE ? AND age <= ?)
String username = "a";
Integer ageBegin = null;
Integer ageEnd = 30;
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.like(StringUtils.isNotBlank(username),"user_name","username")
.ge(ageBegin != null,"age","ageBegin")
.le(ageEnd != null,"age","ageEnd");
userMapper.selectList(wrapper).forEach(System.out::println);
}
3.3、LambdaQueryWrapper
@Test
public void test11() {
//Preparing: SELECT id,user_name,password,name,age,email,is_deleted FROM tb_user WHERe is_deleted=0 AND (user_name LIKE ? AND age <= ?)
String username = "a";
Integer ageBegin = null;
Integer ageEnd = 30;
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.like(StringUtils.isNotBlank(username),User::getUserName,username)
.ge(ageBegin != null,User::getAge,ageBegin)
.le(ageEnd != null,User::getAge,ageEnd);
userMapper.selectList(wrapper).forEach(System.out::println);
}
3.4、LambdaUpdateWrapper
@Test
public void test12() {
//将用户名中含有a(年龄大于20或邮箱为null)的用户信息修改
//UPDATE tb_user SET name=?,email=? WHERe is_deleted=0 AND (user_name LIKE ? AND (age > ? OR email IS NULL))
LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>();
wrapper.like(User::getUserName, "a")
.and(i -> i.gt(User::getAge, 20).or().isNull(User::getEmail));
wrapper.set(User::getName, "小黑").set(User::getEmail, "abc@ly.com");
int i = userMapper.update(null, wrapper);
System.out.println(i);
}
五、插件
1、分页插件
1)配置
@Configuration
@MapperScan("com.ly.mybatisplus.mapper")
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return mybatisPlusInterceptor;
}
}
2)测试
1.简单使用
@Test
public void testPage() {
Page page = new Page<>(1, 3);
userMapper.selectPage(page,null);
System.out.println(page);
}
结果:
2、获取相关参数
@Test
public void testPage() {
//SELECT id,user_name,password,name,age,email,is_deleted FROM tb_user WHERe is_deleted=0 LIMIT ?
Page page = new Page<>(1, 3);
userMapper.selectPage(page,null);
System.out.println("当前页的记录:"+page.getRecords());
System.out.println("总页数:"+page.getPages());
System.out.println("数据总条数:"+page.getTotal());
System.out.println("当前页记录的大小:"+page.getSize());
System.out.println("是否有下一页:"+page.hasNext());
System.out.println("是否有上一页:"+page.hasPrevious());
}
@Test
public void selectPageVo() {
//select id,user_name,password,name,age,email from user where age > ? LIMIT ?
Page page = new Page<>(1,3);
userMapper.selectPageVo(page, 20);
System.out.println("当前页的记录:"+page.getRecords());
System.out.println("总页数:"+page.getPages());
System.out.println("数据总条数:"+page.getTotal());
System.out.println("当前页记录的大小:"+page.getSize());
System.out.println("是否有下一页:"+page.hasNext());
System.out.println("是否有上一页:"+page.hasPrevious());
}
结果:
2、乐观锁 OptimisticLockerInnerInterceptor
当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁实现方式:
·取出记录时,获取当前 version
·更新时,带上这个 version
·执行更新时, set version = newVersion where version = oldVersion
·如果 version 不对,就更新失败
乐观锁配置需要两步:
1.配置插件
Spring Boot注解方式
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
@Service
@DS("slave")
public class UserServiceImpl implements UserService {
@Autowired
private JdbcTemplate jdbcTemplate;
public List selectAll() {
return jdbcTemplate.queryForList("select * from user");
}
@Override
@DS("slave_1")
public List selectByCondition() {
return jdbcTemplate.queryForList("select * from user where age >10");
}
}