首页 > 其他分享 >利用反射生成 MyBatisPlus中QueryWrapper动态条件

利用反射生成 MyBatisPlus中QueryWrapper动态条件

时间:2023-10-17 18:31:36浏览次数:41  
标签:QueryWrapper userQuery MyBatisPlus queryWrapper res UserQuery 反射 null eq

问题描述

在MyBatisPlus中经常会用到构造复杂查询条件的情况,比如:

  • 测试代码
@SpringBootTest
class Query2WrapperTest {
    @Resource
    private UserMapper userMapper;

    @Test
    void fun() {
        UserQuery userQuery = UserQuery.builder()
                .state(1)
                .gender(0)
                .info("中")
                .build();

        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        qeury2Wrapper(userQuery, queryWrapper);


        List<User> list = userMapper.selectList(queryWrapper);
        list.forEach(System.out::println);
    }
  • 构造查询条件
    private void qeury2Wrapper(UserQuery userQuery, QueryWrapper<User> queryWrapper) {
        if (userQuery == null || queryWrapper == null) {
            return;
        }
        //将UserQuery的值赋到queryWrapper中
        if (userQuery.getId() != null) {
            queryWrapper.eq("id", userQuery.getId());
        }
        if (userQuery.getNickname() != null) {
            queryWrapper.like("nickname", userQuery.getNickname());
        }
        if (userQuery.getGender() != null) {
            queryWrapper.eq("gender", userQuery.getGender());
        }

        if (userQuery.getBirthMin() != null) {
            queryWrapper.ge("birth", userQuery.getBirthMin());
        }
        if (userQuery.getBirthMax() != null) {
            queryWrapper.le("birth", userQuery.getBirthMax());
        }
        if (userQuery.getEmail() != null) {
            queryWrapper.eq("email", userQuery.getEmail());
        }

        if (userQuery.getTel() != null) {
            queryWrapper.eq("tel", userQuery.getTel());
        }
        if (userQuery.getAccount() != null) {
            queryWrapper.eq("account", userQuery.getAccount());
        }
        if (userQuery.getInfo() != null) {
            queryWrapper.like("info", userQuery.getInfo());
        }
        if (userQuery.getState() != null) {
            queryWrapper.eq("state", userQuery.getState());
        }
    }

像上面这种手写转换不仅繁琐,而且容易出错,其实采用借助反射或内省的方式提取公共类,简化代码的书写。

反射方式

    private void qeury2Wrapper2(UserQuery userQuery, QueryWrapper<User> queryWrapper) throws Exception {
        Method[] methods = userQuery.getClass().getDeclaredMethods();
        for (Method method : methods) {
            String methodName = method.getName();
            if (methodName.contains("get")) {
                Object res = method.invoke(userQuery, null);
                if (res != null) {
                    String columnName = getColumnName(methodName);
                    queryWrapper.like(columnName, res);
                }
            }
        }
    }

内省方式

 private void qeury2Wrapper3(UserQuery userQuery, QueryWrapper<User> queryWrapper) throws Exception {
        BeanInfo beanInfo = Introspector.getBeanInfo(userQuery.getClass());
        PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
        for (PropertyDescriptor pd : pds) {
            Method readMethod = pd.getReadMethod();
            if (readMethod.getName().equals("getClass")) {
                continue;
            }
            Object res = readMethod.invoke(userQuery, null);
            if (res != null) {
                String columnName = getColumnName(readMethod.getName());
                queryWrapper.like(columnName, res);
            }

        }
    }

公共代码

上面反射和内省用到的公共代码:

    private static String getColumnName(String name) {
        StringBuffer sb = new StringBuffer();
        name = name.substring(3, name.length()); //去掉get前缀
        char[] chars = name.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            char item = chars[i];
            if (item > 65 && item < 90) {//大写字母
                sb.append("_");
                sb.append((char) (item + 32));
            } else {
                sb.append(item);
            }
        }
        return sb.deleteCharAt(0).toString();
    }

标签:QueryWrapper,userQuery,MyBatisPlus,queryWrapper,res,UserQuery,反射,null,eq
From: https://blog.51cto.com/lianghecai/7908489

相关文章

  • mybatisplus3.5.3版本,数据权限如何使用
    1、添加依赖<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.......
  • [转]go语言函数装饰器,接口类型变量反射赋值
     转:原文:https://juejin.cn/post/7115343063119036453------------------------ 函数装饰做基础组件经常需要用到函数修饰,例如我需要对所有被装饰方法里打印start、end。已知函数签名的装饰我们经常用的函数装饰器一般都是知道被装饰的方法的签名,然后返回一个同签名的方......
  • MybatisPlus的动态表名插件
          ......
  • 利用Transform 画一个图像的反射,倒影
    例子:Snippet279publicclassSnippet279{ publicstaticvoidmain(String[]args){ Displaydisplay=newDisplay(); Shellshell=newShell(display,SWT.SHELL_TRIM|SWT.DOUBLE_BUFFERED); shell.setLayout(newFillLayout()); finalImageimage=d......
  • mybatisplus根据两个字段进行更新或新增
    注意:使用@Builder注解时,要加上无参构造器,否则无法更新 @Override@TransactionalpublicvoidsaveManufacturerInfo(List<Manufacturer>manufacturerList){List<ManufacturerMap>codeNameMapping=manufacturerList.stream().map(item->ManufacturerMap.......
  • java项目使用Mybatis-Plus插件,QueryWrapper日期开始-结束范围查询
    1、参数开始日期startTime、结束日期endTime挺好用,开始日期、结束日期当天都包含进去了,如果使用qw.between("create_time",startTime,endTime)方法是不含endTime结束日期当天的qw.apply(bCulresCardMvVO.getStartTime()!=null,"date_format(create_time,......
  • 反射
    1.认识反射1.1常见的反射场景1)编写一个函数,但是并不知道要传的参数类型是什么;也可能是传入的类型很多,这些类型并不能统一表示2)根据某些条件决定调用哪个函数,比如根据用户的输入来决定。这时就需要对函数和函数的参数进行反射,在运行期间动态地执行函数1.2反射可能带来的问题......
  • Kotlin反射从父类获取子类成员属性
    背景有部分需求需要反射获取相关信息,例如,由于子类太多100+,需要在父类写toString方法涵盖子类的相关信息实现过程逻辑通过反射获取子类构造方法的参数通过当前实例调用参数的获取方法,获取参数值在父类的toString中输出和组建toString代码获取构造方法的参数valpc=t......
  • 组合 反射 抛出异常
    1.组合组合:把另外一个类的对象属性赋值给当前对象的属性首先要明白什么是什么的区别为什么要继承父类比如三个类老师类学生类课程类;虽然老师和学生有课程但是老师和学生是课程吗?还是老师和同学是课程"""isa的关系代表的是继承的关系和什么有什......
  • 组合,反射,魔术方法
    组合,反射,魔术方法组合反射魔术方法组合什么是组合? 组合就是,一个对象拥有一个属性,该属性的值是另外一个对象."""什么场景下使用继承?什么场景下使用组合?"""继承一般情况用在:什么是什么的情况is组合一般用在:什么有什么的情况hasclassFoo:def__init__(sel......