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

/**
 * 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();
  
 }

}



 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
博客地址:http://blog.csdn.net/vipbooks 一直以来把数据的表转换成Entity或DTO都是一件让人头痛的事情,既浪费时间又很繁琐,看着几十上百个表的几百上千个字段,真是一件让人很头痛的事情。 我们也想过很多办法解决这个问题,包括用MyEclipse连接数据生成JavaBean,但多多少少还是会有一些不尽人意的地方,包括表和表字段的comment总是无法生成,而且还会生成很多无用的注释代码,让代码看起来一点都不干净,配置非常繁琐等等问题。 于是一怒之下,自己动手丰衣足食,就自己用Swing写了一个通过数据的表生成JavaBean的工具,支持MySQL、Oracle、SQLServce、PostgreSQL,完美支持JPA注解,可以同时生成Entity和DTO,可以自动去除表前缀,并支持去除多个前缀,支持精确指定只生成哪几个表的Bean,也支持模糊查找生成哪几个表的Bean,现在不但成员变量上能生成备注了,而且在Getter和Setter上也能有备注了! 更重要的是所有的配置都能被保存到本地,只要配置过一次,下次使用只要点一下生成JavaBean,下一秒就能拿到你想要的JavaBean了,完全实现秒生成。并且集成各种实用工具,使得工作效率瞬间爆棚,生产力瞬间爆表! 第12版更新震撼发布,此次版本更新如下: 1、新增参数配置管理功能,可以为不同的项目配置不同的参数。 2、新增快速新增参数配置功能,快速为项目添加参数配置。 3、新增选择实体注解功能,生成实体的时候自动为实体添加额外的注解。 4、弹出对话框界面大小调整。 5、新增数据源添加默认设置。 6、精确匹配在点更多时,已选中的表会在弹出的列表中被勾选中。 7、修复模糊匹配找不到表的Bug。 8、其他一些小Bug的修改和代码优化调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值