JDBCSQL语句生成助手封装助手

17 篇文章 0 订阅

用惯框架,来让你写一下JDBC的插入与封装,会让你崩溃的,哈哈,正在做JDBC项目,就现写了个JDBC助手,派上了大用场,呵呵


/**
 * @Version: 1
 * @JDK: jdk 1.7
 * @Module: myhrm

 * 2012-7-15 - 上午12:13:57 Created by Sharp
 */ 

 /*- 				History
 **********************************************
 *  ID      DATE           PERSON       REASON
 *  1     2012-7-15         Sharp        Created
 **********************************************
 */

package com.sharp.hrm.util;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;



/**
 * 测试元数据
 * */
public class ResultSetMetaData_Test {
	private static Connection conn;
	private static final String TABLENAME = "hrm_user" ;//表名
	private static final String entityClassString = "user"; //对象句柄

	@BeforeClass
	public static void setUp(){
		conn = ConnectionFactory.getConnection();
		System.out.println("conn---->" + conn);
	}
	@Test
	public void showMetadata() throws SQLException {
		DatabaseMetaData md = conn.getMetaData();
		//获取底层数据库的主版本号。
		System.out.println("getDatabaseMajorVersion:  "
				+ md.getDatabaseMajorVersion());

		//底层数据库的次版本号。
		System.out.println("getDatabaseMinorVersion:  "
				+ md.getDatabaseMinorVersion());

		// 获取此数据库产品的名称。
		System.out.println("getDatabaseProductName:  "
				+ md.getDatabaseProductName());

		// 获取此数据库产品的版本号。
		System.out.println("getDatabaseProductVersion:  "
				+ md.getDatabaseProductVersion());

		//获取此数据库的默认事务隔离级别。
		System.out.println("getDefaultTransactionIsolation:  "
				+ md.getDefaultTransactionIsolation());

		//获取此 DBMS 的 URL。
		System.out.println("getURL:  " + md.getURL());

		// 获取此数据库的已知的用户名称。
		System.out.println("getUserName:  " + md.getUserName());
		


	}
	
	@Test
	public void showMeatdataOfTable()  
            throws SQLException {  
        Statement stm = conn.createStatement();  
        ResultSet rs = stm.executeQuery("select * from " + TABLENAME);  
        //可用于获取关于 ResultSet 对象中列的类型和属性信息的对象  
        ResultSetMetaData rmsds = rs.getMetaData();  
        //返回此 ResultSet 对象中的列数。  
        int count = rmsds.getColumnCount();  
        if(rs.next()){  
            for (int i = 1; i <= count; i++) {  
                // 获得列名和数据类型  
                System.out.print("列名: " + rmsds.getColumnName(i) + "\t");  
                System.out.print("数据类型: " + rmsds.getColumnTypeName(i) + "\t");  
                System.out.print("字段值: " + rs.getObject(rmsds.getColumnName(i)));  
                System.out.println();  
            }  
            System.out.println();  
        }  
    }  
	/**
	 * 获得表的数据信息:
 	 * 		INSERT INTO hrm_employee(id, NAME, depEmpName, remark, ) VALUES(?,?,?,?,)
	 * 获取INSERT 语句
	 * @param con
	 * @param tablename
	 * @throws SQLException
	 */
	@Test
	public void showMeatdataOfTable_INSERT()
			throws SQLException {
		Statement stm = conn.createStatement();
		ResultSet rs = stm.executeQuery("select * from " + TABLENAME);
		//可用于获取关于 ResultSet 对象中列的类型和属性信息的对象
		ResultSetMetaData rmsds = rs.getMetaData();
		//返回此 ResultSet 对象中的列数。
		int count = rmsds.getColumnCount();
		if(rs.next()){
			StringBuffer sb = new StringBuffer();
			sb.append("INSERT INTO hrm_employee(");
			for (int i = 1; i <= count; i++) {
				// 获得列名和数据类型
				if(!"id".equals(rmsds.getColumnName(i))){
					if(i != count){
						sb.append(rmsds.getColumnName(i) + ", ");
					}else{
						sb.append(rmsds.getColumnName(i));
					}
				}
				
			}
			sb.append(") VALUES(");
			for (int i = 1; i <= count; i++) {
				// 获得列名和数据类型
				if(!"id".equals(rmsds.getColumnName(i))){
					if(i != count){
						sb.append("?,");
					}else{
						sb.append("?");
					}
					
				}
			}
//			sb.setCharAt(sb.length(), '');
			sb.append(")");
			System.out.println(sb.toString());
		}
	}
	/**
	 * 获得表的数据信息:
	 * 	dept.getId(), dept.getNAME(), dept.getDepEmpName(), dept.getRemark(), 
	 *
	 * 获取设值  语句
	 * @param con
	 * @param tablename
	 * @throws SQLException
	 */
	@Test
	public void showMeatdataOfTable_SETVALUES()
			throws SQLException {
		Statement stm = conn.createStatement();
		ResultSet rs = stm.executeQuery("select * from " + TABLENAME);
		//可用于获取关于 ResultSet 对象中列的类型和属性信息的对象
		ResultSetMetaData rmsds = rs.getMetaData();
		//返回此 ResultSet 对象中的列数。
		int count = rmsds.getColumnCount();
		if(rs.next()){
			StringBuffer sb = new StringBuffer();
			for (int i = 1; i <= count; i++) {
				// 获得列名和数据类型
				if(i != count){
					sb.append(entityClassString + ".get" + rmsds.getColumnName(i).substring(0,1).toUpperCase() + rmsds.getColumnName(i).substring(1)  + "(), ");
				}else{
					sb.append(entityClassString + ".get" + rmsds.getColumnName(i).substring(0,1).toUpperCase() + rmsds.getColumnName(i).substring(1)  + "()");
				}
				
			}
			System.out.println(sb.toString());
		}
	}
	/**
	 * 
	 * 获取更新  语句
	 * @param con
	 * @param tablename
	 * @throws SQLException
	 */
	@Test
	public void showMeatdataOfTable_UPDATE()
			throws SQLException {
		Statement stm = conn.createStatement();
		ResultSet rs = stm.executeQuery("select * from " + TABLENAME);
		//可用于获取关于 ResultSet 对象中列的类型和属性信息的对象
		ResultSetMetaData rmsds = rs.getMetaData();
		//返回此 ResultSet 对象中的列数。
		int count = rmsds.getColumnCount();
		if(rs.next()){
			StringBuffer sb = new StringBuffer();
			sb.append("UPDATE SET ");
			for (int i = 1; i <= count; i++) {
				// 获得列名和数据类型
				if(!"id".equals(rmsds.getColumnName(i))){
					if(i != count){
						sb.append(rmsds.getColumnName(i)  + " = ? ,");
					}else{
						sb.append(rmsds.getColumnName(i)  + " = ?");
					}
				}
				
			}
			sb.append(" WHERE id = ? ");
			System.out.println(sb.toString());
		}
	}
	/**
	 * 
	 * 获取取回对象  语句
	 * @param con
	 * @param tablename
	 * @throws SQLException
	 */
	@Test
	public void showMeatdataOfTable_TOObject()
			throws SQLException {
		Statement stm = conn.createStatement();
		ResultSet rs = stm.executeQuery("select * from " + TABLENAME);
		//可用于获取关于 ResultSet 对象中列的类型和属性信息的对象
		ResultSetMetaData rmsds = rs.getMetaData();
		//返回此 ResultSet 对象中的列数。
		int count = rmsds.getColumnCount();
		if(rs.next()){
			StringBuffer sb = new StringBuffer();
			for (int i = 1; i <= count; i++) {
				// 获得列名和数据类型
				sb.append(entityClassString + ".set" + FirstCharToUpperCase(rmsds.getColumnName(i))  + "(rs.get" + processType(rmsds.getColumnTypeName(i)+"")+ "(\"" + TABLENAME + "." + rmsds.getColumnName(i) + "\"));\n");
			}
			System.out.println(sb.toString());
		}
	}
	
	/**
	 * 首字母转大写
	 * @param args
	 */
	public static String FirstCharToUpperCase(String name){
		return name.substring(0,1).toUpperCase() + name.substring(1);
	}
	
	/**
	 * 处理类型
	 * 
	 * @param args
	 */
	public static String processType (String name){
		String result = null;
		switch(name){
			case "VARCHAR":
				result =  "String";
				break;
			case "INT":
				result =  "Int";
				break;
			case "TIMESTAMP":
				result =  "Timestamp";
				break;
			case "DATETIME":
				result =  "Timestamp";
				break;
		}
		return result;
	}
	
	@AfterClass
	public static void tearDown(){
		ConnectionFactory.close();
	}

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值