如何对mybatis +中的查询继续优化

  介绍

今天就跟大家聊聊有关如何对mybatis +中的查询继续优化,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

传统的mybatis +查询写法

对于常规的mybatis单表查询,我们既可以采用LambdaQueryWrapper查询,也可以使用QueryWrapper查询。
LambdaQueryWrapper具有防误写,规范代码等好处,但是缺点是无法在复杂的多表查询中使用。
相比较来说,使用QueryWrapper编写查询更加灵活,可以适应更复杂的查询场景。
我们首先看一个QueryWrapper查询的例子

public  List, list  (UserForm  userForm), {   ,QueryWrapper queryWrapper =, new  QueryWrapper<在();   ,queryWrapper.like (StringTool.isNotEmpty (userForm.getUserName (),“name",, userForm.getUserName ());   ,queryWrapper.eq (StringTool.isNotEmpty (userForm.getMobile (),“mobile",, userForm.getMobile ());//大敌;其它的查询条件……,   ,return  userMapper.selectList (queryWrapper);   }

对于上面的查询语句来说,可以很好的对前端传值进行处理,当userForm中有前端传值的话,就会往SQL语句中加一条,条件。
但是这样做的话会有一个相对来说比较复杂的点,那就是当userForm中的字段过于多的时候,我们也许得写十几行的这种重复判断的语句只,

通过自定义注解来解决通用查询条件过多问题

通过观察mybatis +对于queryWrapper相关查询方法的列子,我们可以找出一类通用方法

如何对mybatis +中的查询继续优化

可以看出来这几个方法都是传的同样的三个参数。
我想对于这些简单的通用的查询条件,也许可以有一个通用的方法来填充。
我首先设置了一个枚举类,将这些查询条件列出来,并在构造方法中,将对应的方法以反射的方式取到只

public  enum  QueryConditionEnum  {   ,   ,情商(“eq"),   ,NE (“ne"),   ,GT (“gt"),   ,通用电气(“ge"),   ,LT (“lt"),   ,勒(“le"),   ,如(“like"),   ,NOT_LIKE (“notLike"),   ,LIKE_LEFT (“likeLeft"),   ,LIKE_RIGHT (“likeRight");   ,   ,private  String 名称;   ,   ,private  Method 方法;   ,   ,   ,QueryConditionEnum  (String 名称),{   this.name 才能=,名称;   try {才能   ,,Method  Method =, AbstractWrapper.class.getDeclaredMethod (boolean.class,名字,还以为,Object.class, Object.class);=,,this.method ;方法;   ,,},catch  (NoSuchMethodException  e), {   ,,}   ,}   ,   }

再者,我想通过注解的方式来规定需要以什么方法填充,默认为情商,对此写了一个QueryCondition注解只,

@Retention (RetentionPolicy.RUNTIME)   @Target ({ElementType.FIELD})   public  @interface  QueryCondition  {   ,/* *   *,才能默认查询方式   *,才能   *才能@return   ,*/,QueryConditionEnum 价值(),default  QueryConditionEnum.EQ;   ,/* *   *,才能是否填充默认查询条件   *,才能   *才能@return   ,*/,boolean  isCondition (), default 真实;   ,   }

然后就可以这样构造UserForm ,

public  class  UserForm  {   ,private  String 名称;   ,   ,@QueryCondition (QueryConditionEnum.LIKE)   ,private  String 移动;   }

我们需要一个工具类填充查询条件,这里我们新增了一个参数mo对象,这是因为我们的主查询对象是密苏里州对象,莫对象存储了相关表格名称,表格字段名信息只,

@TableName (“user")   public  class  UserMo  {   ,@TableField (“name")   ,private  String 名称;   ,   ,@TableField (“mobile")   ,private  String 移动;   } public  class  QueryTool  {   ,/* *   *,才能填充默认查询   *,才能@param  baseClazz 莫对象类   *,才能@param  queryWrapper 查询条件   *,才能@param  form 请求对象   ,*/,public  static  void  paddingDefaultConditionQuery (Class  baseClazz, QueryWrapper  queryWrapper,, Object 形式),{   try {才能   ,,for  (Field  declaredField : form.getClass () .getDeclaredFields ()), {   ,,,declaredField.setAccessible(真正的);   ,,,Object  fieldValue =, declaredField.get(形式);   ,,,QueryCondition  QueryCondition =, declaredField.getAnnotation (QueryCondition.class);   ,,,if  (fieldValue ==, null), {   ,,,,继续;   ,,,}   ,,,if  (queryCondition ==, null), {   ,,,,queryWrapper.eq (StringTool.isNotEmpty (fieldValue.toString ()),   ,,,,,QueryTool.getTableName (baseClazz), +,“干净,+,QueryTool.getTableFieldName (declaredField baseClazz也),   ,,,,,fieldValue.toString ());   ,,,,继续;   ,,,}   ,,,if  (queryCondition.isCondition (),==, false), {   ,,,,继续;   ,,,}   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

如何对mybatis +中的查询继续优化