ToB企服应用市场:ToB评测及商务社交产业平台
标题:
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
[打印本页]
作者:
盛世宏图
时间:
2024-11-4 00:46
标题:
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
一、关于条件构造器(Wrapper)
1.1 简介
MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
1.2 发展
核心功能的发展
:
从早期的MyBatis-Plus版本开始,条件构造器(Wrapper)就已经作为核心功能之一,用于构建复杂的数据库查询条件。随着版本的迭代,条件构造器的功能不停加强,提供了更多的方法来支持各种查询操纵,如eq(等于)、ne(不等于)、gt(大于)、lt(小于)等。
链式调用的优化
:
条件构造器支持链式调用,这使得代码更加简洁和易读。随着MyBatis-Plus的发展,链式调用的流畅性和易用性得到了进一步的优化,使得开发者可以更加方便地构建复杂的查询条件。
Lambda表达式的引入
:
随着Java 8的普及,MyBatis-Plus引入了基于Lambda表达式的条件构造器,如LambdaQueryWrapper和LambdaUpdateWrapper,这使得开发者可以使用更加现代的编程方式来构建查询和更新条件,提高了代码的可读性和安全性。
功能扩展
:
MyBatis-Plus条件构造器的功能不停扩展,新增了许多方法,如eqSql、gtSql、geSql、ltSql、leSql等,这些方法允许开发者直接在条件构造器中嵌入SQL片段,提供了更高的机动性。
性能优化
:
随着MyBatis-Plus的发展,条件构造器在性能上也得到了优化。通过减少不必要的SQL拼接和优化条件构造逻辑,提高了查询的效率。
易用性的提升
:
MyBatis-Plus不停改进条件构造器的易用性,例如通过提供更多的方法来支持不同的查询场景,如groupBy、orderBy、having等,使得开发者可以更加方便地构建复杂的查询条件。
1.3 特点
MyBatis-Plus的条件构造用具有以下特点:
链式调用
:Wrapper类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的SQL语句,从而提高开发效率。
安全性
:通过使用Wrapper,可以克制直接拼接SQL片段,减少SQL注入的风险。
机动性
:支持多种查询操纵,如等于、不等于、大于、小于等,以及逻辑组合如and和or。
Lambda表达式
:LambdaQueryWrapper和LambdaUpdateWrapper通过Lambda表达式引用实体类的属性,克制了硬编码字段名,提高了代码的可读性和可维护性。
减少代码量
:Wrappers类作为一个静态工厂类,可以快速创建Wrapper实例,减少代码量,提高开发效率。
线程安全性
:Wrapper实例不是线程安全的,建议每次使用时创建新的Wrapper实例,以克制多线程环境下的数据竞争和潜伏错误。
支持复杂查询
:支持嵌套查询和自定义SQL片段,通过nested和apply方法,可以构建更复杂的查询条件。
类型处理器
:在Wrapper中可以使用TypeHandler处理特殊的数据类型,加强了对数据库类型的支持。
更新操纵简化
:使用UpdateWrapper或LambdaUpdateWrapper时,可以省略实体对象,直接在Wrapper中设置更新字段。
1.4 主要类型
MyBatis-Plus 提供了多种条件构造器,以满意不同的查询需求:
QueryWrapper
:用于构建查询条件,支持链式调用,可以非常方便地添加各种查询条件。
UpdateWrapper
:用于构建更新条件,支持链式调用,可以方便地添加各种更新条件。
LambdaQueryWrapper
:使用 Lambda 表达式来构建查询条件,克制了字段名错误的问题,加强了代码的可读性和健壮性。
LambdaUpdateWrapper
:使用 Lambda 表达式来构建更新条件,同样可以克制字段名错误的问题。
AbstractWrapper
:是一个抽象类,其他 Wrapper 类继续自这个类,提供了一些底子的方法实现。
二、基本运用
2.1
使用方法
条件构造器允许开发者以链式调用的方式构造SQL的WHERE子句,提供了极大的机动性和便利性。例如,使用QueryWrapper可以这样构建查询条件:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "Kimi").lt("age", 30);
复制代码
这将生成SQL:SELECT * FROM user WHERE name = 'Kimi' AND age < 30。
2.2 示例
QueryWrapper 示例
// 创建 QueryWrapper 对象
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 添加查询条件
queryWrapper.eq("name", "张三") // 字段等于某个值
.gt("age", 18) // 字段大于某个值
.like("email", "%@gmail.com"); // 字段包含某个值
// 使用条件进行查询
List<User> users = userMapper.selectList(queryWrapper);
复制代码
UpdateWrapper 示例
// 创建 UpdateWrapper 对象
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
// 设置更新条件
updateWrapper.eq("id", 1); // 更新 id=1 的记录
// 设置要更新的数据
User user = new User();
user.setName("李四");
user.setAge(20);
// 执行更新操作
int result = userMapper.update(user, updateWrapper);
复制代码
LambdaQueryWrapper 示例
// 创建 LambdaQueryWrapper 对象
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
// 添加查询条件
lambdaQueryWrapper.eq(User::getName, "张三")
.gt(User::getAge, 18)
.like(User::getEmail, "%@gmail.com");
// 使用条件进行查询
List<User> users = userMapper.selectList(lambdaQueryWrapper);
复制代码
三、Wrapper 类
3.1 简介
在 MyBatis-Plus 中,Wrapper 类是构建查询和更新条件的核心工具。
3.2 方法
MyBatis-Plus的Wrapper类提供了一系列方法来构建复杂的数据库查询条件。以下是一些常用的Wrapper类方法汇总:
基本条件方法
:
eq:等于条件,例如 wrapper.eq("name", "zhangsan")。
ne:不等于条件,例如 wrapper.ne("name", "zhangsan")。
gt:大于条件,例如 wrapper.gt("age", 18)。
lt:小于条件,例如 wrapper.lt("age", 18)。
ge:大于等于条件,例如 wrapper.ge("age", 18)。
le:小于等于条件,例如 wrapper.le("age", 18)。
between:介于两个值之间,例如 wrapper.between("age", 18, 30)。
notBetween:不介于两个值之间,例如 wrapper.notBetween("age", 18, 30)。
like:模糊匹配,例如 wrapper.like("name", "%zhangsan%")。
notLike:不模糊匹配,例如 wrapper.notLike("name", "%zhangsan%")。
likeLeft:左模糊匹配,例如 wrapper.likeLeft("name", "zhangsan%")。
likeRight:右模糊匹配,例如 wrapper.likeRight("name", "%zhangsan")。
isNull:字段值为null,例如 wrapper.isNull("name")。
isNotNull:字段值不为null,例如 wrapper.isNotNull("name")。
in:字段值在指定集合中,例如 wrapper.in("name", "zhangsan", "Tom")。
notIn:字段值不在指定集合中,例如 wrapper.notIn("name", "zhangsan", "Tom")。
逻辑组合方法
:
and:添加一个AND条件,例如 wrapper.and(wq -> wq.eq("name", "zhangsan"))。
or:添加一个OR条件,例如 wrapper.or(wq -> wq.eq("name", "zhangsan"))。
SQL片段方法
:
apply:添加自定义SQL片段,例如 wrapper.apply("name = {0}", "zhangsan")。
last:添加自定义SQL片段到末端,例如 wrapper.last("order by name")。
子查询方法
:
inSql:子查询IN条件,例如 wrapper.inSql("name", "select name from user where age > 21")。
notInSql:子查询NOT IN条件,例如 wrapper.notInSql("name", "select name from user where age > 21")。
分组与排序方法
:
groupBy:分组,例如 wrapper.groupBy("name")。
orderByAsc:升序排序,例如 wrapper.orderByAsc("age")。
orderByDesc:降序排序,例如 wrapper.orderByDesc("age")。
其他方法
:
exists:存在条件,例如 wrapper.exists("select * from user where name = {0}", "zhangsan")。
notExists:不存在条件,例如 wrapper.notExists("select * from user where name = {0}", "zhangsan")。
set:更新操纵时设置字段值,例如 updateWrapper.set("name", "zhangsan")。
having(String column, Object val): HAVING 过滤条件,用于聚合后的过滤,例如
queryWrapper.select("name", "age")
.groupBy("age")
.having("count(id) > 1");
复制代码
以上方法提供了构建查询和更新条件的机动性和强大功能,使得MyBatis-Plus在数据库操纵方面更加高效和安全。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4