自動生成hibernate配置文件和對象關係映射文件

http://blog.csdn.net/wmy1230/article/details/53389845


一、根據數據表生成對應的實體和註解(GenEntityOracle.java)

[java] view plain copy
 print?
  1. package com.ant.tool;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileWriter;  
  5. import java.io.IOException;  
  6. import java.io.PrintWriter;  
  7. import java.sql.Connection;  
  8. import java.sql.DriverManager;  
  9. import java.sql.PreparedStatement;  
  10. import java.sql.ResultSet;  
  11. import java.sql.ResultSetMetaData;  
  12. import java.sql.SQLException;  
  13. import java.sql.Statement;  
  14. import java.util.Date;  
  15.   
  16. public class GenEntityOracle {  
  17.   
  18.     // 指定實體生成所在包的路徑  
  19.     private String packageOutPath = "com.scms.entity";  
  20.     // 作者名字  
  21.     private String authorName = "wang";  
  22.     // 數據庫表名  
  23.     private String tablename = "skt_modules";  
  24.     // 列名數組  
  25.     private String[] colnames;  
  26.     // 列名類型數組  
  27.     private String[] colTypes;  
  28.     // 列名大小數組  
  29.     private int[] colSizes;  
  30.     // 是否需要導入包java.util.*  
  31.     private boolean f_util = false;  
  32.     // 是否需要導入包java.sql.*  
  33.     private boolean f_sql = false;  
  34.   
  35.     // 數據庫連接  
  36.     private static final String URL = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL";  
  37.     private static final String NAME = "oracle11g";  
  38.     private static final String PASS = "oracle11g";  
  39.     private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";  
  40.   
  41.     /* 
  42.      * 構造函數 
  43.      */  
  44.     public GenEntityOracle() {  
  45.         // 創建連接  
  46.         Connection con = null;  
  47.         // 查要生成實體類的表  
  48.         String sql = "select * from " + tablename;  
  49.         Statement pStemt = null;  
  50.         try {  
  51.             try {  
  52.                 Class.forName(DRIVER);  
  53.             } catch (ClassNotFoundException e1) {  
  54.                 // TODO Auto-generated catch block  
  55.                 e1.printStackTrace();  
  56.             }  
  57.             con = DriverManager.getConnection(URL, NAME, PASS);  
  58.             pStemt = (Statement) con.createStatement();  
  59.             ResultSet rs = pStemt.executeQuery(sql);  
  60.             ResultSetMetaData rsmd = rs.getMetaData();  
  61.             int size = rsmd.getColumnCount(); // 統計列  
  62.             colnames = new String[size];  
  63.             colTypes = new String[size];  
  64.             colSizes = new int[size];  
  65.             for (int i = 0; i < size; i++) {  
  66.                 colnames[i] = rsmd.getColumnName(i + 1);  
  67.                 colTypes[i] = rsmd.getColumnTypeName(i + 1);  
  68.   
  69.                 if (colTypes[i].equalsIgnoreCase("date")  
  70.                         || colTypes[i].equalsIgnoreCase("timestamp")) {  
  71.                     f_util = true;  
  72.                 }  
  73.                 if (colTypes[i].equalsIgnoreCase("blob")  
  74.                         || colTypes[i].equalsIgnoreCase("char")) {  
  75.                     f_sql = true;  
  76.                 }  
  77.                 colSizes[i] = rsmd.getColumnDisplaySize(i + 1);  
  78.             }  
  79.   
  80.             String content = parse(colnames, colTypes, colSizes);  
  81.   
  82.             try {  
  83.                 File directory = new File("");  
  84.                 String path = this.getClass().getResource("").getPath();  
  85.   
  86.                 System.out.println(path);  
  87.                 System.out.println("src/?/"  
  88.                         + path.substring(path.lastIndexOf("/com/",  
  89.                                 path.length())));  
  90.                 // String outputPath = directory.getAbsolutePath()+  
  91.                 // "/src/"+path.substring(path.lastIndexOf("/com/",  
  92.                 // path.length()), path.length()) + initcap(tablename) +  
  93.                 // ".java";  
  94.                 String outputPath = directory.getAbsolutePath() + "/src/"  
  95.                         + this.packageOutPath.replace(".""/") + "/"  
  96.                         + initcap(tablename) + ".java";  
  97.                 FileWriter fw = new FileWriter(outputPath);  
  98.                 PrintWriter pw = new PrintWriter(fw);  
  99.                 pw.println(content);  
  100.                 pw.flush();  
  101.                 pw.close();  
  102.             } catch (IOException e) {  
  103.                 e.printStackTrace();  
  104.             }  
  105.   
  106.         } catch (SQLException e) {  
  107.             e.printStackTrace();  
  108.         } finally {  
  109.             try {  
  110.                 con.close();  
  111.             } catch (SQLException e) {  
  112.                 e.printStackTrace();  
  113.             }  
  114.         }  
  115.     }  
  116.   
  117.     /** 
  118.      * 功能:生成實體類主體代碼 
  119.      *  
  120.      * @param colnames 
  121.      * @param colTypes 
  122.      * @param colSizes 
  123.      * @return 
  124.      */  
  125.     private String parse(String[] colnames, String[] colTypes, int[] colSizes) {  
  126.         StringBuffer sb = new StringBuffer();  
  127.   
  128.         sb.append("package " + this.packageOutPath + ";\r\n");  
  129.         sb.append("\r\n");  
  130.         // 判斷是否導入工具包  
  131.         if (f_util) {  
  132.             sb.append("import java.util.Date;\r\n");  
  133.         }  
  134.         if (f_sql) {  
  135.             sb.append("import java.sql.*;\r\n");  
  136.         }  
  137.         // 註釋部分  
  138.         sb.append("/**\r\n");  
  139.         sb.append("* " + tablename + " 實體類\r\n");  
  140.         sb.append("* \r\n");  
  141.         sb.append("* @hibernate.class table = \""+tablename+"\" dynamic-update = \"false\" \r\n");  
  142.         sb.append("*                  dynamic-insert = \"false\" \r\n");  
  143.         sb.append("* " + new Date() + " " + this.authorName + "\r\n");  
  144.         sb.append("*/ \r\n");  
  145.         // 實體部分  
  146.         sb.append("\r\n\r\npublic class " + initcap(tablename) + "{\r\n");  
  147.         processAllAttrs(sb);// 屬性  
  148.         processAllMethod(sb);// get set方法  
  149.         sb.append("}\r\n");  
  150.   
  151.         // System.out.println(sb.toString());  
  152.         return sb.toString();  
  153.     }  
  154.   
  155.     /** 
  156.      * 功能:生成所有屬性 
  157.      *  
  158.      * @param sb 
  159.      */  
  160.     private void processAllAttrs(StringBuffer sb) {  
  161.   
  162.         for (int i = 0; i < colnames.length; i++) {  
  163.             sb.append("\tprivate " + sqlType2JavaType(colTypes[i]) + " "  
  164.                     + columToJave(colnames[i]) + ";\r\n");  
  165.         }  
  166.   
  167.     }  
  168.   
  169.     /** 
  170.      * 數據字段變成Java屬性 
  171.      *  
  172.      * @param string 
  173.      * @return 
  174.      */  
  175.     private String columToJave(String string) {  
  176.         String string2 = string.toLowerCase();  
  177.         StringBuilder builder = new StringBuilder(string2);  
  178.   
  179.         for (int i = 0; i < builder.length(); i++) {  
  180.             if (builder.charAt(i) == '_') {  
  181.                 // 第一次出現該符號的位置  
  182.                 char c = builder.charAt(i + 1);  
  183.                 c = (char) (c - 32);  
  184.                 StringBuilder replace1 = builder.replace(i + 1, i + 2, c + "");  
  185.                 builder = replace1.replace(i, i + 1"");  
  186.   
  187.                 // 最後一次出現該符號的位置  
  188.                 int of = builder.lastIndexOf("_", string2.length());  
  189.                 if (of != -1) {  
  190.                     char c1 = builder.charAt(of + 1);  
  191.                     c1 = (char) (c1 - 32);  
  192.                     StringBuilder replace2 = builder.replace(of + 1, of + 2, c1  
  193.                             + "");  
  194.                     builder = replace2.replace(of, of + 1"");  
  195.                     ;  
  196.                 }  
  197.   
  198.             }  
  199.         }  
  200.         return builder.toString();  
  201.     }  
  202.   
  203.     /** 
  204.      * 功能:生成所有方法 
  205.      *  
  206.      * @param sb 
  207.      */  
  208.     private void processAllMethod(StringBuffer sb) {  
  209.           
  210.           
  211.         for (int i = 0; i < colnames.length; i++) {  
  212.             if(columToJave(colnames[i]).equals("id")){  
  213.                 sb.append("\t/** \r\n");  
  214.                 sb.append("\t* @hibernate.id  column = \""+colnames[i]+"\"  generator-class=\"sequence\"  \r\n");  
  215.                 sb.append("\t* @return \r\n");  
  216.                 sb.append("\t*/\r\n");  
  217.             }else{  
  218.                 sb.append("\t/** \r\n");  
  219.                 sb.append("\t* @hibernate.property column = \""+colnames[i]+"\" \r\n");  
  220.                 sb.append("\t* @return \r\n");  
  221.                 sb.append("\t*/\r\n");  
  222.             }  
  223.             sb.append("\tpublic " + sqlType2JavaType(colTypes[i]) + " get"  
  224.                     + initcaps(columToJave(colnames[i])) + "(){\r\n");  
  225.             sb.append("\t\treturn " + columToJave(colnames[i]) + ";\r\n");  
  226.             sb.append("\t}\r\n");  
  227.               
  228.             sb.append("\tpublic void set" + initcaps(columToJave(colnames[i]))  
  229.                     + "(" + sqlType2JavaType(colTypes[i]) + " "  
  230.                     + columToJave(colnames[i]) + "){\r\n");  
  231.             sb.append("\t\tthis." + columToJave(colnames[i]) + "="  
  232.                     + columToJave(colnames[i]) + ";\r\n");  
  233.             sb.append("\t}\r\n");  
  234.               
  235.         }  
  236.   
  237.     }  
  238.   
  239.     /** 
  240.      * 功能:將輸入字符串的首字母改成大寫 
  241.      *  
  242.      * @param str 
  243.      * @return 
  244.      */  
  245.     private String initcap(String string2) {  
  246.         String str = columToJave(string2);  
  247.         char[] ch = str.toCharArray();  
  248.         if (!string2.contains("_")) {  
  249.             ch[0] = (char) (ch[0] - 32);  
  250.         } else {  
  251.             for (int j = 0; j < 3; j++) {  
  252.                 ch[j] = (char) (ch[j] - 32);  
  253.             }  
  254.         }  
  255.         return new String(ch);  
  256.     }  
  257.   
  258.     private String initcaps(String str) {  
  259.         char[] ch = str.toCharArray();  
  260.         if (ch[0] >= 'a' && ch[0] <= 'z') {  
  261.             ch[0] = (char) (ch[0] - 32);  
  262.         }  
  263.   
  264.         return new String(ch);  
  265.     }  
  266.   
  267.     /** 
  268.      * 功能:獲得列的數據類型 
  269.      *  
  270.      * @param sqlType 
  271.      * @return 
  272.      */  
  273.     private String sqlType2JavaType(String sqlType) {  
  274.   
  275.         if (sqlType.equalsIgnoreCase("binary_double")) {  
  276.             return "double";  
  277.         } else if (sqlType.equalsIgnoreCase("binary_float")) {  
  278.             return "float";  
  279.         } else if (sqlType.equalsIgnoreCase("blob")) {  
  280.             return "byte[]";  
  281.         } else if (sqlType.equalsIgnoreCase("blob")) {  
  282.             return "byte[]";  
  283.         } else if (sqlType.equalsIgnoreCase("char")  
  284.                 || sqlType.equalsIgnoreCase("nvarchar2")  
  285.                 || sqlType.equalsIgnoreCase("varchar2")) {  
  286.             return "String";  
  287.         } else if (sqlType.equalsIgnoreCase("date")  
  288.                 || sqlType.equalsIgnoreCase("timestamp")  
  289.                 || sqlType.equalsIgnoreCase("timestamp with local time zone")  
  290.                 || sqlType.equalsIgnoreCase("timestamp with time zone")) {  
  291.             return "Date";  
  292.         } else if (sqlType.equalsIgnoreCase("number")) {  
  293.             return "Long";  
  294.         }  
  295.   
  296.         return "String";  
  297.     }  
  298.   
  299.     /** 
  300.      * 出口 TODO 
  301.      *  
  302.      * @param args 
  303.      */  
  304.     public static void main(String[] args) {  
  305.   
  306.         new GenEntityOracle();  
  307.   
  308.     }  
  309.   
  310. }  
二、編寫ant文件生成hibernate的配置文件和關係映射文件(build.xml)

[html] view plain copy
 print?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <project name="OA系統構造腳本" default="生成hibernate配置文件" basedir=".">  
  3.     <property name="src.dir" value="${basedir}" />  
  4.     <!--這裏使用到xdoclet插件,官方可下載-->  
  5.     <property name="xdoclet.home" value="E:\Ant\xdoclet-plugins-dist-1.0.4-bin\xdoclet-plugins-dist-1.0.4" />  
  6.   
  7.     <!-- build classpath -->  
  8.     <path id="xdoclet.task.classpath">  
  9.         <fileset dir="${xdoclet.home}/lib">  
  10.             <include name="**/*.jar" />  
  11.         </fileset>  
  12.     </path>  
  13.   
  14.     <taskdef name="xdoclet" classname="org.xdoclet.ant.XDocletTask" classpathref="xdoclet.task.classpath" />  
  15.   
  16.     <target name="生成hibernate配置文件">  
  17.         <xdoclet>  
  18.             <fileset dir="${src.dir}/com/scms/entity">  
  19.                 <include name="**/*.java" />  
  20.             </fileset>  
  21.             <!--jdbc配置-->  
  22.             <component classname="org.xdoclet.plugin.hibernate.HibernateConfigPlugin"   
  23.                 destdir="${src.dir}"   
  24.                 version="3.0"   
  25.                 hbm2ddlauto="update"   
  26.                 jdbcurl="jdbc:oracle:thin:@127.0.0.1:1521:ORCL"   
  27.                 jdbcdriver="oracle.jdbc.driver.OracleDriver"   
  28.                 jdbcusername="oracle11g"   
  29.                 jdbcpassword="oracle11g"   
  30.                 dialect="org.hibernate.dialect.Oracle9Dialect"   
  31.                 showsql="true" />  
  32.         </xdoclet>  
  33.     </target>  
  34.   
  35.     <target name="生成hibernate映射文件">  
  36.         <property name="hibernate.merge.home"  
  37.                               value="${src.dir}/hibernate3" />  
  38.   
  39.         <delete>  
  40.             <fileset dir="${src.dir}" includes="**/*.hbm.xml"/>  
  41.         </delete>  
  42.         <xdoclet>  
  43.             <!--這個目錄是你javaBean的位置-->  
  44.             <fileset dir="${src.dir}/com/scms/entity">  
  45.                 <include name="**/*.java" />  
  46.             </fileset>  
  47.             <component classname="org.xdoclet.plugin.hibernate.HibernateMappingPlugin"   
  48.                 version="3.0"   
  49.                 destdir="${src.dir}" />  
  50.         </xdoclet>  
  51.   
  52.     </target>  
  53. </project>  

三、運行GenEntityOracle.java 文件  再右鍵 build.xml  run-->ant生成數據表對應的實體類、hibernate配置文件、實體和數據庫之間的關係映射文件。

注:功能不是針對所有的根據自己的需要修改GenEntityOracle.java和 build.xml 文件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章