当前位置: 代码网 > it编程>编程语言>Java > MyBatis-plus 自动生成 条件构造器 QueryWrapper

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

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

背景

在使用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中

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com