文档章节

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

lzgsea
 lzgsea
发布于 2016/11/24 14:01
字数 1085
阅读 26
收藏 0
点赞 0
评论 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
博文 7
码字总数 1549
作品 0
杭州
程序员
sharding-jdbc分库分表规则(1)-单表查询

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

xiaomin0322 ⋅ 06/07 ⋅ 0

sharding-jdbc源码分析—准备工作

原文作者:阿飞Javaer 原文链接:https://www.jianshu.com/p/7831817c1da8 接下来对sharding-jdbc源码的分析基于tag为源码,根据sharding-jdbc Features深入学习sharding-jdbc的几个主要特性...

飞哥-Javaer ⋅ 05/03 ⋅ 0

Java基础|Java特性与HelloWorld运行流程

【Java基础】 Java语言特点:(着重了解两个)开源、跨平台。 跨平台如何实现:通过JVM实现,JVM充当Java和不同OS之间的翻译器,不同OS对应不同JVM。 Java语言的平台:JavaSE、JavaME(Androi...

darlingwood2013 ⋅ 05/29 ⋅ 0

JavaWeb07-HTML篇笔记(二)

1.1 案例一:使用JDBC完成CRUD的操作:1.1.1 需求: 对分类管理使用JDBC进行CRUD的操作. 1.1.2 分析:1.1.2.1 技术分析: 【JDBC的概述】 Ø JDBC:Java DataBase Connectivity Java数据库的连...

我是小谷粒 ⋅ 05/16 ⋅ 0

android -------- java虚拟机和Dalvik虚拟机

java虚拟机 虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java虚...

切切歆语 ⋅ 04/29 ⋅ 0

基于ClassLoader的java代码加密的经验分享

原理就是 生成项目时将待加密的java class文件通过加密算法转换生成加密的二进制文件,此文件不会被JD-GUI等反编译工具直接解密。 项目在启动时,用自定义的ClassLoader将加密的二进制文件进...

hxt168 ⋅ 06/06 ⋅ 0

MySQL多数据源笔记5-ShardingJDBC实战

Sharding-JDBC集分库分表、读写分离、分布式主键、柔性事务和数据治理与一身,提供一站式的解决分布式关系型数据库的解决方案。 从2.x版本开始,Sharding-JDBC正式将包名、Maven坐标、码云仓...

狂小白 ⋅ 03/19 ⋅ 0

mybatis系统学习(一)——jdbc基础和mybatis

mybatis系统学习(一)——jdbc基础和mybatis 说明 这一次我所想要做的事,是系统的学习一下mybatis,结合官网文档以及各种网络资料和以往实践经验。 既然是系统的学,就免不了需要了解他所要...

优惠券活动 ⋅ 05/03 ⋅ 0

Java面试题之Hibernate

1.简书一下Hibernated的开发流程 第一步:加载Hibernate的配置文件,读取配置文件的参数, 第二步:创建SessionFactory会话工厂(内部有连接池) 第三步:打开Session 连接 第四步:开启事务...

年轻诠释我们的梦想_705b ⋅ 06/05 ⋅ 0

mybatis系统学习(二)——使用基础mybatis代替原始jdbc

mybatis系统学习(二)——使用基础mybatis代替原始jdbc 前言 这一篇笔记的内容应当是建立在上一篇的基础之上,不论是使用的数据表,还是对应的实体类,都在上一篇有过说明。 有兴趣的或者对...

推荐码发放 ⋅ 05/03 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaScript零基础入门——(八)JavaScript的数组

JavaScript零基础入门——(八)JavaScript的数组 欢迎大家回到我们的JavaScript零基础入门,上一节课我们讲了有关JavaScript正则表达式的相关知识点,便于大家更好的对字符串进行处理。这一...

JandenMa ⋅ 今天 ⋅ 0

sbt网络问题解决方案

转自:http://dblab.xmu.edu.cn/blog/maven-network-problem/ cd ~/.sbt/launchers/0.13.9unzip -q ./sbt-launch.jar 修改 vi sbt/sbt.boot.properties 增加一个oschina库地址: [reposit......

狐狸老侠 ⋅ 今天 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 今天 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

Spring 依赖注入(DI)

1、Setter方法注入: 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法: public class HelloWorldOutput{ HelloWorld helloWorld; public void setHelloWorld...

霍淇滨 ⋅ 昨天 ⋅ 0

马氏距离与欧氏距离

马氏距离 马氏距离也可以定义为两个服从同一分布并且其协方差矩阵为Σ的随机变量之间的差异程度。 如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧氏距离,如果协方差矩阵为对角阵,则其也...

漫步当下 ⋅ 昨天 ⋅ 0

聊聊spring cloud的RequestRateLimiterGatewayFilter

序 本文主要研究一下spring cloud的RequestRateLimiterGatewayFilter GatewayAutoConfiguration @Configuration@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMi......

go4it ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部