sprringboot+mybatis-plus 数据库更新代码生成器(实现部分字段更新)

博客介绍了如何通过Java反射机制创建一个工具类,以自动生成MyBatis的更新和插入SQL语句,从而减少手动编写SQL的繁琐工作,提高开发效率。工具类能够根据实体类的字段动态生成对应SQL,支持字段非空检查。
摘要由CSDN通过智能技术生成

1.因为要在provider中编写更新的代码,还需要实现部分字段更新,懒得写,就通过java的反射机制生成一个sql的生成器,只用于简化更新。也可以稍加修改用于新增

原来的代码(示例)

package com.pgmsg.provider.backend;

import com.pgmsg.pojo.BackendAuth;
import com.pgmsg.pojo.BackendMenu;
import org.apache.ibatis.jdbc.SQL;

public class AuthProvider {

    String TABLE_NAME = "pg_backend_auth";

  

    public String update(BackendAuth auth) {
        return "UPDATE " + TABLE_NAME + " SET" +
                "(title,sort,status,remark,update_time)" +
                "(#{title},#{sort},#{status},#{remark},#{update_time}) WHERE id=#{id}";
    }

  
}

使用工具后的代码

package com.pgmsg.provider.backend;

import com.pgmsg.pojo.BackendAuth;
import com.pgmsg.pojo.BackendMenu;
import com.pgmsg.util.ToolUtil;
import org.apache.ibatis.jdbc.SQL;

public class AuthProvider {

    String TABLE_NAME = "pg_backend_auth";



    public String update(BackendAuth auth) {
        String sqlEnd = "WHERE id=#{id}";
        return ToolUtil.getUpdateSql(auth,TABLE_NAME,sqlEnd);
    }


}

工具类代码(可直接使用)

package com.pgmsg.util;

import org.apache.maven.surefire.shade.org.apache.commons.lang3.StringUtils;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ToolUtil {

    public static final char UNDERLINE = '_';




    public static boolean checkStringNull(String s) {
        return (s != null && s.length() > 0);
    }

   

    //驼峰转下划线
    public static String camelToUnderline(String param, Integer charType) {
        if (param == null || "".equals(param.trim())) {
            return "";
        }
        int len = param.length();
        StringBuilder sb = new StringBuilder(len);
        for (int i = 0; i < len; i++) {
            char c = param.charAt(i);
            if (Character.isUpperCase(c)) {
                sb.append(UNDERLINE);
            }
            if (charType == 2) {
                sb.append(Character.toUpperCase(c));  //统一都转大写
            } else {
                sb.append(Character.toLowerCase(c));  //统一都转小写
            }


        }
        return sb.toString();
    }

    //下划线转驼峰
    public static String underlineToCamel(String param) {
        if (param == null || "".equals(param.trim())) {
            return "";
        }
        int len = param.length();
        StringBuilder sb = new StringBuilder(len);
        boolean flag = false; // "_" 后转大写标志,默认字符前面没有"_"
        for (int i = 0; i < len; i++) {
            char c = param.charAt(i);
            if (c == UNDERLINE) {
                flag = true;
                //标志设置为true,跳过
            } else {
                if (flag) {
                    //表示当前字符前面是"_" ,当前字符转大写
                    sb.append(Character.toUpperCase(param.charAt(i)));
                    flag = false;  //重置标识
                } else {
                    sb.append(Character.toLowerCase(param.charAt(i)));
                }
            }
        }
        return sb.toString();
    }

    /*生成更新语句*/
    public static String getUpdateSql(Object pojo, String tableName, String sqlEnd) {
        String sqlStart = "UPDATE " + tableName + " SET";
        List<String> list = new ArrayList<>();
        //获得某个类的所有声明的字段,即包括public、private和protected,但是不包括父类的申明字段。
        Field[] fields = pojo.getClass().getDeclaredFields();
        for (Field s : fields) {
            String name = s.getName();
            //拼出方法尾部
            String funcTail = name.substring(0, 1).toUpperCase().concat(name.substring(1));

            //获取字段类型
            String type = s.getGenericType().toString();

            try {
                Method method = pojo.getClass().getMethod("get" + funcTail);

               ;

                switch (type) {
                    case "class java.lang.String": {
                        String s1 = (String) method.invoke(pojo);
                        //字段非空 进入更新字段 前面是下划线 后面是驼峰式
                        if (checkStringNull(s1)) {
                            String line = camelToUnderline(name, 1);
                            list.add(line + "=#{" + name + "}");
                        }
                        break;
                    }
                    case "long":
                    case "int": {
                        Number s1 = (Number) method.invoke(pojo);
                        //字段非空 进入更新字段 前面是下划线 后面是驼峰式
                        if (s1 != null&& s1.intValue() != 0) {
                            String line = camelToUnderline(name, 1);
                            list.add(line + "=#{" + name + "}");
                        }
                        break;
                    }
                }

            } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
                e.printStackTrace();
            }

        }

        String middleSql = StringUtils.join(list.toArray(), ",");

        return sqlStart + " " + middleSql + " " + sqlEnd;
    }

    /*生成新增语句*/
    public static String getInsertSql(Object pojo, String tableName) {
        String sqlStart = "INSERT INTO " + tableName+" ";
        List<String> list = new ArrayList<>();
        List<String> listValue = new ArrayList<>();
        //获得某个类的所有声明的字段,即包括public、private和protected,但是不包括父类的申明字段。
        Field[] fields = pojo.getClass().getDeclaredFields();
        for (Field s : fields) {
            String name = s.getName();
            //拼出方法尾部
            String funcTail = name.substring(0, 1).toUpperCase().concat(name.substring(1));

            //获取字段类型
            String type = s.getGenericType().toString();

            try {
                Method method = pojo.getClass().getMethod("get" + funcTail);

               //;

                switch (type) {
                    case "class java.lang.String": {
                        String s1 = (String) method.invoke(pojo);
                        //字段非空 进入更新字段 前面是下划线 后面是驼峰式
                        if (checkStringNull(s1)) {
                            String line = camelToUnderline(name, 1);
                            list.add(line);
                            listValue.add("#{" + name + "}");
                        }
                        break;
                    }
                    case "long":
                    case "int": {
                        Number s1 = (Number) method.invoke(pojo);
                        //字段非空 进入更新字段 前面是下划线 后面是驼峰式
                        if (s1 != null&& s1.intValue() != 0) {
                            String line = camelToUnderline(name, 1);
                            list.add(line);
                            listValue.add("#{" + name + "}");
                        }
                        break;
                    }
                }

            } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
                e.printStackTrace();
            }
        }

        String middleSql = StringUtils.join(list.toArray(), ",");
        String valueSql = StringUtils.join(listValue.toArray(), ",");
        return sqlStart + "(" + middleSql + ")" + " VALUES " + "(" + valueSql + ")";
    }
}

测试打印

UPDATE pg_backend_admin SET password=#{password},create_time=#{createTime} WHERE id=#{id}


INSERT INTO pg_backend_admin (password,create_time) VALUES (#{password},#{createTime})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值