通用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 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 (?,?,?,?,?,?)
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、简介 1.1前言 1、由于最近工作一直用Oracle,故对Oracle数据库研究为对象。 2、根据工作业务需求实际情况进行功能研发。为什么要开发呢?因为在数据库升级或者迁移的时候,为了保证不同环境不同数据库数据保持同步,故数据库SQL脚本非常作用。比如:数据库主脚本,副脚本,增量脚本。 3、 什么是主脚本、副脚本、增量脚本呢? 3.1、主脚本指数据库表或存储过程,视图脚本,序列等脚本。 3.2、副脚本指必须执行主脚本之后才执行的脚本。换句话说在没执行主键脚本的情况下,副脚本执行之后会回滚事务失败。 3.3、增量脚本指在执行主脚本或副脚本之后,根据需求对某个表添加/修改约束(主外键约束,长度约束等),添加/修改字段/添加数据等情况对数据库结构改变处理的一种行为脚本。 1.2作用 1、 快速产出自定义规则需要的SQL脚本。 2、减少人工编写SQL脚本出错率问题,完全通过程序检测SQL准确性。 3、帮助开发人员提高SQL编写效率,减少人工编写SQL开发成本问题。 4、帮助开发人员节约时间,同时避免繁琐不必要编写SQL的工作。 二、实现方式与原理 2.1实现方式 1、实现方式分:正向与逆向实现。什么是正向与逆行呢【是否有鸡还是有蛋,先后道理同等】 2、正向方式:首先把设计好数据库表文档,把所有表的字段属性配置到EXCEL或者CSV格式的文件通过JXL/POI技术去读取文件的字段,再通过其他技术一系列程序处理之后生成所需要的SQL脚本。 3、逆向方式:首先有数据库表,然后通过ORM持久化技术连接数据库再读取表的字段等属性出来,再通过其他技术一系列程序处理之后生成所需要的SQL脚本。 2.2原理 对数据库软件内置核心表或视图查询出来存储用户行为表结构所有属性信息,对此属性结构信息进行分析与组装所需要SQL脚本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值