文档章节

java通过SQL生成实体类".java"文件

lzgsea
 lzgsea
发布于 2016/11/24 14:01
字数 1085
阅读 47
收藏 0

生成实体类文件工具类

1、获取SQL查询语句中所有字段名称

2、将字段名称转换为java类中属性名称

3、获取所有字段的数据库类型

4、将数据库类型转换为java类对应的类型

5、处理特殊类型是否需要导入相关的类

6、处理java类中的get和set方法

7、将内容写入到文件中

备注:该工具类适用于Oracle数据库,数据库字段名称类似USER_NAME,以"_"分割单词,转换为java类中属性名称为userName。

代码如下:

package com.lzgsea.sql;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
 * 创建实体类工具类
 * 1、获取数据库表的字段名称
 * 2、将字段名称转换为对应的类的属性名称
 * 3、添加需要导入的包
 * 4、添加属性类型
 * 5、生成get和set方法
 * 6、写入到文件中
 * 
 * @author lzgsea
 *
 */
public class CreateEntityUtil {
	
	public static Connection conn; //数据库连接
	
	/**
	 * 创建实体类文件
	 * @param sql sql查询语句
	 * @param className 类名
	 * @param packageName 包名
	 * @param filePath 生成文件路径
	 * @param conn 数据库连接
	 */
	public static void createEentity(String sql,String className,String packageName,
			String filePath,Connection conn){
		PreparedStatement ps = null;
		ResultSet rs = null;
		Set<String> importSet = new HashSet<String>(); //需要导入的包
		StringBuffer propertyTxt = new StringBuffer(); //属性
		StringBuffer methodTxt = new StringBuffer(); //方法
		try {
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			int columCount = rs.getMetaData().getColumnCount(); //字段数量
			for(int i=1;i<=columCount;i++){
				String columnName = rs.getMetaData().getColumnName(i); //获取字段名称
				String propertyName = convertColumnName(columnName); //转换成属性名称
				String typeName = rs.getMetaData().getColumnTypeName(i); //获取字段类型
				String propertyType = ""; //属性类型
				String importClass = ""; //需要导入的类
				if(typeName.toUpperCase().equals("NUMBER")&&rs.getMetaData().getScale(i)>0){
					propertyType = "Double";
				}else if(typeName.toUpperCase().equals("NUMBER")){
					propertyType = "Long";
				}else if(typeName.toUpperCase().equals("DATE")){
					propertyType = "Date";
					importClass = "java.sql.Date";
				}else if(typeName.toUpperCase().equals("TIMESTAMP")){
					propertyType = "Timestamp";
					importClass = "java.sql.Timestamp";
				}else if(typeName.toUpperCase().equals("BLOB")){
					propertyType = "Blob";
					importClass = "java.sql.Blob";
				}else if(typeName.toUpperCase().equals("CLOB")){
					propertyType = "Clob";
					importClass = "java.sql.Clob";
				}else{
					propertyType = "String";
				}
				propertyTxt.append("\tprivate "+propertyType+" "+propertyName+";\r\n"); //属性
				if(importClass.trim().length()>0){
					importSet.add(importClass); //添加需要导入的类
				}
				//get方法名称
				String getterName = "get"+propertyName.substring(0,1).toUpperCase()+propertyName.substring(1,propertyName.length());
				//set方法名称
				String setterName = "set"+propertyName.substring(0,1).toUpperCase()+propertyName.substring(1,propertyName.length());
				String getterMethod = "\tpublic "+propertyType+" "+getterName+"(){\r\n\t\treturn this."+propertyName+";\r\n\t}\r\n";
				String setterMethod = "\tpublic void "+setterName+"("+propertyType+" "+propertyName+"){\r\n\t\tthis."+propertyName+"="+propertyName+";\r\n\t}\r\n";
				methodTxt.append(getterMethod); //添加get方法
				methodTxt.append(setterMethod); //添加set方法
			}
			
			StringBuffer txt = new StringBuffer(); //java类内容
			txt.append("package "+packageName+";\r\n"); //包
			txt.append("\r\n");
			Iterator<String> it = importSet.iterator(); //导入类
			while(it.hasNext()){
				txt.append("import "+it.next()+";\r\n");
			}
			txt.append("\r\n");
			txt.append("public class "+className+"{\r\n"); //类名
			txt.append("\r\n");
			txt.append(propertyTxt); //属性内容
			txt.append("\r\n");
			txt.append(methodTxt); //get和set方法名
			txt.append("}"); 
			System.out.println(txt.toString()); 
			String fileName = className+".java"; //文件名
			File file = new File(filePath,fileName); 
			writeByFileWriter(txt.toString(), file, false); //创建文件
			
		} catch (Exception e) {
			System.out.println("ERROR: "+e);
			e.printStackTrace();
		} finally {
			try {
				if(ps!=null) ps.close();
				if(rs!=null) rs.close();
			} catch (Exception e2) {
				System.out.println("ERROR: "+e2);
				e2.printStackTrace();
			}
		}
	}
	
	/**
	 * 将数据库中表的字段名称转换为java类中的属性名称(例如:USER_NAME 转为  userName)
	 * @param columnName 字段名称
	 * @return 属性名称
	 */
	public static String convertColumnName(String columnName){
		columnName = columnName.toLowerCase(); //字段名称转为小写
		char[] arr = columnName.toCharArray(); //字段名称转为char数组
		boolean isToUpper = false; //判断是否大写
		String property = ""; //属性名称
		for(int i=0;i<arr.length;i++){ //循环遍历字段数值
			if(arr[i]=='_'){ //判断是否是"_",如果是下一个字符要大写
				isToUpper = true;
				continue;
			}
			if(isToUpper){//大写字符
				property += String.valueOf(arr[i]).toUpperCase();
			}else{
				property += String.valueOf(arr[i]);
			}
			isToUpper = false;
		}
		return property;
	}
	
	/**
	 * 写入文件
	 * @param area 写入文件的内容
	 * @param file 写入的文件,文件不存在则创建
	 * @param append true是追加,false是覆盖
	 */
	public static void writeByFileWriter(String area,File file, boolean append) throws Exception{
		FileWriter fw = null;
		BufferedWriter bufferedWriter = null;
		try{
			if(!file.exists()){ //文件不存在则新建
				file.createNewFile();
			}
			fw = new FileWriter(file,append);
			bufferedWriter = new BufferedWriter(fw);
			bufferedWriter.write(area+"\r\n");
			
		}catch(Exception e){
			throw e;
		} finally {
			if(bufferedWriter!=null) bufferedWriter.close();
			if(fw!=null) fw.close();
		}
	}
	
	/**
	 * 获取Oracle数据连接
	 * @param ip 数据库连接地址
	 * @param port 数据库连接端口号
	 * @param sid 数据库实例名
	 * @param user 数据库用户名
	 * @param password 密码
	 * @return
	 */
	public static Connection getOracleConnection(String ip, int port, String sid, 
			String user, String password){
		String driver = "oracle.jdbc.driver.OracleDriver";
		String url = "jdbc:oracle:thin:@"+ip+":"+port+":"+sid;;
		try {
			Class.forName(driver); //加载驱动
			conn = DriverManager.getConnection(url, user, password); //连接
		} catch (ClassNotFoundException e) {
			System.out.println("加载驱动失败:找不到驱动类:"+e);
			e.printStackTrace();
		} catch (SQLException e) {
			System.out.println("数据库连接异常:"+e);
			e.printStackTrace();
		}
		return conn;
	}
	
	
	public static void main(String[] args) {
		String user = "LYLX2.3";
		String password = "123456";
		Connection conn = null;
		try {
			conn = getOracleConnection("127.0.0.1", 1521, "orcl", user, password);
			createEentity("SELECT * FROM PMS_USER", "PmsUser", "com.liuzg.sql", "E:\\", conn);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(conn!=null) conn.close();
			} catch (SQLException e) {
				
				e.printStackTrace();
			}
		}
	}

}

 

© 著作权归作者所有

共有 人打赏支持
lzgsea
粉丝 0
博文 8
码字总数 1549
作品 0
杭州
程序员
私信 提问
理解 pureQuery:IBM 最新的 Java 数据库应用编程范例

pureQuery 项目为数据库应用开发人员提供了一套基于 GUI 且易用的方法,它能够显著提高应用程序的设计和实现阶段的生产效率。通过将关系数据自动转换为 Java 对象的实现方式,方便了用户对数...

红薯
2008/12/15
429
0
在 Hibernate 中直接操作 JDBC 接口

简介: Hibernate 在处理多表关联及分组排序等复杂数据库查询操作时,其固有的 O-R 映射机制会产生大量冗余 SQL 操作,系统性能比传统的 JDBC 低很多。本文分析了 Hibernate 产生此类问题的原...

红薯
2010/04/16
751
2
REST 风格的 Web 服务入门

要学习本教程,您需要具备以下软件和资源。 软件或资源 要求的版本 NetBeans IDE Java EE 下载包 Java 开发工具包 (JDK) 版本 6 或 7 符合 Java EE 规范的应用服务器 Oracle WebLogic Server...

颜建海
2014/03/25
0
0
深度探讨Java字节代码的操纵方法

本文为IBM工程师成富编写的《Java深度历险》的第一部分Java字节代码的操纵,像这样Java语言的深度理解和运用还没有很多文章,我们把他奉献给读者,希望读者们喜欢。 51CTO编者按:我们曾给大...

mj4738
2011/11/02
0
0
SQL--( 初识 MyBatis)

MyBatis介绍 MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手...

姜白告
08/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CPU性能过剩提升乏力影响未来行业发展吗?

虽然CPU仍然在不断发展,但是它的性能已经不再仅仅受限于单个处理器类型或制造工艺上了。和过去相比,CPU性能提升的步伐明显放缓了,接下来怎么办,成为横亘在整个行业面前的大问题。 自201...

linuxCool
10分钟前
0
0
使用Autowired和Qualifier解决多个相同类型的bean如何共存的问题

注意: 实现类UserServiceImpl,MyUserServiceImpl 需要区分:@Service("userServicel") @Service("myUserService") https://blog.csdn.net/russle/article/details/80287763......

qimh
44分钟前
3
0
SQL 语句使用to_char函数时,检索结果有空格

小疯在使用Oracle过程中,使用to_char函数检索表数据时发现检索结果前面会有一个空格,对后续开发有影响。问题很好解决,比较直接对可以做一下trim处理。但是小疯很疑惑为什么会有空格呢,于...

野小疯
45分钟前
3
0
对接比特币钱包的PHP开发包

BtcTool是一个基于第三方服务和离线裸交易实现的PHP比特币应用开发包,适合不希望部署本地 节点旳PHP开发者,开发包主要包含以下特性: 利用第三方服务获取指定地址的utxo集合 离线生成消费裸...

汇智网教程
今天
2
0
【自用】 VHD to VHDX

VHDX: 在VHD 2TB 的基础上提供 64TB的容量。 支持逻辑扇区大小为 4KB,和每块的大小为 256MB,来优化虚拟磁盘性能。 比VHD提供更高的安全性、可靠性和性能。 convert-VHD –path d:\Hyper-v...

Tensor丨思悟
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部