Wrapper体系
QueryWrapper
使用字符串表示列名,通过字符串拼接的方式构建查询条件
再将 wrapper 作为条件参数,写入BaseMapper提供的查找方法中(或其他数据库方法)
QueryWrapper<QueryEntity> wrapper = new QueryWrapper<>();
wrapper.select("user.username","user.userId");
//wrapper.like("user.username","张三");
wrapper.eq("user.username","张三");
List<ResultEntity> list = QueryMapperDao.selectList(wrapper);
- 优点:更灵活,支持复杂查询操作和 SQL 片段拼接。
- 缺点:类型不安全、可读性较差。
LambdaQueryWrapper
逻辑上与QueryWrapper相同,只是使用Lambda表达式表示列名,通过Lambda表达式的方式构建查询条件
LambdaQueryWrapper<QueryEntity> queryWrapper=new LambdaQueryWrapper<>();
queryWrapper.select(QueryEntity::getUserId , QueryEntity::getUsername);
queryWrapper.like(QueryEntity::getUsername,params.get("name"));
//queryWrapper.eq(QueryEntity::getUsername,params.get("name"));
List<ResultEntity> list = QueryMapperDao.selectList(queryWrapper);
- 优点:类型安全、易读性高,可以直接使用实体类的属性和方法。
- 缺点:在某些复杂查询操作下可能不支持。
wrapper常用方法
注意点1
- 在写
select()
方法时注意
如果要查询多个字段 ,要将字段放在同一个括号中,以逗号分隔
//分开书写时,select会被覆盖,最后传递的只有getUsername一个条件
//queryWrapper.select(SysUserEntity::getUserId);
//queryWrapper.select(SysUserEntity::getUsername);
queryWrapper.select(SysUserEntity::getUserId , SysUserEntity::getUsername);
注意点2——${ew.customSqlSegment}
${ew.customSqlSegment}
条件占位符 , 其中就有内置 where
关键字
在自定义SQL语句时 ${ew.customSqlSegment}
与 where
不可共存
注意3 : 自定义SQL语句——联合查询
以下提供三种方式
- Mapper文件中定义SQl语句——
join on
+ 条件占位符
//Service层
QueryWrapper<SysGoodsEntity> wrapper = new QueryWrapper<>();
wrapper.eq("u.username","qqq");
List<SysGoodsEntity> list = sysGoodsDao.userAndGoods(wrapper);
//Dao层
List<SysGoodsEntity> userAndGoods(@Param("ew") QueryWrapper<SysGoodsEntity> queryWrapper);
// Mapper文件中
SELECT g.*
FROM sys_goods as g
left join sys_user as u
on g.buyers = u.username
${ew.customSqlSegment}
- Mapper文件中定义SQl语句—— 参数占位符
//Service层
List<SysGoodsEntity> list = sysGoodsDao.userAndGoods("qqq");
//Dao层
List<SysGoodsEntity> userAndGoods(String name);
// Mapper文件中
SELECT g.*
FROM sys_goods as g , sys_user as u
WHERE g.buyers = u.username
AND u.username= #{name}
@select
注解 ——join on
//Service层
QueryWrapper<SysGoodsEntity> wrapper = new QueryWrapper<>();
wrapper.like("u.username","man");
List<SysGoodsEntity> list = sysGoodsDao.userAndGoodsSelect(wrapper);
//Dao层
@Select("SELECT g.* FROM sys_goods as g left join sys_user as u on g.buyers = u.username ${ew.customSqlSegment}")
List<SysGoodsEntity> userAndGoodsSelect(@Param("ew") Wrapper<SysGoodsEntity> queryWrapper);