`
郑云飞
  • 浏览: 795556 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java 从数据库表反射出实体类,自动生成实体类

 
阅读更多
mysql数据库
package com.s9.common.web;


import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Date;

public class GenEntityMysql {
	
	private String packageOutPath = "com.s9.cfj.user.entity";//指定实体生成所在包的路径
	private String authorName = "郑云飞";//作者名字
	private String tablename = "cfj_user";//表名
	private String[] colnames; // 列名数组
	private String[] colTypes; //列名类型数组
	private int[] colSizes; //列名大小数组
	private boolean f_util = false; // 是否需要导入包java.util.*
	private boolean f_sql = false; // 是否需要导入包java.sql.*
    
    //数据库连接
	private static final String URL ="jdbc:mysql://localhost:3306/caifujie";
	private static final String NAME = "root";
	private static final String PASS = "root";
	private static final String DRIVER ="com.mysql.jdbc.Driver";

	/*
	 * 构造函数
	 */
	public GenEntityMysql(){
    	//创建连接
    	Connection con;
		//查要生成实体类的表
    	String sql = "select * from " + tablename;
    	PreparedStatement pStemt = null;
    	try {
    		try {
				Class.forName(DRIVER);
			} catch (ClassNotFoundException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
    		con = DriverManager.getConnection(URL,NAME,PASS);
			pStemt = con.prepareStatement(sql);
			ResultSetMetaData rsmd = pStemt.getMetaData();
			int size = rsmd.getColumnCount();	//统计列
			colnames = new String[size];
			colTypes = new String[size];
			colSizes = new int[size];
			for (int i = 0; i < size; i++) {
				colnames[i] = rsmd.getColumnName(i + 1);
				colTypes[i] = rsmd.getColumnTypeName(i + 1);
				if(colTypes[i].equalsIgnoreCase("datetime")){
					f_util = true;
				}
				if(colTypes[i].equalsIgnoreCase("image") || colTypes[i].equalsIgnoreCase("text")){
					f_sql = true;
				}
				colSizes[i] = rsmd.getColumnDisplaySize(i + 1);
			}
			
			String content = parse(colnames,colTypes,colSizes);
			
			try {
				File directory = new File("");
				//System.out.println("绝对路径:"+directory.getAbsolutePath());
				//System.out.println("相对路径:"+directory.getCanonicalPath());
				String path=this.getClass().getResource("").getPath();
				
				System.out.println(path);
				System.out.println("src/?/"+path.substring(path.lastIndexOf("/com/", path.length())) );
//				String outputPath = directory.getAbsolutePath()+ "/src/"+path.substring(path.lastIndexOf("/com/", path.length()), path.length()) + initcap(tablename) + ".java";
				String outputPath = directory.getAbsolutePath()+ "/src/"+this.packageOutPath.replace(".", "/")+"/"+initcap(tablename) + ".java";
				FileWriter fw = new FileWriter(outputPath);
				PrintWriter pw = new PrintWriter(fw);
				pw.println(content);
				pw.flush();
				pw.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally{
//			try {
//				con.close();
//			} catch (SQLException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}
		}
    }

	/**
	 * 功能:生成实体类主体代码
	 * @param colnames
	 * @param colTypes
	 * @param colSizes
	 * @return
	 */
	private String parse(String[] colnames, String[] colTypes, int[] colSizes) {
		StringBuffer sb = new StringBuffer();
		sb.append("package " + this.packageOutPath + ";\r\n");
		//判断是否导入工具包
		if(f_util){
			sb.append("import java.util.Date;\r\n");
		}
		if(f_sql){
			sb.append("import java.sql.*;\r\n");
		}
		sb.append("\r\n");
		//注释部分
		sb.append("   /**\r\n");
		sb.append("    * "+tablename+" 实体类\r\n");
		sb.append("    * "+new Date()+" "+this.authorName+"\r\n");
		sb.append("    */ \r\n");
		//实体部分
		sb.append("\r\n\r\npublic class " + initcap(tablename) + "{\r\n");
		processAllAttrs(sb);//属性
		processAllMethod(sb);//get set方法
		sb.append("}\r\n");
		
    	//System.out.println(sb.toString());
		return sb.toString();
	}
	
	/**
	 * 功能:生成所有属性
	 * @param sb
	 */
	private void processAllAttrs(StringBuffer sb) {
		
		for (int i = 0; i < colnames.length; i++) {
			sb.append("\tprivate " + sqlType2JavaType(colTypes[i]) + " " + colnames[i] + ";\r\n");
		}
		
	}

	/**
	 * 功能:生成所有方法
	 * @param sb
	 */
	private void processAllMethod(StringBuffer sb) {
		
		for (int i = 0; i < colnames.length; i++) {
			sb.append("\tpublic void set" + initcap(colnames[i]) + "(" + sqlType2JavaType(colTypes[i]) + " " + 
					colnames[i] + "){\r\n");
			sb.append("\tthis." + colnames[i] + "=" + colnames[i] + ";\r\n");
			sb.append("\t}\r\n");
			sb.append("\tpublic " + sqlType2JavaType(colTypes[i]) + " get" + initcap(colnames[i]) + "(){\r\n");
			sb.append("\t\treturn " + colnames[i] + ";\r\n");
			sb.append("\t}\r\n");
		}
		
	}
	
	/**
	 * 功能:将输入字符串的首字母改成大写
	 * @param str
	 * @return
	 */
	private String initcap(String str) {
		
		char[] ch = str.toCharArray();
		if(ch[0] >= 'a' && ch[0] <= 'z'){
			ch[0] = (char)(ch[0] - 32);
		}
		
		return new String(ch);
	}

	/**
	 * 功能:获得列的数据类型
	 * @param sqlType
	 * @return
	 */
	private String sqlType2JavaType(String sqlType) {
		
		if(sqlType.equalsIgnoreCase("bit")){
			return "boolean";
		}else if(sqlType.equalsIgnoreCase("tinyint")){
			return "byte";
		}else if(sqlType.equalsIgnoreCase("smallint")){
			return "short";
		}else if(sqlType.equalsIgnoreCase("int")){
			return "int";
		}else if(sqlType.equalsIgnoreCase("bigint")){
			return "long";
		}else if(sqlType.equalsIgnoreCase("float")){
			return "float";
		}else if(sqlType.equalsIgnoreCase("decimal") || sqlType.equalsIgnoreCase("numeric") 
				|| sqlType.equalsIgnoreCase("real") || sqlType.equalsIgnoreCase("money") 
				|| sqlType.equalsIgnoreCase("smallmoney")){
			return "double";
		}else if(sqlType.equalsIgnoreCase("varchar") || sqlType.equalsIgnoreCase("char") 
				|| sqlType.equalsIgnoreCase("nvarchar") || sqlType.equalsIgnoreCase("nchar") 
				|| sqlType.equalsIgnoreCase("text")){
			return "String";
		}else if(sqlType.equalsIgnoreCase("datetime")){
			return "Date";
		}else if(sqlType.equalsIgnoreCase("image")){
			return "Blod";
		}
		
		return null;
	}
	
	/**
	 * 出口
	 * TODO
	 * @param args
	 */
	public static void main(String[] args) {
		
		new GenEntityMysql();
		
	}

}

    oracle数据库

01.package com.db.gen.entity.tool;  
02.  
03.  
04.import java.io.File;  
05.import java.io.FileWriter;  
06.import java.io.IOException;  
07.import java.io.PrintWriter;  
08.import java.sql.Connection;  
09.import java.sql.DriverManager;  
10.import java.sql.PreparedStatement;  
11.import java.sql.ResultSet;  
12.import java.sql.ResultSetMetaData;  
13.import java.sql.SQLException;  
14.import java.sql.Statement;  
15.import java.util.Date;  
16.  
17.public class GenEntityOracle {  
18.      
19.    private String packageOutPath = "com.user.entity";//指定实体生成所在包的路径  
20.    private String authorName = "郑云飞";//作者名字  
21.    private String tablename = "emp";//表名  
22.    private String[] colnames; // 列名数组  
23.    private String[] colTypes; //列名类型数组  
24.    private int[] colSizes; //列名大小数组  
25.    private boolean f_util = false; // 是否需要导入包java.util.*  
26.    private boolean f_sql = false; // 是否需要导入包java.sql.*  
27.      
28.    //数据库连接  
29.     private static final String URL ="jdbc:oracle:thin:@127.0.0.1:1521:ORCL";  
30.     private static final String NAME = "scrot";  
31.     private static final String PASS = "tiger";  
32.     private static final String DRIVER ="oracle.jdbc.driver.OracleDriver";  
33.  
34.    /* 
35.     * 构造函数 
36.     */  
37.    public GenEntityOracle(){  
38.        //创建连接  
39.        Connection con;  
40.        //查要生成实体类的表  
41.        String sql = "select * from " + tablename;  
42.        Statement pStemt = null;  
43.        try {  
44.            try {  
45.                Class.forName(DRIVER);  
46.            } catch (ClassNotFoundException e1) {  
47.                // TODO Auto-generated catch block  
48.                e1.printStackTrace();  
49.            }  
50.            con = DriverManager.getConnection(URL,NAME,PASS);  
51.            pStemt = (Statement) con.createStatement();  
52.            ResultSet rs = pStemt.executeQuery(sql);  
53.            ResultSetMetaData rsmd = rs.getMetaData();  
54.            int size = rsmd.getColumnCount();   //统计列  
55.            colnames = new String[size];  
56.            colTypes = new String[size];  
57.            colSizes = new int[size];  
58.            for (int i = 0; i < size; i++) {  
59.                colnames[i] = rsmd.getColumnName(i + 1);  
60.                colTypes[i] = rsmd.getColumnTypeName(i + 1);  
61.                  
62.                if(colTypes[i].equalsIgnoreCase("date") || colTypes[i].equalsIgnoreCase("timestamp")){  
63.                    f_util = true;  
64.                }  
65.                if(colTypes[i].equalsIgnoreCase("blob") || colTypes[i].equalsIgnoreCase("char")){  
66.                    f_sql = true;  
67.                }  
68.                colSizes[i] = rsmd.getColumnDisplaySize(i + 1);  
69.            }  
70.              
71.            String content = parse(colnames,colTypes,colSizes);  
72.              
73.            try {  
74.                File directory = new File("");  
75.                //System.out.println("绝对路径:"+directory.getAbsolutePath());  
76.                //System.out.println("相对路径:"+directory.getCanonicalPath());  
77.                String path=this.getClass().getResource("").getPath();  
78.                  
79.                System.out.println(path);  
80.                System.out.println("src/?/"+path.substring(path.lastIndexOf("/com/", path.length())) );  
81.//              String outputPath = directory.getAbsolutePath()+ "/src/"+path.substring(path.lastIndexOf("/com/", path.length()), path.length()) + initcap(tablename) + ".java";  
82.                String outputPath = directory.getAbsolutePath()+ "/src/"+this.packageOutPath.replace(".", "/")+"/"+initcap(tablename) + ".java";  
83.                FileWriter fw = new FileWriter(outputPath);  
84.                PrintWriter pw = new PrintWriter(fw);  
85.                pw.println(content);  
86.                pw.flush();  
87.                pw.close();  
88.            } catch (IOException e) {  
89.                e.printStackTrace();  
90.            }  
91.              
92.        } catch (SQLException e) {  
93.            e.printStackTrace();  
94.        } finally{  
95.//          try {  
96.//              con.close();  
97.//          } catch (SQLException e) {  
98.//              // TODO Auto-generated catch block  
99.//              e.printStackTrace();  
100.//          }  
101.        }  
102.    }  
103.  
104.    /** 
105.     * 功能:生成实体类主体代码 
106.     * @param colnames 
107.     * @param colTypes 
108.     * @param colSizes 
109.     * @return 
110.     */  
111.    private String parse(String[] colnames, String[] colTypes, int[] colSizes) {  
112.        StringBuffer sb = new StringBuffer();  
113.          
114.        //判断是否导入工具包  
115.        if(f_util){  
116.            sb.append("import java.util.Date;\r\n");  
117.        }  
118.        if(f_sql){  
119.            sb.append("import java.sql.*;\r\n");  
120.        }  
121.        sb.append("package " + this.packageOutPath + ";\r\n");  
122.        sb.append("\r\n");  
123.        //注释部分  
124.        sb.append("   /**\r\n");  
125.        sb.append("    * "+tablename+" 实体类\r\n");  
126.        sb.append("    * "+new Date()+" "+this.authorName+"\r\n");  
127.        sb.append("    */ \r\n");  
128.        //实体部分  
129.        sb.append("\r\n\r\npublic class " + initcap(tablename) + "{\r\n");  
130.        processAllAttrs(sb);//属性  
131.        processAllMethod(sb);//get set方法  
132.        sb.append("}\r\n");  
133.          
134.        //System.out.println(sb.toString());  
135.        return sb.toString();  
136.    }  
137.      
138.    /** 
139.     * 功能:生成所有属性 
140.     * @param sb 
141.     */  
142.    private void processAllAttrs(StringBuffer sb) {  
143.          
144.        for (int i = 0; i < colnames.length; i++) {  
145.            sb.append("\tprivate " + sqlType2JavaType(colTypes[i]) + " " + colnames[i] + ";\r\n");  
146.        }  
147.          
148.    }  
149.  
150.    /** 
151.     * 功能:生成所有方法 
152.     * @param sb 
153.     */  
154.    private void processAllMethod(StringBuffer sb) {  
155.          
156.        for (int i = 0; i < colnames.length; i++) {  
157.            sb.append("\tpublic void set" + initcap(colnames[i]) + "(" + sqlType2JavaType(colTypes[i]) + " " +   
158.                    colnames[i] + "){\r\n");  
159.            sb.append("\tthis." + colnames[i] + "=" + colnames[i] + ";\r\n");  
160.            sb.append("\t}\r\n");  
161.            sb.append("\tpublic " + sqlType2JavaType(colTypes[i]) + " get" + initcap(colnames[i]) + "(){\r\n");  
162.            sb.append("\t\treturn " + colnames[i] + ";\r\n");  
163.            sb.append("\t}\r\n");  
164.        }  
165.          
166.    }  
167.      
168.    /** 
169.     * 功能:将输入字符串的首字母改成大写 
170.     * @param str 
171.     * @return 
172.     */  
173.    private String initcap(String str) {  
174.          
175.        char[] ch = str.toCharArray();  
176.        if(ch[0] >= 'a' && ch[0] <= 'z'){  
177.            ch[0] = (char)(ch[0] - 32);  
178.        }  
179.          
180.        return new String(ch);  
181.    }  
182.  
183.    /** 
184.     * 功能:获得列的数据类型 
185.     * @param sqlType 
186.     * @return 
187.     */  
188.    private String sqlType2JavaType(String sqlType) {  
189.          
190.        if(sqlType.equalsIgnoreCase("binary_double")){  
191.            return "double";  
192.        }else if(sqlType.equalsIgnoreCase("binary_float")){  
193.            return "float";  
194.        }else if(sqlType.equalsIgnoreCase("blob")){  
195.            return "byte[]";  
196.        }else if(sqlType.equalsIgnoreCase("blob")){  
197.            return "byte[]";  
198.        }else if(sqlType.equalsIgnoreCase("char") || sqlType.equalsIgnoreCase("nvarchar2")   
199.                || sqlType.equalsIgnoreCase("varchar2")){  
200.            return "String";  
201.        }else if(sqlType.equalsIgnoreCase("date") || sqlType.equalsIgnoreCase("timestamp")  
202.                 || sqlType.equalsIgnoreCase("timestamp with local time zone")   
203.                 || sqlType.equalsIgnoreCase("timestamp with time zone")){  
204.            return "Date";  
205.        }else if(sqlType.equalsIgnoreCase("number")){  
206.            return "Long";  
207.        }  
208.          
209.        return "String";  
210.    }  
211.      
212.    /** 
213.     * 出口 
214.     * TODO 
215.     * @param args 
216.     */  
217.    public static void main(String[] args) {  
218.          
219.        new GenEntityOracle();  
220.          
221.    }  
222.  
223.}

 

分享到:
评论

相关推荐

    java从数据库表反射出实体类,自动生成实体类

    java 从数据库表反射出实体类,自动生成实体类

    JAVA通过实体生成数据库表

    由JAVA的实体类反生成数据库表。

    java将数据库表反射成java实体类xml中sql语句

    java将数据库表反射成java实体类xml中sql语句,如果使用的mybatis,生成基于原生的xml中sql操作语句,如insert、select、update语句。

    实体类转换成数据库表

    sqlserver数据库中的表通过hibernate反射生成的的实体类, 通过代码生成oracle数据库的表

    利用JAVA反射,读取数据库表名,自动生成对应实体类的操作

    主要介绍了利用JAVA反射,读取数据库表名,自动生成对应实体类的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    Java反射 JavaBean对象自动生成插入,更新,删除,查询sql语句操作

    主要介绍了Java反射 JavaBean对象自动生成插入,更新,删除,查询sql语句操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    简单DAO自动生成器、创建器(支持MySQL)Java版 第二版

    一个简单的JAVA版的DAO生成器,通过反射机制获取bean实体类属性,前提是bean属性都有自动生成的getters和setters。 数据库支持MySQL 如果需要使用其他数据库,修改daoCreator.Util.DBUtil 使用方法介绍在test下的...

    简单DAO生成器、创建器(只支持MySQL)Java版

    一个简单的JAVA版的DAO生成器,通过反射机制获取bean实体类属性,前提是bean属性都有自动生成的getters和setters。 之前由于一个bean实体类就要写一个DAO,实在是没有效率,就想了这个方法,反射机制获取私有属性的...

    根据表结构自动生成JavaBean,史上最强最专业的表结构转JavaBean的工具(第12版)

    3、新增选择实体注解功能,生成实体的时候自动为实体添加额外的注解。 4、弹出对话框界面大小调整。 5、新增数据源添加默认设置。 6、精确匹配在点更多时,已选中的表会在弹出的列表中被勾选中。 7、修复模糊...

    JAVA_API1.6文档(中文)

    java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java....

    Java 1.6 API 中文 New

    java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java.nio ...

    java api最新7.0

    java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java.nio ...

    JavaAPI1.6中文chm文档 part1

    java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java....

    JavaAPI中文chm文档 part2

    java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java....

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

    第1章 Java应用分层架构及软件模型  1.1 应用程序的分层体系结构  1.1.1 区分物理层和逻辑层  1.1.2 软件层的特征  1.1.3 软件分层的优点  1.1.4 软件分层的缺点  1.1.5 Java应用的持久化层  1.2 软件的模型 ...

    java jdk-api-1.6 中文 chmd

    java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java....

    JAVA面试题最全集

    一个“.java”原文件中是否可以包括多个类(不是内部类)? 53.掌握内部类和接口的概念 54.StringTokenizer类的使用 55.数据结构,如何遍历List中的元素? 如果要按照键值保存或者访问数据,使用什么数据结构? ...

    [Java参考文档]

    java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java....

Global site tag (gtag.js) - Google Analytics