一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第24天,点击查看活动详情
前言
上一篇文章讲解了Mybatis-plus的入门和简单CRUD功能,不熟悉的朋友可以查看juejin.cn/post/709001… 本文将讲解Mybatis-plus的高级特性中的条件构造器。
条件构造器
为了实现各种复杂的查询,mybatis-plus提供了丰富的条件构造器来满足各种不同的需求。其条件构造器的关系结构如下:
说明: 蓝色表示抽象类,绿色代表实现类。通过关系我们可以看出,条件构造器源码采用了装饰模式,不熟悉的朋友可以百度了解下。
基本使用
Mybatis-plus提供了丰富的查询条件如下:
- 比较大小:## ( =, <>, >, >=, <, <= )
eq(R column, Object val); // 例: eq("name", "张三") ---> name = '张三'
ne(R column, Object val); // 例: ne("name", "张三") ---> name <> '张三'
gt(R column, Object val); // 例: gt("name", "张三") ---> name > '张三'
ge(R column, Object val); // 例: ge("name", "张三") ---> name >= '张三'
lt(R column, Object val); // 例: lt("name", "张三") ---> name < '张三'
le(R column, Object val); // 例: le("name", "张三") ---> name <= '张三'
- 范围:## (## between、not between、in、not in)
between(R column, Object val1, Object val2); 例:between("age", 20, 30) ---> age between 20 and 30
notBetween(R column, Object val1, Object val2); 例:notBetween("age", 28, 30) ---> age not between 28 and 30
in(R column, Object... values); 例: in("age",10,20,30) ---> age in (10,20,30)
notIn(R column, Object... values); 例: notIn("age",10,20,30) ---> age not in (10,20,30)
inSql(R column, Object... values); 例: inSql("oid", "select oid from t_user where oid < 100 ") ---> 例:oid in (select oid from t_user where oid < 100)
//尽量少用
notInSql(R column, Object... values) 例:oid notIn (select oid from t_user where oid < 499052);
- 模糊匹配:## (## like、likeLeft、likeRight、notLike)
like(R column, Object val); //例: like("name", "张三") ---> name like '%张三%'
notLike(R column, Object val); //例: notLike("name", "张三") ---> name not like '%张三%'
likeLeft(R column, Object val); 例: likeLeft("name", "张三") ---> name like '%张三'
likeRight(R column, Object val); 例: likeRight("name", "张三") ---> name like '张三%'
- 分组、排序:## (## group、having、orderby)
groupBy(R... columns); 例: groupBy("oid", "age") ---> group by oid,age
orderByAsc(R... columns); 例: orderByAsc("oid", "age") ---> order by oid ASC,age ASC
orderByDesc(R... columns); 例: orderByDesc("oid", "name") ---> order by oid DESC,name DESC
having(String sqlHaving, Object... params); 例: having("sum(age) > {0}", 11) ---> having sum(age) > 11
- 拼接、非空:## (## or、and、isNull、isNotNull)
or(); 例:eq("oid",1).or().eq("name","zhangsan") ---> oid = 1 or name = 'zhangsan'
or(Consumer<Param> consumer); 例: or(i -> i.eq("name", "李四").ne("status", "1")) ---> or (name = '李四' and status <> '1')
and(Consumer<Param> consumer); 例: and(i -> i.eq("name", "李四").ne("status", "1")) ---> and (name = '李四' and status <> '1')
isNull(R column); 例: isNull("address") ---> address is null
isNotNull(R column);例: isNotNull("name") ---> name is not null
查询 QueryWrapper
基本语法
eq(String column, Object val)
示例
@RequestMapping("/getUserByWrapper")
public String getUserByWrapper()
{
QueryWrapper<TUser> queryWrapper =new QueryWrapper<>();
// 等于
queryWrapper.eq("name", "张三1");
//大于
queryWrapper.gt("age", 18);
//like
queryWrapper.like("email", "%123%");
//排序
queryWrapper.orderBy(true,true,"age");
List<TUser> tUser= userService.list(queryWrapper);
return JSON.toJSONString(tUser);
}
Lambda方式查询 QueryWrapper
@RequestMapping("/getUserBylambdaWrapper")
public String getUserBylambdaWrapper()
{
LambdaQueryWrapper<TUser> lambdaQueryWrapper =Wrappers.lambdaQuery();
lambdaQueryWrapper.eq(TUser::getName, name);
TUser tUser= userService.getOne(lambdaQueryWrapper);
return JSON.toJSONString(tUser);
}
获取LambdaQueryWrapper对象有几种方式,本文采用的时静态方法调用.
更新 UpdateWrapper
基本语法
set(String column, Object val)
set(boolean condition, String column, Object val)
示例
@RequestMapping("/updateUserByWrapper")
public String updateUserByWrapper()
{
UpdateWrapper<TUser> updateWrapper =new UpdateWrapper<>();
//修改字段
updateWrapper.set("email", "52@1j234.com");
//条件
updateWrapper.eq("oid", 52);
userService.update(updateWrapper);
return "成功";
}
复杂多表查询
对于一些复杂的SQl语句,当条件构造器无法满足的时我们需要自定义SQl语句来实现。其实现的方式与mybatis方式一样,同样时非常方便的。
定义Mapper和SQL语句
//sql语句
<mapper namespace="com.skywares.mybatisplus.mapper.OrderHeadMapper">
<insert id="getOrderList" parameterType="com.skywares.mybatisplus.pojo.OrderHead" resultType="com.skywares.mybatisplus.pojo.OrderHead">
select * From t_order_head o
join t_order_detail d on d.orderHeaderOid=o.oid
where o.status>120;
</insert>
</mapper>
测试
@Autowired
private OrderHeadMapper orderHeadMapper;
@RequestMapping("/getOrderList")
public String getOrderList(@RequestBody OrderHead orderHead)
{
orderHeadMapper.getOrderList(orderHead);
return "成功";
}
总结
本文主要讲解了mybatis-plus的条件查询器,通过查询器可以满足项目大部分的查询需求,后续 将介绍Mybatis-plus的其他高级特性。