java 从数据库表反射出实体类,自动生成实体类

本文转自:http://blog.csdn.net/goodleiwei/article/details/8439023

01.package com.db.gen.entity.tool;  

02.  

03.  

04.import java.io.File;  

05.import java.io.FileWriter;  

06.import java.io.IOException;  

07.import java.io.PrintWriter;  

08.import java.sql.Connection;  

09.import java.sql.DriverManager;  

10.import java.sql.PreparedStatement;  

11.import java.sql.ResultSetMetaData;  

12.import java.sql.SQLException;  

13.import java.util.Date;  

14.  

15.public class GenEntityMysql {  

16.      

17.    private String packageOutPath = "com.user.entity";//指定实体生成所在包的路径  

18.    private String authorName = "封狼居胥";//作者名字  

19.    private String tablename = "user";//表名  

20.    private String[] colnames; // 列名数组  

21.    private String[] colTypes; //列名类型数组  

22.    private int[] colSizes; //列名大小数组  

23.    private boolean f_util = false; // 是否需要导入包java.util.*  

24.    private boolean f_sql = false; // 是否需要导入包java.sql.*  

25.      

26.    //数据库连接  

27.    private static final String URL ="jdbc:mysql://localhost:3306/jbpm";  

28.    private static final String NAME = "root";  

29.    private static final String PASS = "root";  

30.    private static final String DRIVER ="com.mysql.jdbc.Driver";  

31.  

32.    /* 

33.     * 构造函数 

34.     */  

35.    public GenEntityMysql(){  

36.        //创建连接  

37.        Connection con;  

38.        //查要生成实体类的表  

39.        String sql = "select * from " + tablename;  

40.        PreparedStatement pStemt = null;  

41.        try {  

42.            try {  

43.                Class.forName(DRIVER);  

44.            } catch (ClassNotFoundException e1) {  

45.                // TODO Auto-generated catch block  

46.                e1.printStackTrace();  

47.            }  

48.            con = DriverManager.getConnection(URL,NAME,PASS);  

49.            pStemt = con.prepareStatement(sql);  

50.            ResultSetMetaData rsmd = pStemt.getMetaData();  

51.            int size = rsmd.getColumnCount();   //统计列  

52.            colnames = new String[size];  

53.            colTypes = new String[size];  

54.            colSizes = new int[size];  

55.            for (int i = 0; i < size; i++) {  

56.                colnames[i] = rsmd.getColumnName(i + 1);  

57.                colTypes[i] = rsmd.getColumnTypeName(i + 1);  

58.                  

59.                if(colTypes[i].equalsIgnoreCase("datetime")){  

60.                    f_util = true;  

61.                }  

62.                if(colTypes[i].equalsIgnoreCase("image") || colTypes[i].equalsIgnoreCase("text")){  

63.                    f_sql = true;  

64.                }  

65.                colSizes[i] = rsmd.getColumnDisplaySize(i + 1);  

66.            }  

67.              

68.            String content = parse(colnames,colTypes,colSizes);  

69.              

70.            try {  

71.                File directory = new File("");  

72.                //System.out.println("绝对路径:"+directory.getAbsolutePath());  

73.                //System.out.println("相对路径:"+directory.getCanonicalPath());  

74.                String path=this.getClass().getResource("").getPath();  

75.                  

76.                System.out.println(path);  

77.                System.out.println("src/?/"+path.substring(path.lastIndexOf("/com/", path.length())) );  

78.//              String outputPath = directory.getAbsolutePath()+ "/src/"+path.substring(path.lastIndexOf("/com/", path.length()), path.length()) + initcap(tablename) + ".java";  

79.                String outputPath = directory.getAbsolutePath()+ "/src/"+this.packageOutPath.replace(".", "/")+"/"+initcap(tablename) + ".java";  

80.                FileWriter fw = new FileWriter(outputPath);  

81.                PrintWriter pw = new PrintWriter(fw);  

82.                pw.println(content);  

83.                pw.flush();  

84.                pw.close();  

85.            } catch (IOException e) {  

86.                e.printStackTrace();  

87.            }  

88.              

89.        } catch (SQLException e) {  

90.            e.printStackTrace();  

91.        } finally{  

92.//          try {  

93.//              con.close();  

94.//          } catch (SQLException e) {  

95.//              // TODO Auto-generated catch block  

96.//              e.printStackTrace();  

97.//          }  

98.        }  

99.    }  

100.  

101.    /** 

102.     * 功能:生成实体类主体代码 

103.     * @param colnames 

104.     * @param colTypes 

105.     * @param colSizes 

106.     * @return 

107.     */  

108.    private String parse(String[] colnames, String[] colTypes, int[] colSizes) {  

109.        StringBuffer sb = new StringBuffer();  

110.          

111.        //判断是否导入工具包  

112.        if(f_util){  

113.            sb.append("import java.util.Date;\r\n");  

114.        }  

115.        if(f_sql){  

116.            sb.append("import java.sql.*;\r\n");  

117.        }  

118.        sb.append("package " + this.packageOutPath + ";\r\n");  

119.        sb.append("\r\n");  

120.        //注释部分  

121.        sb.append("   /**\r\n");  

122.        sb.append("    * "+tablename+" 实体类\r\n");  

123.        sb.append("    * "+new Date()+" "+this.authorName+"\r\n");  

124.        sb.append("    */ \r\n");  

125.        //实体部分  

126.        sb.append("\r\n\r\npublic class " + initcap(tablename) + "{\r\n");  

127.        processAllAttrs(sb);//属性  

128.        processAllMethod(sb);//get set方法  

129.        sb.append("}\r\n");  

130.          

131.        //System.out.println(sb.toString());  

132.        return sb.toString();  

133.    }  

134.      

135.    /** 

136.     * 功能:生成所有属性 

137.     * @param sb 

138.     */  

139.    private void processAllAttrs(StringBuffer sb) {  

140.          

141.        for (int i = 0; i < colnames.length; i++) {  

142.            sb.append("\tprivate " + sqlType2JavaType(colTypes[i]) + " " + colnames[i] + ";\r\n");  

143.        }  

144.          

145.    }  

146.  

147.    /** 

148.     * 功能:生成所有方法 

149.     * @param sb 

150.     */  

151.    private void processAllMethod(StringBuffer sb) {  

152.          

153.        for (int i = 0; i < colnames.length; i++) {  

154.            sb.append("\tpublic void set" + initcap(colnames[i]) + "(" + sqlType2JavaType(colTypes[i]) + " " +   

155.                    colnames[i] + "){\r\n");  

156.            sb.append("\tthis." + colnames[i] + "=" + colnames[i] + ";\r\n");  

157.            sb.append("\t}\r\n");  

158.            sb.append("\tpublic " + sqlType2JavaType(colTypes[i]) + " get" + initcap(colnames[i]) + "(){\r\n");  

159.            sb.append("\t\treturn " + colnames[i] + ";\r\n");  

160.            sb.append("\t}\r\n");  

161.        }  

162.          

163.    }  

164.      

165.    /** 

166.     * 功能:将输入字符串的首字母改成大写 

167.     * @param str 

168.     * @return 

169.     */  

170.    private String initcap(String str) {  

171.          

172.        char[] ch = str.toCharArray();  

173.        if(ch[0] >= 'a' && ch[0] <= 'z'){  

174.            ch[0] = (char)(ch[0] - 32);  

175.        }  

176.          

177.        return new String(ch);  

178.    }  

179.  

180.    /** 

181.     * 功能:获得列的数据类型 

182.     * @param sqlType 

183.     * @return 

184.     */  

185.    private String sqlType2JavaType(String sqlType) {  

186.          

187.        if(sqlType.equalsIgnoreCase("bit")){  

188.            return "boolean";  

189.        }else if(sqlType.equalsIgnoreCase("tinyint")){  

190.            return "byte";  

191.        }else if(sqlType.equalsIgnoreCase("smallint")){  

192.            return "short";  

193.        }else if(sqlType.equalsIgnoreCase("int")){  

194.            return "int";  

195.        }else if(sqlType.equalsIgnoreCase("bigint")){  

196.            return "long";  

197.        }else if(sqlType.equalsIgnoreCase("float")){  

198.            return "float";  

199.        }else if(sqlType.equalsIgnoreCase("decimal") || sqlType.equalsIgnoreCase("numeric")   

200.                || sqlType.equalsIgnoreCase("real") || sqlType.equalsIgnoreCase("money")   

201.                || sqlType.equalsIgnoreCase("smallmoney")){  

202.            return "double";  

203.        }else if(sqlType.equalsIgnoreCase("varchar") || sqlType.equalsIgnoreCase("char")   

204.                || sqlType.equalsIgnoreCase("nvarchar") || sqlType.equalsIgnoreCase("nchar")   

205.                || sqlType.equalsIgnoreCase("text")){  

206.            return "String";  

207.        }else if(sqlType.equalsIgnoreCase("datetime")){  

208.            return "Date";  

209.        }else if(sqlType.equalsIgnoreCase("image")){  

210.            return "Blod";  

211.        }  

212.          

213.        return null;  

214.    }  

215.      

216.    /** 

217.     * 出口 

218.     * TODO 

219.     * @param args 

220.     */  

221.    public static void main(String[] args) {  

222.          

223.        new GenEntityMysql();  

224.          

225.    }  

226.  

227.}  
01.package com.db.gen.entity.tool;  

02.  

03.  

04.import java.io.File;  

05.import java.io.FileWriter;  

06.import java.io.IOException;  

07.import java.io.PrintWriter;  

08.import java.sql.Connection;  

09.import java.sql.DriverManager;  

10.import java.sql.PreparedStatement;  

11.import java.sql.ResultSet;  

12.import java.sql.ResultSetMetaData;  

13.import java.sql.SQLException;  

14.import java.sql.Statement;  

15.import java.util.Date;  

16.  

17.public class GenEntityOracle {  

18.      

19.    private String packageOutPath = "com.user.entity";//指定实体生成所在包的路径  

20.    private String authorName = "封狼居胥";//作者名字  

21.    private String tablename = "emp";//表名  

22.    private String[] colnames; // 列名数组  

23.    private String[] colTypes; //列名类型数组  

24.    private int[] colSizes; //列名大小数组  

25.    private boolean f_util = false; // 是否需要导入包java.util.*  

26.    private boolean f_sql = false; // 是否需要导入包java.sql.*  

27.      

28.    //数据库连接  

29.     private static final String URL ="jdbc:oracle:thin:@127.0.0.1:1521:ORCL";  

30.     private static final String NAME = "scrot";  

31.     private static final String PASS = "tiger";  

32.     private static final String DRIVER ="oracle.jdbc.driver.OracleDriver";  

33.  

34.    /* 

35.     * 构造函数 

36.     */  

37.    public GenEntityOracle(){  

38.        //创建连接  

39.        Connection con;  

40.        //查要生成实体类的表  

41.        String sql = "select * from " + tablename;  

42.        Statement pStemt = null;  

43.        try {  

44.            try {  

45.                Class.forName(DRIVER);  

46.            } catch (ClassNotFoundException e1) {  

47.                // TODO Auto-generated catch block  

48.                e1.printStackTrace();  

49.            }  

50.            con = DriverManager.getConnection(URL,NAME,PASS);  

51.            pStemt = (Statement) con.createStatement();  

52.            ResultSet rs = pStemt.executeQuery(sql);  

53.            ResultSetMetaData rsmd = rs.getMetaData();  

54.            int size = rsmd.getColumnCount();   //统计列  

55.            colnames = new String[size];  

56.            colTypes = new String[size];  

57.            colSizes = new int[size];  

58.            for (int i = 0; i < size; i++) {  

59.                colnames[i] = rsmd.getColumnName(i + 1);  

60.                colTypes[i] = rsmd.getColumnTypeName(i + 1);  

61.                  

62.                if(colTypes[i].equalsIgnoreCase("date") || colTypes[i].equalsIgnoreCase("timestamp")){  

63.                    f_util = true;  

64.                }  

65.                if(colTypes[i].equalsIgnoreCase("blob") || colTypes[i].equalsIgnoreCase("char")){  

66.                    f_sql = true;  

67.                }  

68.                colSizes[i] = rsmd.getColumnDisplaySize(i + 1);  

69.            }  

70.              

71.            String content = parse(colnames,colTypes,colSizes);  

72.              

73.            try {  

74.                File directory = new File("");  

75.                //System.out.println("绝对路径:"+directory.getAbsolutePath());  

76.                //System.out.println("相对路径:"+directory.getCanonicalPath());  

77.                String path=this.getClass().getResource("").getPath();  

78.                  

79.                System.out.println(path);  

80.                System.out.println("src/?/"+path.substring(path.lastIndexOf("/com/", path.length())) );  

81.//              String outputPath = directory.getAbsolutePath()+ "/src/"+path.substring(path.lastIndexOf("/com/", path.length()), path.length()) + initcap(tablename) + ".java";  

82.                String outputPath = directory.getAbsolutePath()+ "/src/"+this.packageOutPath.replace(".", "/")+"/"+initcap(tablename) + ".java";  

83.                FileWriter fw = new FileWriter(outputPath);  

84.                PrintWriter pw = new PrintWriter(fw);  

85.                pw.println(content);  

86.                pw.flush();  

87.                pw.close();  

88.            } catch (IOException e) {  

89.                e.printStackTrace();  

90.            }  

91.              

92.        } catch (SQLException e) {  

93.            e.printStackTrace();  

94.        } finally{  

95.//          try {  

96.//              con.close();  

97.//          } catch (SQLException e) {  

98.//              // TODO Auto-generated catch block  

99.//              e.printStackTrace();  

100.//          }  

101.        }  

102.    }  

103.  

104.    /** 

105.     * 功能:生成实体类主体代码 

106.     * @param colnames 

107.     * @param colTypes 

108.     * @param colSizes 

109.     * @return 

110.     */  

111.    private String parse(String[] colnames, String[] colTypes, int[] colSizes) {  

112.        StringBuffer sb = new StringBuffer();  

113.          

114.        //判断是否导入工具包  

115.        if(f_util){  

116.            sb.append("import java.util.Date;\r\n");  

117.        }  

118.        if(f_sql){  

119.            sb.append("import java.sql.*;\r\n");  

120.        }  

121.        sb.append("package " + this.packageOutPath + ";\r\n");  

122.        sb.append("\r\n");  

123.        //注释部分  

124.        sb.append("   /**\r\n");  

125.        sb.append("    * "+tablename+" 实体类\r\n");  

126.        sb.append("    * "+new Date()+" "+this.authorName+"\r\n");  

127.        sb.append("    */ \r\n");  

128.        //实体部分  

129.        sb.append("\r\n\r\npublic class " + initcap(tablename) + "{\r\n");  

130.        processAllAttrs(sb);//属性  

131.        processAllMethod(sb);//get set方法  

132.        sb.append("}\r\n");  

133.          

134.        //System.out.println(sb.toString());  

135.        return sb.toString();  

136.    }  

137.      

138.    /** 

139.     * 功能:生成所有属性 

140.     * @param sb 

141.     */  

142.    private void processAllAttrs(StringBuffer sb) {  

143.          

144.        for (int i = 0; i < colnames.length; i++) {  

145.            sb.append("\tprivate " + sqlType2JavaType(colTypes[i]) + " " + colnames[i] + ";\r\n");  

146.        }  

147.          

148.    }  

149.  

150.    /** 

151.     * 功能:生成所有方法 

152.     * @param sb 

153.     */  

154.    private void processAllMethod(StringBuffer sb) {  

155.          

156.        for (int i = 0; i < colnames.length; i++) {  

157.            sb.append("\tpublic void set" + initcap(colnames[i]) + "(" + sqlType2JavaType(colTypes[i]) + " " +   

158.                    colnames[i] + "){\r\n");  

159.            sb.append("\tthis." + colnames[i] + "=" + colnames[i] + ";\r\n");  

160.            sb.append("\t}\r\n");  

161.            sb.append("\tpublic " + sqlType2JavaType(colTypes[i]) + " get" + initcap(colnames[i]) + "(){\r\n");  

162.            sb.append("\t\treturn " + colnames[i] + ";\r\n");  

163.            sb.append("\t}\r\n");  

164.        }  

165.          

166.    }  

167.      

168.    /** 

169.     * 功能:将输入字符串的首字母改成大写 

170.     * @param str 

171.     * @return 

172.     */  

173.    private String initcap(String str) {  

174.          

175.        char[] ch = str.toCharArray();  

176.        if(ch[0] >= 'a' && ch[0] <= 'z'){  

177.            ch[0] = (char)(ch[0] - 32);  

178.        }  

179.          

180.        return new String(ch);  

181.    }  

182.  

183.    /** 

184.     * 功能:获得列的数据类型 

185.     * @param sqlType 

186.     * @return 

187.     */  

188.    private String sqlType2JavaType(String sqlType) {  

189.          

190.        if(sqlType.equalsIgnoreCase("binary_double")){  

191.            return "double";  

192.        }else if(sqlType.equalsIgnoreCase("binary_float")){  

193.            return "float";  

194.        }else if(sqlType.equalsIgnoreCase("blob")){  

195.            return "byte[]";  

196.        }else if(sqlType.equalsIgnoreCase("blob")){  

197.            return "byte[]";  

198.        }else if(sqlType.equalsIgnoreCase("char") || sqlType.equalsIgnoreCase("nvarchar2")   

199.                || sqlType.equalsIgnoreCase("varchar2")){  

200.            return "String";  

201.        }else if(sqlType.equalsIgnoreCase("date") || sqlType.equalsIgnoreCase("timestamp")  

202.                 || sqlType.equalsIgnoreCase("timestamp with local time zone")   

203.                 || sqlType.equalsIgnoreCase("timestamp with time zone")){  

204.            return "Date";  

205.        }else if(sqlType.equalsIgnoreCase("number")){  

206.            return "Long";  

207.        }  

208.          

209.        return "String";  

210.    }  

211.      

212.    /** 

213.     * 出口 

214.     * TODO 

215.     * @param args 

216.     */  

217.    public static void main(String[] args) {  

218.          

219.        new GenEntityOracle();  

220.          

221.    }  

222.  

223.}  





 

通过改造可以实现mysql和oracle的了

 

参考地址:http://www.oschina.net/code/snippet_857839_15477

你可能感兴趣的:(java)