自動生成hibernate配置檔案和物件關係對映檔案
阿新 • • 發佈:2019-02-20
一、根據資料表生成對應的實體和註解(GenEntityOracle.java)
二、編寫ant檔案生成hibernate的配置檔案和關係對映檔案(build.xml)package com.ant.tool; 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.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.util.Date; public class GenEntityOracle { // 指定實體生成所在包的路徑 private String packageOutPath = "com.scms.entity"; // 作者名字 private String authorName = "wang"; // 資料庫表名 private String tablename = "skt_modules"; // 列名陣列 private String[] colnames; // 列名型別陣列 private String[] colTypes; // 列名大小陣列 private int[] colSizes; // 是否需要匯入包java.util.* private boolean f_util = false; // 是否需要匯入包java.sql.* private boolean f_sql = false; // 資料庫連線 private static final String URL = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL"; private static final String NAME = "oracle11g"; private static final String PASS = "oracle11g"; private static final String DRIVER = "oracle.jdbc.driver.OracleDriver"; /* * 建構函式 */ public GenEntityOracle() { // 建立連線 Connection con = null; // 查要生成實體類的表 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(""); 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) { 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"); sb.append("\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("* " + tablename + " 實體類\r\n"); sb.append("* \r\n"); sb.append("* @hibernate.class table = \""+tablename+"\" dynamic-update = \"false\" \r\n"); sb.append("* dynamic-insert = \"false\" \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]) + " " + columToJave(colnames[i]) + ";\r\n"); } } /** * 資料欄位變成Java屬性 * * @param string * @return */ private String columToJave(String string) { String string2 = string.toLowerCase(); StringBuilder builder = new StringBuilder(string2); for (int i = 0; i < builder.length(); i++) { if (builder.charAt(i) == '_') { // 第一次出現該符號的位置 char c = builder.charAt(i + 1); c = (char) (c - 32); StringBuilder replace1 = builder.replace(i + 1, i + 2, c + ""); builder = replace1.replace(i, i + 1, ""); // 最後一次出現該符號的位置 int of = builder.lastIndexOf("_", string2.length()); if (of != -1) { char c1 = builder.charAt(of + 1); c1 = (char) (c1 - 32); StringBuilder replace2 = builder.replace(of + 1, of + 2, c1 + ""); builder = replace2.replace(of, of + 1, ""); ; } } } return builder.toString(); } /** * 功能:生成所有方法 * * @param sb */ private void processAllMethod(StringBuffer sb) { for (int i = 0; i < colnames.length; i++) { if(columToJave(colnames[i]).equals("id")){ sb.append("\t/** \r\n"); sb.append("\t* @hibernate.id column = \""+colnames[i]+"\" generator-class=\"sequence\" \r\n"); sb.append("\t* @return \r\n"); sb.append("\t*/\r\n"); }else{ sb.append("\t/** \r\n"); sb.append("\t* @hibernate.property column = \""+colnames[i]+"\" \r\n"); sb.append("\t* @return \r\n"); sb.append("\t*/\r\n"); } sb.append("\tpublic " + sqlType2JavaType(colTypes[i]) + " get" + initcaps(columToJave(colnames[i])) + "(){\r\n"); sb.append("\t\treturn " + columToJave(colnames[i]) + ";\r\n"); sb.append("\t}\r\n"); sb.append("\tpublic void set" + initcaps(columToJave(colnames[i])) + "(" + sqlType2JavaType(colTypes[i]) + " " + columToJave(colnames[i]) + "){\r\n"); sb.append("\t\tthis." + columToJave(colnames[i]) + "=" + columToJave(colnames[i]) + ";\r\n"); sb.append("\t}\r\n"); } } /** * 功能:將輸入字串的首字母改成大寫 * * @param str * @return */ private String initcap(String string2) { String str = columToJave(string2); char[] ch = str.toCharArray(); if (!string2.contains("_")) { ch[0] = (char) (ch[0] - 32); } else { for (int j = 0; j < 3; j++) { ch[j] = (char) (ch[j] - 32); } } return new String(ch); } private String initcaps(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("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(); } }
<?xml version="1.0" encoding="UTF-8"?> <project name="OA系統構造指令碼" default="生成hibernate配置檔案" basedir="."> <property name="src.dir" value="${basedir}" /> <!--這裡使用到xdoclet外掛,官方可下載--> <property name="xdoclet.home" value="E:\Ant\xdoclet-plugins-dist-1.0.4-bin\xdoclet-plugins-dist-1.0.4" /> <!-- build classpath --> <path id="xdoclet.task.classpath"> <fileset dir="${xdoclet.home}/lib"> <include name="**/*.jar" /> </fileset> </path> <taskdef name="xdoclet" classname="org.xdoclet.ant.XDocletTask" classpathref="xdoclet.task.classpath" /> <target name="生成hibernate配置檔案"> <xdoclet> <fileset dir="${src.dir}/com/scms/entity"> <include name="**/*.java" /> </fileset> <!--jdbc配置--> <component classname="org.xdoclet.plugin.hibernate.HibernateConfigPlugin" destdir="${src.dir}" version="3.0" hbm2ddlauto="update" jdbcurl="jdbc:oracle:thin:@127.0.0.1:1521:ORCL" jdbcdriver="oracle.jdbc.driver.OracleDriver" jdbcusername="oracle11g" jdbcpassword="oracle11g" dialect="org.hibernate.dialect.Oracle9Dialect" showsql="true" /> </xdoclet> </target> <target name="生成hibernate對映檔案"> <property name="hibernate.merge.home" value="${src.dir}/hibernate3" /> <delete> <fileset dir="${src.dir}" includes="**/*.hbm.xml"/> </delete> <xdoclet> <!--這個目錄是你javaBean的位置--> <fileset dir="${src.dir}/com/scms/entity"> <include name="**/*.java" /> </fileset> <component classname="org.xdoclet.plugin.hibernate.HibernateMappingPlugin" version="3.0" destdir="${src.dir}" /> </xdoclet> </target> </project>
三、執行GenEntityOracle.java 檔案 再右鍵build.xml run-->ant生成資料表對應的實體類、hibernate配置檔案、實體和資料庫之間的關係對映檔案。
注:功能不是針對所有的根據自己的需要修改GenEntityOracle.java和build.xml 檔案