针对MyBatis-Plus 复杂应用
简单可以直接使用内置方法解决,
复杂一点的(查询、修改、删除的SQL语句都需要指定where条件)
1.使用条件构造器
(本质上就是就是把条件给整合成一个对象,再调用内置方法)
1.写死字段名称
QueryWrapper:用于查询、删除条件(侧重WHERE子句构建)。UpdateWrapper:用于更新条件(可同时设置更新字段和WHERE条件)。- 使用方法:1.定义方法的对象,2.链式法则
等价于:update emp set salary = salary + 2000 where id in (5, 6, 7); public void testUpdateWrapper() { // 更新id为5, 6, 7的员工的薪水,加2000 UpdateWrapper<Emp> updateWrapper = new UpdateWrapper<>(); 创建对象 updateWrapper.in("id", 5, 6, 7) .setSql("salary = salary + 2000"); 字段对应的都是sql中的字段名 empMapper.update(updateWrapper); //把结果封装传过去,调用的仍是mp的内置方法 } .in .setsql(是链式的一些用法,不同场景不同用法)
2.使用实体类反射给字段名
- LambdaQueryWrapper
- LambdaUpdateWrapper
@Test public void testLambdaUpdateWrapper() { // 更新id为5, 6, 7的员工的薪水,加2000 LambdaUpdateWrapper<Emp> updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.in(Emp::getId, 5, 6, 7) 指的是对象属性???? .setSql("salary = salary + 2000"); empMapper.update(updateWrapper); }
总结 :
- 核心差异:QueryWrapper 用数据库字段名(字符串),LambdaQueryWrapper 用实体类属性(方法引用)。
- Lambda 优势:类型安全,编译期校验,自动处理驼峰映射,适合单表操作。
- QueryWrapper 优势:灵活,支持多表联查的外部字段,写法更简洁(对熟悉字段名的场景)。
实际开发中,单表操作优先用 LambdaQueryWrapper(减少错误),多表联查用 QueryWrapper(灵活处理跨表字段)。
2.自定义sql(为了解决更新中对于set部分的优化)
1.融合where条件(使用条件构造器)在service
2.在mapper自定义方法(不是重写,自定义,参数,包括两部分,条件构造器对象,需修改的属性)
3.创建xml文件 ,进行绑定
示例:
sql示例:update emp set name='zhangsan', age=18 where id in(1,2,3) and salary > 1000 and sex = 1; (1) 构建wrapper(融合条件)在service层 LambdaQueryWrapper<Emp> wrapper = new LambdaQueryWrapper<Emp>() .in(Emp::getId, ids) .eq(Emp::getSex, 1) .gt(Emp::getSalary, 1000); **************************************************************************** (2) 修改mapper入参(自定义方法)在mapper层 void updateSalaryByIds(@Param("ew") LambdaQueryWrapper<Emp> wrapper, @Param("amount") int amount, @Param("age") int age); *************************************************************************** (3) 动态sql:不影响where部分的语法,只需要调整set的字段 在xml文件中 <update id="updateBalanceByIds"> UPDATE emp SET amount = amount- #{amount} , age = #{age} ${ew.customSqlSegment} 固定写法(红色字体) </update> *********************************************************************** 必须使用 ${} 而非 #{},因为它是直接拼接 SQL 片段,而非预编译参数。 @Param("ew") 固定不能改(用作标识) 通过 @Param 注解指定参数名,确保与 XML 中的 #{参数名} 对应。
分页查询(原来使用mybatis改用mp基础遵循原来的):
1.引入配置文件(分页配置文件)
2.使用page进行分页,并返回结果
3.使用条件进行判断(太麻烦)
多表(两张表)
调用基础方法即可(一个表中包含另一张表,与表中有另一个表中的字段不同)