根据库表结构自动生成java实体类(生成规范的变量及get/set方法).

原创 2014年11月10日 16:57:02
/**
 * java根据库表结构自动生成java实体,在网上找了相关资料,已经有很多大侠实现了这功能。
 * 但是并没有一个使我自己满意的,要么生成的变量不规范,要么就是格式很乱。
 * 所以我参照网上一些已有的方法,自己动手改进了下,实现了可以生成规范的字段名及
 * get/set方法,只不过这里有个前提,就是在新建表字段时如果字段名较长,那么必须遵守用"_"隔开。
 * 其实只有这样才能规范,毕竟电脑也不是万能的,不可能根据你想要的格式自动生成规范的变量名及get/set方法。
 */

 

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.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;

public class GenEntityOracle {

 private String packageOutPath = "com.user.entity";//指定实体生成所在包的路径
 private String authorName = "张三";//作者名字
 private String tablename = "RECORD";//表名
 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:oracle:thin:@192.168.1.113:1521:eport";
  private static final String NAME = "test";
  private static final String PASS = "test";
  private static final String DRIVER ="oracle.jdbc.driver.OracleDriver";

 /*
  * 构造函数
  */
 public GenEntityOracle(){
     //创建连接
     Connection con;
  //查要生成实体类的表
     String sql = "select * from " + tablename;
     Statement pStemt = null;
     try {
      try {
    Class.forName(DRIVER);
   } catch (ClassNotFoundException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
   }
      con = DriverManager.getConnection(URL,NAME,PASS);
   pStemt = (Statement) con.createStatement();
   ResultSet rs = pStemt.executeQuery(sql);
   ResultSetMetaData rsmd = rs.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("date") || colTypes[i].equalsIgnoreCase("timestamp")){
     f_util = true;
    }
    if(colTypes[i].equalsIgnoreCase("blob") || colTypes[i].equalsIgnoreCase("char")){
     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("    * "+initcap(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("999999 = " +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]) + " " + defineVar(colnames[i]) + ";\r\n");
  }
  
 }

 /**
  * 功能:生成所有方法
  * @param sb
  */
 private void processAllMethod(StringBuffer sb) {
  
  for (int i = 0; i < colnames.length; i++) {
   sb.append("\n\tpublic void set" + transVar(colnames[i]) + "(" + sqlType2JavaType(colTypes[i]) + " " +
     defineVar(colnames[i]) + "){\r\n");
   sb.append("\t\tthis." + this.defineVar(colnames[i]) + "=" + this.defineVar(colnames[i]) + ";\r\n");
   sb.append("\t}\r\n");
   sb.append("\n\tpublic " + sqlType2JavaType(colTypes[i]) + " get" + transVar(colnames[i]) + "(){\r\n");
   sb.append("\t\treturn " + defineVar(colnames[i]) + ";\r\n");
   sb.append("\t}\r\n");
  }
  
 }
 
 /**
  * 功能:将输入字符串的首字母改成大写
  * @param str
  * @return
  */
 private String initcap(String str) {
  
  char[] ch = str.toLowerCase().toCharArray();
  System.out.println("6666 str = "+str.toString());
  if(ch[0] >= 'a' && ch[0] <= 'z'){
   ch[0] = (char)(ch[0] - 32);
  }
  
  return new String(ch);
 }
 
 /**
  * 用于生成get/set方法时
  * 功能:先将变量字母全变为小写,将第一个字母变为大写,将紧跟“_”后面一个字母大写,并去掉“_”.
  * @param str
  * @return
  */
 private String transVar(String str){
  System.out.println("111"+str);
  int index = 0;
  if(str.indexOf("_")!=-1){
   index = str.indexOf("_");
   str = str.replace("_", "");
  }
  System.out.println("222"+str);
  char[] ch = str.toLowerCase().toCharArray();
  if(ch[0] >= 'a' && ch[0] <= 'z'){
   ch[0] = (char)(ch[0] - 32);
   if(index!=0){
    ch[index] = (char)(ch[index] - 32);
   }
  }
  str =  new String(ch);
  System.out.println("333"+str);
  return str;
 }
 
 /**
  * 用于定义变量名
  * 功能:先将变量字母全变为小写,将紧跟“_”后面一个字母大写,并去掉“_”.
  * @param str
  * @return
  */
 private String defineVar(String str){
  int index = 0;
  if(str.indexOf("_")!=-1){
   index = str.indexOf("_");
   str = str.replace("_", "");
  }
  char[] ch = str.toLowerCase().toCharArray();
  if(ch[0] >= 'a' && ch[0] <= 'z'&&index!=0){
   ch[index] = (char)(ch[index] - 32);
  }
  str =  new String(ch);
  return str;
 }

 /**
  * 功能:获得列的数据类型
  * @param sqlType
  * @return
  */
 private String sqlType2JavaType(String sqlType) {
  
  if(sqlType.equalsIgnoreCase("binary_double")){
   return "double";
  }else if(sqlType.equalsIgnoreCase("binary_float")){
   return "float";
  }else if(sqlType.equalsIgnoreCase("blob")){
   return "byte[]";
  }else if(sqlType.equalsIgnoreCase("blob")){
   return "byte[]";
  }else if(sqlType.equalsIgnoreCase("char") || sqlType.equalsIgnoreCase("nvarchar2")
    || sqlType.equalsIgnoreCase("varchar2")){
   return "String";
  }else if(sqlType.equalsIgnoreCase("date") || sqlType.equalsIgnoreCase("timestamp")
     || sqlType.equalsIgnoreCase("timestamp with local time zone") 
     || sqlType.equalsIgnoreCase("timestamp with time zone")){
   return "Date";
  }else if(sqlType.equalsIgnoreCase("number")){
   return "Long";
  }
  
  return "String";
 }
 
 /**
  * 出口
  * TODO
  * @param args
  */
 public static void main(String[] args) {
  
  new GenEntityOracle();
  
 }

}



 

JAVA 数据表反射实体类,自动生成实体类

import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWrit...
  • u012394573
  • u012394573
  • 2017年08月04日 17:16
  • 575

添加注解后,框架没有自动根据实体类生成数据表,Hibernate

在Hibernate3.2版本之后,开始支持使用JPA注解来替代XML映射配置,极大程度的简化了hibernate的配置,现在使用注解也成为了映射的首选方式。 @Id注解:指...
  • lemmata
  • lemmata
  • 2016年12月24日 23:13
  • 1978

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

一直以来把数据库的表转换成Entity或DTO都是一件让人头痛的事情,既浪费时间又很繁琐,用其他工具生成多少会有一些不尽人意的地方,于是就自己用Swing写了一个通过数据库的表生成JavaBean的工...
  • vipbooks
  • vipbooks
  • 2016年08月18日 01:34
  • 5690

eclipse 使用JPA Tools 根据数据库表自动生成实体类

 1.在eclipse里面创建数据库连接: 1.1窗口-->显示视图-->其他-->Data Management-->Data Sources Explorer-->确定; 1.2Data...
  • guoxin91
  • guoxin91
  • 2014年06月17日 20:21
  • 8294

Java工具类_表结构自动生成对应的实体类、Mapper.xml文件、Dao类

Java工具类_表结构自动生成对应的实体类、Mapper.xml文件、Dao类
  • abc5232033
  • abc5232033
  • 2017年07月20日 00:00
  • 203

C#集合篇,在业务背景下(***产品升级管理):依赖注入,变量声明,三元表达式,常用字符串相关操作方法,ADO.NET,EF机制,T4模板自动生成实体类,ref变量巧用,属性实际运用,唯一性验证

QQ:1187362408 欢迎技术交流和学习 关于系统产品升级报告管理,业务需求: TODO: 1,升级报告管理:依据各县区制定升级报告(关联sAreaCode,给每个地区观看具体升级报告信息...
  • HR1187362408
  • HR1187362408
  • 2015年06月11日 14:58
  • 962

从表结构到项目实体类自动生成问题

-dbms-table-》---entity------java语言---------ssh架构 1.本实例说明使用资源:   -----------开发软件-myeclipse8.6+oracle1...
  • ligw_1990
  • ligw_1990
  • 2014年01月17日 10:25
  • 462

MySQL表自动生成Java实体类

  • 2017年11月23日 22:10
  • 2.55MB
  • 下载

Mybatis 根据数据库表 自动生成代码(实体类、*mapper.java、*mapper.xml)

根据数据中的表一一去写实体类,费时耗力,可以根据mybatis自动生成代码. 优点:不用自己去写实体类以及mapper中通用的增删改查等。 缺点:更改一个实体类属性时,需要自己...
  • weixin_39716452
  • weixin_39716452
  • 2018年01月09日 09:31
  • 19

在Eclipse中从数据库表自动生成hibernate的java实体类

1、新建项目。一般我们用java做web项目都是File->New->Dynamic Web Project,如下图: 2、然后会出现新建项目的对话框如图所示 3、...
  • Allen202
  • Allen202
  • 2014年03月12日 19:55
  • 2290
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:根据库表结构自动生成java实体类(生成规范的变量及get/set方法).
举报原因:
原因补充:

(最多只允许输入30个字)