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})