本篇文章介绍的是一个辅助工具类,用来将model的字段转换成对应的数据库插入语句。
代码
/**
*
*/
package com.cmc.tools.jdbc;
import java.lang.reflect.Field;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import com.cmc.dao.entity.User;
import com.google.common.collect.Lists;
/**
* @desc adb入库工具
* @author cmc
* @email chenmingchuan@all-in-data.com
* @date 2019年8月21日 上午11:23:18
*/
public class AdbCommonInsertSqlTools {
/**
* <p>功能: 生成插入的SQL</p>
* @param tableName 表名
* @param clz 表对应的model运行时类 <br>
* @param replaceMap 需要替换的字段map <br>
* <i>注: 有些字段模型里的名字和数据库里的名字不一致,需要用这个字段指定所需要的名字</i>
* @param excludes 需要排除的字段 <br>
* <i>注: 有些字段模型里有但是数据库里不需要这个字段,需要用这个字段指定要排除的字段名</i>
* @return 生成的SQL
*/
public static String genInsertSql(String tableName, Class<?> clz, Map<String, String> replaceMap
, String[] excludes) {
StringBuilder sb = new StringBuilder() ;
sb.append("insert into ") ;
sb.append(tableName + " (") ;
//获取参数
List<String> params = getParams(clz, replaceMap, excludes) ;
for(String param : params) {
sb.append("," + param) ;
}
sb.append(")") ;
//设置'?'
sb.append(" values (") ;
int size = params.size() ;
while( (size--) > 0) {
sb.append(",?") ;
}
sb.append(")") ;
//替换掉SQL中的第一个逗号','
replceComma(sb) ;
return sb.toString() ;
}
public static String genInsertSql(String tableName, Class<?> clz, Map<String, String> replaceMap) {
return genInsertSql(tableName, clz, replaceMap, new String [] {}) ;
}
/**
* <p>功能: 反射获取model中的所有参数名</p>
* @param clz 模型的运行时类
* @param replaceMap 指定需要替换的参数名
* @param excludes 需要排除的字段
* @param subPartitionName 自定义二级分区名
* @return
*/
private static List<String> getParams(Class<?> clz, Map<String, String> replaceMap, String [] excludes) {
List<String> params = Lists.newArrayList() ;
//获取所有参数
Field[] feilds = clz.getDeclaredFields() ;
for(Field field : feilds) {
String name = field.getName() ;
//排除excludes中的字段
if(excludes != null && isExclude(excludes, name)) {
continue ;
}
//若map中有替换的参数名,则替换
if(replaceMap != null && replaceMap.get(name) != null) {
params.add(replaceMap.get(name)) ;
}else {
params.add(field.getName()) ;
}
}
//按照首字母排序
Collections.sort(params);
//把大写字母前加'_',然后大写转小写
params = toTableFieldNames(params) ;
return params ;
}
/**
* <p>功能: 将model的参数名转换为对应table的参数名,也就是把大写字母前加'_',然后大写转小写</p>
* @param ModelNames 要转换参数名的集合
* @param subPartitionName 自定义二级分区名
* @return 转换后的参数名的集合
*/
private static List<String> toTableFieldNames(List<String> ModelNames) {
List<String> tableNames = Lists.newArrayList() ;
for(String name : ModelNames) {
for(char c : name.toCharArray()) {
if(Character.isUpperCase(c)) {
name = name.replace(c + "", "_" + Character.toLowerCase(c)) ;
}
}
tableNames.add(name) ;
}
return tableNames ;
}
/**
* <p>功能: 替换掉SQL中的第一个逗号','</p>
* @param sb
*/
private static void replceComma(StringBuilder sb) {
//替换掉参数名中的第一个逗号','
int i = sb.indexOf(",") ;
sb.replace(i, i+1, "") ;
//替换掉占位符'?'的第一个逗号','
int j = sb.indexOf(",?") ;
sb.replace(j, j+1, "") ;
}
/**
* @desc 判断是否排除该字段
* @param excludes
* @param name
* @return
*/
private static boolean isExclude(String[] excludes, String name) {
for(String exclude : excludes) {
if(name.equals(exclude))
return true ;
}
return false;
}
public static void main(String[] args) {
String sql = AdbCommonInsertSqlTools.genInsertSql("user", User.class, null, null) ;
System.out.println(sql);
}
}
实例代码
public static void main(String[] args) {
String sql = AdbCommonInsertSqlTools.genInsertSql("user", User.class, null, null) ;
System.out.println(sql);
}
输出结果
insert into user (group,name,nick_name,password,status,tel) values (?,?,?,?,?,?)