基于注解和反射的Java ORM框架(6)-数据库自动生成Java实体类源码
来源:互联网 发布:孟非睡女嘉宾 知乎 编辑:程序博客网 时间:2024/04/30 10:22
一,主要内容
本篇介绍从数据库自动生成Java实体类的代码。
二,配置文件
数据库连接参数、读取的数据库名、生成实体类的报名、生成实体类的保存地址、日志保存的地址都在配置文件中指明。
driver=com.mysql.jdbc.Driverurl=jdbc:mysql://127.0.0.1:3306/bank_performance?useUnicode=true&characterEncoding=utf-8user=rootpassword=Pass1234table_schema=bank_performanceentity_package_name=panda.bank.entityfile_save_path=D\:\\Java\\AutoEntity\\file_log_path=D\:\\Java\\AutoEntity\\
配置文件管理类如下:
package panda.orm.util;public class Constants { public static Property CONFIG_PROPERTY; public static String getFormatDateTime(){ SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return formater.format(new Date()); } public static String getLogFormatDateTime(){ SimpleDateFormat formater = new SimpleDateFormat("yyyyMMddhhmmss"); return formater.format(new Date()); } static{ Properties fileProperties = new Properties(); InputStream inputStream = fileProperties.getClass().getResourceAsStream("/config.properties"); CONFIG_PROPERTY=new Property(); try{ fileProperties.load(inputStream); CONFIG_PROPERTY.setDriver(fileProperties.getProperty("driver")); CONFIG_PROPERTY.setUrl(fileProperties.getProperty("url")); CONFIG_PROPERTY.setUser(fileProperties.getProperty("user")); CONFIG_PROPERTY.setPassword(fileProperties.getProperty("password")); CONFIG_PROPERTY.setTable_schema(fileProperties.getProperty("table_schema")); CONFIG_PROPERTY.setFile_save_path(fileProperties.getProperty("file_save_path")); CONFIG_PROPERTY.setFile_log_path(fileProperties.getProperty("file_log_path")); CONFIG_PROPERTY.setEntity_package_name(fileProperties.getProperty("entity_package_name")); }catch (IOException ex){ ex.printStackTrace(); }finally{ try { inputStream.close(); } catch (IOException ex) { ex.printStackTrace(); } } }}package panda.orm.util;public class Property{ private String driver; private String url; private String user; private String password; private String table_schema; private String file_save_path; private String file_log_path; private String entity_package_name; //get set省略
三,实体类生成器
package panda.orm.util;import java.io.File;import java.io.FileOutputStream;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.util.Date;import java.util.HashMap;import java.util.HashSet;import java.util.Iterator;import java.util.Map;import java.util.Set;import panda.orm.database.MySQLHandler;import panda.orm.exception.SqlExcuteException;/** * MySql auto generate java classes * @author maoge * @date 2017.3.23 */public class EntityGenerater { public static void main(String[] args) { EntityGenerater.generateClasses(); } public static void generateClasses(){ EntityGenerater eg=new EntityGenerater(Constants.CONFIG_PROPERTY.getTable_schema(), Constants.CONFIG_PROPERTY.getEntity_package_name(),Constants.CONFIG_PROPERTY.getFile_save_path()); eg.init(); eg.write(); System.out.println("Panda ORM generate success!"); } private Map<String,Set<String>> tables=new HashMap<String,Set<String>>(); private String table_schema; private String entity_package_name; private String entity_save_path; public EntityGenerater(String table_schema,String entity_package_name,String entity_save_path){ this.table_schema=table_schema; this.entity_package_name=entity_package_name; this.entity_save_path=entity_save_path; } public void init(){ MySQLHandler hand=new MySQLHandler(); ResultSet rs=null; String table_schema =Constants.CONFIG_PROPERTY.getTable_schema(); String sql="select table_name from information_schema.tables where table_schema='"+table_schema+"'"; tables.clear(); try { rs=hand.query(sql); while(rs.next()){ String tableName=rs.getString("table_name"); Set<String> columns=getColumns(tableName); tables.put(tableName, columns); } } catch (Exception ex) { new SqlExcuteException(ex.getMessage(),this.getClass().getName(),"sql:",sql); }finally{ hand.sayGoodbye(); } } private Set<String> getColumns(String tableName){ MySQLHandler hand=new MySQLHandler(); ResultSet rs=null; String sql="select * from "+tableName; Set<String> columns=new HashSet<String>(); try { rs=hand.query(sql); ResultSetMetaData meta=rs.getMetaData(); int count=meta.getColumnCount(); for(int i=0;i<meta.getColumnCount();i++){ columns.add(meta.getColumnName(i+1)); } }catch (Exception ex) { new SqlExcuteException(ex.getMessage(),this.getClass().getName(),"sql:",sql); }finally{ hand.sayGoodbye(); } return columns; } public void write(){ Iterator iter = tables.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); String tableName = (String)entry.getKey(); Set<String> columns = (Set<String>)entry.getValue(); String entityString=getEntityString(tableName,columns); try{ String path=entity_save_path+turnFirstUp(tableName)+".java"; File file=new File(path); if(!file.exists()) file.createNewFile(); FileOutputStream out=new FileOutputStream(file,true); out.write(entityString.getBytes("utf-8")); out.close(); } catch(Exception ex){ ex.printStackTrace(); } } } private String getEntityString(String tableName,Set<String> columns){ StringBuilder sb=new StringBuilder(); sb.append("package "+entity_package_name+";\r\n"); sb.append("/**\r\n"); sb.append("* " + new Date() + "\r\n"); sb.append("* Panda ORM atuo generate: " + tableName + " \r\n"); sb.append("*/ \r\n"); sb.append("public class " + turnFirstUp(tableName) + "{\r\n"); for(String colName:columns){ sb.append("\tprivate String "+colName+";\r\n"); } for(String colName:columns){ sb.append("\tpublic String get"+turnFirstUp(colName) +"(){\r\n"); sb.append("\t\treturn "+colName+";\r\n"); sb.append("\t}\r\n"); sb.append("\tpublic void set"+turnFirstUp(colName) + "(String "+colName+"){\r\n"); sb.append("\t\tthis."+colName+"="+colName+";\r\n"); sb.append("\t}\r\n"); } sb.append("}"); return sb.toString(); } private String turnFirstUp(String str) { char[] ch = str.toCharArray(); if(ch[0]>='a'&&ch[0]<='z'){ ch[0]=(char)(ch[0]-32); } return new String(ch); }}
四,测试
数据库表结构如下
执行下面的方法
public static void main(String[] args) { EntityGenerater.generateClasses(); }提示如下,并生生成对应实体类代码文件:
Panda ORM generate success!
打开User.java验证如下:
package panda.bank.entity;/*** Thu Mar 23 11:30:12 CST 2017* Panda ORM atuo generate: user */ public class User{ private String user_name; private String user_role; private String user_job; private String user_password; private String user_id; private String user_department; public String getUser_name(){ return user_name; } public void setUser_name(String user_name){ this.user_name=user_name; } public String getUser_role(){ return user_role; } public void setUser_role(String user_role){ this.user_role=user_role; } public String getUser_job(){ return user_job; } public void setUser_job(String user_job){ this.user_job=user_job; } public String getUser_password(){ return user_password; } public void setUser_password(String user_password){ this.user_password=user_password; } public String getUser_id(){ return user_id; } public void setUser_id(String user_id){ this.user_id=user_id; } public String getUser_department(){ return user_department; } public void setUser_department(String user_department){ this.user_department=user_department; }}
0 0
- 基于注解和反射的Java ORM框架(6)-数据库自动生成Java实体类源码
- 基于注解和反射的Java ORM框架(4)-数据库自动生成Java实体类
- 基于注解和反射的Java ORM框架(5)-CRUD操作源码
- 基于注解和反射的Java ORM框架(1)-通过注解描述映射关系
- 基于注解和反射的Java ORM框架(2)-设计理念
- 基于注解和反射的Java ORM框架(3)-极速CRUD操作
- java 从数据库表反射出实体类,自动生成实体类
- JAVA 数据表反射实体类,自动生成实体类
- 基于反射和注解的Bean对应数据库表的自动生成
- MyEclipse如何自动生成数据库表的Java实体类
- Java根据数据库表格自动生成java实体类
- 利用sqlacodegen自动生成ORM实体类
- 反射+枚举+freemarker,自动生成实体类,自动建表建索引(二)之建表建索引,注解和DatabaseMetaData 获取信息
- 利用反射和注解模拟ORM框架中的自动建表功能
- 如何在SpringMVC框架中利用Java反射机制和Javassist实现Java对象、属性、注解的动态创建生成
- 在Eclipse中从数据库表自动生成hibernate的java实体类
- 在Eclipse中从数据库表自动生成hibernate的java实体类
- java的反射和注解
- C程序练习:对于100个随机产生的3位整数,求出它们中能够 被3整除的奇数的平均值
- IDE破解方法
- 动态代理proxy与CGLib的区别
- oracle创建表空间出错的原因和解决办法
- 常见排序算法——桶排序(箱子排序)bucket Sort
- 基于注解和反射的Java ORM框架(6)-数据库自动生成Java实体类源码
- GreenPlum 之数据库的用户角色管理
- c++五种内存分配、堆与栈区别
- 打桌球感悟
- [日常学习][C++]字符串流 <sstream>
- no actions available
- mybatis 学习记录(3)—— 动态 sql
- C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
- hadoop之日志分析