通用jdbc插入SQL生成工具

本篇文章介绍的是一个辅助工具类,用来将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 [email protected]
 * @date 2019年8月21日 上午11:23:18
 */
public class AdbCommonInsertSqlTools {
	
	/**
	 * 

功能: 生成插入的SQL

* @param tableName 表名 * @param clz 表对应的model运行时类
* @param replaceMap 需要替换的字段map
* 注: 有些字段模型里的名字和数据库里的名字不一致,需要用这个字段指定所需要的名字 * @param excludes 需要排除的字段
* 注: 有些字段模型里有但是数据库里不需要这个字段,需要用这个字段指定要排除的字段名 * @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 [] {}) ; } /** *

功能: 反射获取model中的所有参数名

* @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 ; } /** *

功能: 将model的参数名转换为对应table的参数名,也就是把大写字母前加'_',然后大写转小写

* @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 ; } /** *

功能: 替换掉SQL中的第一个逗号','

* @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 (?,?,?,?,?,?)
 

你可能感兴趣的:(java基础)