首次接触MyBatis-Plus是在2018年年年底,那会还在培训机构当讲师,课程大纲中包含的是MyBatis,班级毕业之后学员在太原那边面试问到了MyBatis-Plus,把我干蒙了,之后研究了一下后来加入到了课程大纲中,MyBatis-Plus官网介绍2017-2020联系4年获奖,具体的发布时间我并没有查到,有小道消息的小伙伴可以评论区留言。
因为MyBatis-Plus的强大功能,目前不少公司都会引入MyBatis-Plus,我公司技术选型时我也会引入了MyBatis-Plus使用,打算通过MyBatis专栏将MyBatis和MyBatis-Plus的相关技术点安利给读者朋友,非常实用哦!
系列文章目录
第一章 myBatis分页插件pageHelper
第二章 MyBatis-Plus【1】—— 基本使用
第三章 MyBatis-Plus【2】——解锁MyBatis这些功能代码少些3成
第四章 Mybatis-Plus【3】——左手乐观锁、右手逻辑删除在数据层为所欲为
前言
本章主要介绍MyBatis-Plus的条件构造器,条件构造器是MyBatis的核心,可以使用面向对象的方式来实现查询,我们慢慢往下看
一、条件构造器
1.1、官网的弊端
MyBatis-plus官网 一上来对条件构造器
的介绍比较模糊,看不懂,不信您看一下
并且下方的案例中也没有创建Wrapper对象的步骤,初学者在刚接触时比较抽象,看完这篇文章之后再去看官网就会比较清晰了。
1.2、条件构造器到底是什么
条件构造器就是可以帮助我们使用面向对象的方式实现数据库操作的where条件,在MyBatis-Plus中将它封装成了一个Wrapper对象,在使用时我们创建条件构造器对象。Wrapper对象的体系的结构大致如下:
其中 Wrapper
和 AbstractWrapper
是两个抽象类不能直接实例化,我们在使用时常用的具体实现是QueryWrapper
和 UpdateWrapper
,看名字好像是QueryWapper是查询时使用而UpdateWrapper是修改时使用,其实我在使用过程中无论修改还是查询
用的都是QueryWrapper。它们还是有些许不同的,并不是很重要本文就先不介绍了。反正直接用QueryWrapper就完事。
注意:
如果您JDK1.8中的Lambda玩的比较溜,也可以使用
LambdaQueryWrapper
和LambdaUpdateWrapper
二、代码实现
在操作sql时条件包含 等于,不等于,大于,小于,区间,模糊查询,limit等等,接下来我会演示一些常用的,基本上包含了工作中的99.99%场景。
2.1、创建构造器语法
// 其中泛型填充要操作的Entity
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
2.2、ge、gt、le、lt、isNull、isNotNull
@Test
public void testDelete() {
// 创建QueryWrapper对象
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 直接.即可其中isNull = where name IS NULL,查询名字部位空的
queryWrapper
.isNull("name")
// 如果继续.说明条件使用 AND 连接,ge为大于等于的意思sql为:and age >= 12
.ge("age", 12)
// isNotNull就和isNull相反啦
.isNotNull("email");
// 调用delete方法说明要根据条件进行数据删除
int result = userMapper.delete(queryWrapper);
System.out.println("delete return count = " + result);
}
以上语法sql 如下
DELETE FROM tb_user WHERE name IS NULL AND age >= 12 AND email IS NOT NULL;
你品,你细品,很简单吧,其他的操作都一样,无非就是不同的方法有不同的功能,这里您可以自己写一写思考一下,我继续往下码字。
2.3、eq、ne
- eq:相等
- ne:不相等
- selectOne:调用selecteOne是查询一条数据,如果根据该条件获取到多条则会报错。
@Test
public void testSelectOne() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "Tom");
User user = userMapper.selectOne(queryWrapper);
System.out.println(user);
}
2.4、between、notBetween
根据边界查询,包含边界大小
@Test
public void testSelectCount() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.between("age", 20, 30);
Long count = userMapper.selectCount(queryWrapper);
System.out.println(count);
}
2.5、allEq
传入map,多个条件都必须成立,与无限eq效果相同
@Test
public void testSelectList() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
Map<String, Object> map = new HashMap<>();
map.put("id", 2);
map.put("name", "Jack");
map.put("age", 20);
queryWrapper.allEq(map);
List<User> users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
// 等同于
@Test
public void testSelectList() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("id", 2).eq("name", "Jack").eq("age", 20);
List<User> users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
2.6、like、notLike、likeLeft、likeRight
selectMaps返回Map集合列表,此处当然也可以使用selectList()
来返回List集合
@Test
public void testSelectMaps() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper
.notLike("name", "e")
.likeRight("email", "t");
List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
// 返回值是Map列表
maps.forEach(System.out::println);
}
2.7、in、notIn、inSql、notinSql、exists、notExists
这里可以通过 inSql 来实现子查询
@Test
public void testSelectObjs() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//queryWrapper.in("id", 1, 2, 3);
queryWrapper.inSql("id", "select id from user where id < 3");
List<Object> objects = userMapper.selectObjs(queryWrapper);
//返回值 是 Object 列表
objects.forEach(System.out::println);
}
2.8、or、and
注意:这里使用的是UpdateWrapper不调用or则默认为使用and连,QueryWrapper也是同理
@Test
public void testUpdate1() {
//修改值
User user = new User();
user.setAge(99);
user.setName("Andy");
//修改条件
UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
userUpdateWrapper
.like("name", "h")
.or()
.between("age", 20, 30);
int result = userMapper.update(user, userUpdateWrapper);
System.out.println(result);
}
2.9、嵌套or、嵌套and
这里使用了lambda表达式,or中的表达式最后翻译成sql时会被加上圆括号
@Test
public void testUpdate2() {
//修改值
User user = new User();
user.setAge(99);
user.setName("Andy");
//修改条件
UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
userUpdateWrapper
.like("name", "h")
.or(i -> i.eq("name", " 李白 ").ne("age", 20));
int result = userMapper.update(user, userUpdateWrapper);
System.out.println(result);
}
2.10、orderBy、orderByDesc、orderByAsc
排序嘛
@Test
public void testSelectListOrderBy() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByDesc("id");
List<User> users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
2.11、last
直接拼接到sql的最后,MySQL中实现查询指定条数数据时频繁使用
注意:只能调用一次,多次调用以最后一次为准,有sql注入的风险,请谨慎使用
@Test
public void testSelectListLast() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.last("limit 1");
List<User> users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
2.12、指定要查询的列
@Test
public void testSelectListColumn() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.select("id", "name", "age");
List<User> users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
2.13、set、setSql
这两个是UpdateWrapper特有的,最终的sql会合并user.setAge(),以及userUpdateWrapper.set()和setSql()中的字段
@Test
public void testUpdateSet() {
//修改值
User user = new User();
user.setAge(99);
//修改条件
UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
userUpdateWrapper
.like("name", "h")
.set("name", " 老李头 ")
// 除了可以查询还可以使用set设置修改的字段
.setSql(" email = '123@qq.com'");
// 可以有子查询
int result = userMapper.update(user, userUpdateWrapper);
}
总结
以上就是本文介绍的MyBatis-Plus所有内容,主要是条件构造器的体系和使用,其中案例部分几乎涵盖了所有的应用场景,大家可以根据具体的需求灵活组合,单表脱离xml文件岂不是爽。接下来还会继续带来MyBatis-Plus系列文章,敬请期待!