首页 > 其他分享 >MyBatis-plus 自动生成 条件构造器 QueryWrapper

MyBatis-plus 自动生成 条件构造器 QueryWrapper

时间:2024-05-22 15:55:13浏览次数:27  
标签:QueryWrapper value plus wrapper MyBatis fieldName param 字段名

背景

在使用Wrapper构建条件时,经常因为需要构建的条件过多需要写半个多小时,还容易粗心写错字段,所以就想搞个可以直接自动构建QueryWrapper的工具类。

思路

我们需要一个方法,能够根据条件参数对象的属性值来设置QueryWrapper的条件,同时需要返回一个我们所需要对应范型的QueryWrapper。

使用范型来确定返回的QueryWrapper的范型,使用反射来获取参数类中的属性值,同时需要区分字段的类型来确定选择该字段使用哪种查询方式。

实现

再获取字段名的时候有可能参数类的字段名不能直接根数据库表的字段名直接对应上,所以我直接复用了@TableField 注解,若是字段上有该注解就直接使用其对应的value属性值,若是没有该注解则就使用字段名,将字段名的驼峰命名法转换成下划线分割的格式。

    /**
     * 创建对应的wrapper
     * @param param 参数对象
     * @param <T> 范型
     * @return 创建好的wrapper
     */
    public static <T> QueryWrapper<T> createWrapper(Object param) {
        QueryWrapper<T> wrapper = new QueryWrapper<>();
        Class<?> dataClass = param.getClass();
        try {
            for (Field field : dataClass.getDeclaredFields()) {
                field.setAccessible(true);
                //获取字段类型和字段值
                Class<?> type = field.getType();
                Object value = field.get(param);
                if (value == null){
                    continue;
                }
                //将字段名转为数据库中的字段名
                String fieldName;
                TableField tableFieldAnnotation = field.getAnnotation(TableField.class);
                if (tableFieldAnnotation != null) {
                    fieldName = tableFieldAnnotation.value();
                }else{
                    fieldName = convertToSnakeCase(field.getName());
                }
                //根据字段的类型来选择不同的查询方式
                if (type == String.class) {
                    wrapper.like(fieldName, value);
                }else if (type == Long.class){
                    wrapper.eq(fieldName, value);
                }else if (type == List.class){
                    wrapper.in(fieldName, (List<?>)value);
                }else if (type == Between.class){
                    Between val= (Between)value;
                    wrapper.between(fieldName, val.getStart(), val.getEnd());
                }else{
                    wrapper.eq(fieldName, value);
                }
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return wrapper;
    }


    /**
     * 将驼峰命名法的字段名转为下划线隔开的形式
     * @param input 驼峰命名法的字段名
     * @return 下划线隔开的数据库字段名
     */
    private static String convertToSnakeCase(String input) {
        StringBuilder output = new StringBuilder();
        for (int i = 0; i < input.length(); i++) {
            char ch = input.charAt(i);
            if (Character.isUpperCase(ch)) {
                if (i > 0) {
                    output.append(StrPool.C_UNDERLINE);
                }
                output.append(Character.toLowerCase(ch));
            } else {
                output.append(ch);
            }
        }
        return output.toString();
    }

测试

可以看到dto参数对象的属性值都已经填充到了QueryWrapper中

标签:QueryWrapper,value,plus,wrapper,MyBatis,fieldName,param,字段名
From: https://www.cnblogs.com/gzqq/p/18206422

相关文章

  • mybatis中进行value的排序无效
    原因是:在MySQL中,如果value是一个字符串,那么在ORDERBY语句中进行降序排序时,MySQL会根据字符串的字典顺序来排序,而不是数值大小。这意味着字符串会按照首字符的ASCII值进行比较,例如,"100"会排在"2"前面,因为在ASCII码中,"1"的值小于"2"的值。解决:可以在mybatis中进行value的类型修改;......
  • Ement-Plus框架的列表table导出excel数据表
    1.页面预览2.搜索条件区域code <!--查询--><divclass="table-container"><el-form:inline="true":model="queryForm"class="query-form"ref="queryFormRef"><el-form-itemlabe......
  • Spring Boot —— 集成 MyBatis-Plus
    项目基于SpringBoot3.2.5Pom需要注意的是,引用Mybatis-Plus依赖,无需手动引入Mybatis<!--https://mvnrepository.com/artifact/com.mysql/mysql-connector-j--><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</......
  • mybatis底层模板模型是什么
    mybatis底层模板模型是建造者模式和模板方法模式的结合。建造者模式用于创建SqlSessionFactory和SqlSession对象。模板方法模式用于执行SQL语句和处理结果集。mybatis是对JDBC的再一次封装,不管怎么进行包装,还是会有获取连接、preparedStatement、封装参数、执行这些步骤......
  • Spring是如何整合MyBatis将Mapper接口注册为Bean的原理
    一、接口生成bean定义1.首先MyBatis的Mapper接口核心是JDK动态代理2.Spring会排除接口,无法注册到IOC容器中3.MyBatis实现了BeanDefinitionRegistryPostProcessor可以动态注册BeanDefinition4.需要自定义扫描器(继承Spring内部扫描器ClassPathBeanDefinitionScan......
  • oracle sqlplus
    在逻辑结构中,Oracle从大到下,分别是如下的结构:数据库实例->表空间->数据段(表)->区->块。也就是说当我们要使用Oracle作为项目的数据库时,我们需要先创建数据库实例,之后创建表空间,再创建相对应的表(也就是逻辑结构中的数据段)。一、创建数据库实例创建数据库实例一般使用“配......
  • 【Mybatis/Mybaits-Plus】【插件】插件执行时机
    1 前言我之前看过插件的执行过程:【Mybatis】【插件】Mybatis源码解析-插件机制,主要是通过一个 Executor的创建以及执行过程串了一下插件,我们这里简单回忆下:(1)Mybatis把所有的插件都放进了 InterceptorChain类里的 interceptors集合里(2)插件的两个时机:入场时机:插件是在......
  • java+mybatis+easyExcel快速导入excel数据到MySQL
    这里有一些数据需要导入数据库。demo地址:importExcel使用步骤如下:一、修改database相关内容 1.修改application.properties文件中数据库地址及信息二、新建实体类1.新建excel数据所符合的实体类,这里举例Excel中有如下数据,表头字段为“username”。数据......
  • shiro 整合Mybatis
    就是将之前一步自己模拟的数据要换成从数据库中查出来的真实数据导入mybatis相关依赖<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>mysql</groupId><......
  • element-plus丑陋的使用
     所花时间(包括上课): 4 h代码量(行): 400   左右搏客量(篇):1了解到的知识点: element-plus的使用备注(其他): <template><div><el-form:model="form":rules="rules"ref="form"label-width="100px">......