文档章节

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

lzgsea
 lzgsea
发布于 2016/11/24 14:01
字数 1085
阅读 32
收藏 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
杭州
程序员
深度探讨Java字节代码的操纵方法

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

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

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

姜白告
08/06
0
0
Java深度理解——Java字节代码的操纵

导读:Java作为业界应用最为广泛的语言之一,深得众多软件厂商和开发者的推崇,更是被包括Oracle在内的众多JCP成员积极地推动发展。但是对于 Java语言的深度理解和运用,毕竟是很少会有人涉及...

刘学炜
2012/01/13
0
0
sharding-jdbc分库分表规则(1)-单表查询

前言 当数据量到达一定数量级的时候,一般都会考虑分库分表。sharding-jdbc是一个开源的客户端分库分表基础类库,以一个jar包的形式提供,基于原生的JDBC驱动进行增强,基本能够无缝整合旧代...

xiaomin0322
06/07
0
0
基于SpringJdbc的泛型Dao

使用的Spring是3.1版本,不是3.0版本。两者还是有区别的,其中一点就是:SimpleJdbcTemplate在3.1版本被标记为过时了,而SimpleJdbcTemplate的一些方法,被JdbcTemplate吸收了。所以,个人推荐...

moz1q1
2014/07/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Go语言_通神之路(2)

1、包 每个Go程序都是由包构成,从main包开始运行,就是我上一篇讲到的,都是从main函数开始执行,但是必须在main包下面! package mainimport ( "fmt" "math/rand")func ...

木九天
昨天
1
0
51.php-fpm的pool 慢日志 open_basedir 进程管理

12.21 php-fpm的pool 12.22 php-fpm慢执行日志(测试时报错) 12.23 open_basedir 12.24 php-fpm进程管理 12.21 php-fpm的pool: php-fpm里的pool也叫池子,咱们之前加入过www的配置,这个w...

王鑫linux
昨天
0
0
java内存模型概述

1、Java虚拟机运行时数据分区图 程序计数器:线程私有,是一块较小的内存空间,它是当前线程所执行的字节码文件的行号指示器 java虚拟机栈:线程私有,其生命周期与线程相同,这也就是我们平...

京一
昨天
0
0
shell学习之test语法

因为if-then语句不能测试退出状态码之外的条件,所以提供了test, 如果test命令中列出的条件成立,test命令就会退出并返回退出状态码0;如果条件不成立,test命令就会退出并返回非零的退出状态...

woshixin
昨天
0
0
openJDK之如何下载各个版本的openJDK源码

如果我们需要阅读openJDK的源码,那么需要下载,那么该去哪下载呢? 现在JDK已经发展到版本10了,11已经处于计划中,如果需要特定版本的openJDK,它们的下载链接在哪呢? 1.openJDK的项目 链接...

汉斯-冯-拉特
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部