你应该知道的这些Mybatis-Plus使用技巧(小结)
最近在用Mybatis-Plus,嗯,真香!!!今天就来说说Mybatis-Plus的那些使用技巧
1、条件查询(QueryWrapper)
如果说,我们需要查询的SQL语句如下:
SELECT*FROMuser_infoWHERE1=1ANDage=20
那么对应的代码可以为:
QueryWrapperqueryWrapper=newQueryWrapper<>(); queryWrapper.eq("age",20); List list=userInfoMapper.selectList(queryWrapper);
以上就是查询用户表,用户年龄大于20的用户信息
2、条件查询(QueryWrapperlambda)
QueryWrapperqueryWrapper=newQueryWrapper<>(); queryWrapper.lambda().eq(UserInfo::getAge,20); List list=userInfoMapper.selectList(queryWrapper);
以上就是QueryWrapper的lambda表达式写法,这样能够避免写字段名写错,或者未转换驼峰写法导致SQL错误
3、条件查询(LambdaQueryWrapper)
LambdaQueryWrapperqueryWrapper=newLambdaQueryWrapper<>(); queryWrapper.eq(UserInfo::getAge,20); List list=userInfoMapper.selectList(queryWrapper);
LambdaQueryWrapper与QueryWrapper的lambda写法基本一致
4、分页查询
//条件查询 LambdaQueryWrapperqueryWrapper=newLambdaQueryWrapper<>(); queryWrapper.eq(UserInfo::getAge,20); //分页对象 Page queryPage=newPage<>(page,limit); //分页查询 IPage iPage=userInfoMapper.selectPage(queryPage,queryWrapper); //数据总数 Longtotal=iPage.getTotal(); //用户数据 List list=iPage.getRecords();
以上就是分页查询,如果无需条件查询,queryWrapper可为null
5、分页查询(联表)
当我们需要关联表格分页查询时,第3步已经满足不了我们的需求了,那么我们需要进行联表分页查询
假设我们需要的SQL语句如下:
SELECT a.*, b.`name`ASsex_text FROM user_infoa LEFTJOINuser_sexbON(a.sex=b.id) WHERE 1=1 ANDa.age>20
那么我们需要进行如下操作:
1、新建UserInfoVO.java
importcom.zyxx.entity.UserInfo; importlombok.Data; @Data publicclassUserInfoVOextendsUserInfo{ //性别 privateStringsexText; }
2、UserInfoMapper.java中
IPagelist(Page page,@Param(Constants.WRAPPER)Wrapper queryWrapper);
3、UserInfoMapper.xml中
SELECT a.*, b.`name`ASsex_text FROM user_infoa LEFTJOINuser_sexbON(a.sex=b.id) ${ew.customSqlSegment}
4、UserInfoServiceImpl.java中
//条件查询 LambdaQueryWrapperqueryWrapper=newLambdaQueryWrapper<>(); queryWrapper.eq(UserInfo::getAge,20); //分页对象 Page queryPage=newPage<>(page,limit); //分页查询 IPage iPage=userInfoMapper.list(queryPage,queryWrapper); //数据总数 Longtotal=iPage.getTotal(); //用户数据 List list=iPage.getRecords();
以上就是分页查询(联表)时的操作,这个应该是用的比较多的
6、AND和OR
queryWrapper默认是按照and来连接的,但是在我们业务需求中,肯定会用到or来写SQL
1、初级
假设我们需要的SQL语句如下:
SELECT a.* FROM user_infoa WHERE 1=1 ANDa.id<>1 AND(a.`name`='jack'ORa.phone='13888888888')
那么我们可以这样写:
LambdaQueryWrapperqueryWrapper=newLambdaQueryWrapper<>(); //ANDa.id<>1 queryWrapper.ne(UserInfo::getId,"1"); //AND(a.`name`='jack'ORa.phone='13888888888') queryWrapper.and(i->i.eq(UserInfo::getName,"jack").or().eq(UserInfo::getPhone,"13888888888")); //查询结果 List list=userInfoMapper.selectList(queryWrapper);
以上就完成了初级的and和or联用的情况
2、复杂
假设我们需要的SQL语句如下:
SELECT a.* FROM user_infoa WHERE 1=1 ANDa.id<>1 AND((a.`name`='jack'ANDa.category=1)OR(a.phone='13888888888'ORa.category=2))
那么我们可以这样写:
LambdaQueryWrapperqueryWrapper=newLambdaQueryWrapper<>(); //ANDa.id<>1 queryWrapper.ne(UserInfo::getId,"1"); //AND((a.`name`='jack'ANDa.category=1)OR(a.phone='13888888888'ORa.category=2)) queryWrapper.and(i->(i.and(j->j.eq(UserInfo::getName,"jack").eq(UserInfo::getCategory,1))).or(j->j.eq(UserInfo::getPhone,"13888888888").eq(UserInfo::getCategory,2))); //查询结果 List list=userInfoMapper.selectList(queryWrapper);
以上就完成了复杂的and和or联用的情况
那么以后遇见更复杂的,可以按此规则继续进行拼接SQL
7、@TableLogic
这个注解是Mybatis-Plus的逻辑删除标志,一般注解在实体的属性上,假如我的用户信息表,用一个字段(del_flag)用来表示数据的删除状态,如下:
@ApiModelProperty(value="删除状态(0--未删除1--已删除)") @TableField("del_flag") @TableLogic privateIntegerdelFlag;
Mybatis-Plus默认使用0表示有效,1表示无效,当然也可以自定义,有两种方式:
1、注解上
@ApiModelProperty(value="删除状态(0--未删除1--已删除)") @TableField("del_flag") @TableLogic(value="1",delval="0") privateIntegerdelFlag;
value=“”默认的原值,delval=“”删除后的值
2、配置文件
#mybatis配置 mybatis-plus: #全局配置 global-config: db-config: #逻辑删除全局字段(默认无设置会自动扫描实体字段) logic-delete-field:delFlag #逻辑删除全局值(默认1、表示已删除) logic-delete-value:1 #逻辑未删除全局值(默认0、表示未删除) logic-not-delete-value:0
那么,我们在查询数据的时候,会自动为我们加上查询条件
ANDdel_flag=0
这时候逻辑删除生效,当我们执行userInfoMapper.removeById(id)时,也不会物理删除,实际执行的SQL如下:
UPDATEuser_infosetdel_flag=1whereid=#{id}
注意:自己在xml文件中写的SQL不会自动加上逻辑删除条件
7、指定查询字段(select)
当我们只需要查询表格中的某几个字段,如果表格数据很大的话,我们不应该查询表格的所有字段,假如,我们需要的SQL如下:
SELECT id, `name`, phone FROM user_info WHERE 1=1 ANDage=20
我们只需要查询年龄等于20的用户的id、name、phone,所以,可以这样写
LambdaQueryWrapperqueryWrapper=newLambdaQueryWrapper<>(); //只查询id,name,phone queryWrapper.select(UserInfo::getId,UserInfo::getName,UserInfo::getPhone); //查询条件为:age=20 queryWrapper.eq(UserInfo::getAge,20); List list=userInfoMapper.selectList(queryWrapper);
这样,我们就需要查询表中所有字段的数据,大大缩短了查询时间
8、查询一条数据(getOne)
getOne是service中的方法,当我们使用getOne查询一条数据返回的时候,我们往往不是用主键ID去查询,如果用主键ID查询一条数据,我们应该使用:
UserInfouserInfo=userInfoService.getById(id);
假如我们用户表中有openId字段,例如:微信用户,这个肯定是唯一的,我们需要使用openId查询一条用户信息,我们通常使用:
LambdaQueryWrapperqueryWrapper=newLambdaQueryWrapper<>(); queryWrapper.eq(UserInfo::getOpenId,openId); UserInfouserInfo=userInfoService.getOne(queryWrapper);
但是这样存在一定的风险,也就是说如果表中存在同一个openId的两条及两条以上的数据时,会抛出异常,所以我们需要这样:
LambdaQueryWrapperqueryWrapper=newLambdaQueryWrapper<>(); queryWrapper.eq(UserInfo::getOpenId,openId); UserInfouserInfo=userInfoService.getOne(queryWrapper,false);
可以看出,传入了一个false参数,该参数的含义为:
- 据Wrapper,查询一条记录
- 有多个result是否抛出异常
通过查看源码:
@Override publicTgetOne(WrapperqueryWrapper,booleanthrowEx){ if(throwEx){ returnbaseMapper.selectOne(queryWrapper); } returnSqlHelper.getObject(log,baseMapper.selectList(queryWrapper)); }
如果传入的是true(默认值),则不作处理进行查询,否则进行分页查询,再看getObject()方法中:
/** *从list中取第一条数据返回对应List中泛型的单个结果 * *@paramlistignore *@paramignore *@returnignore */ publicstatic EgetObject(Loglog,List list){ if(CollectionUtils.isNotEmpty(list)){ intsize=list.size(); if(size>1){ log.warn(String.format("Warn:executeMethodThereare%sresults.",size)); } returnlist.get(0); } returnnull; }
默认取第一条数据返回,所以当我们查询为多条数据时,默认返回第一条
到此这篇关于你应该知道的这些Mybatis-Plus使用技巧(小结)的文章就介绍到这了,更多相关Mybatis-Plus使用技巧内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。