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

Dear 丶 2022-05-23 06:59 448阅读 0赞
  1. import java.io.File;
  2. import java.io.FileWriter;
  3. import java.io.IOException;
  4. import java.io.PrintWriter;
  5. import java.sql.Connection;
  6. import java.sql.DriverManager;
  7. import java.sql.PreparedStatement;
  8. import java.sql.ResultSetMetaData;
  9. import java.sql.SQLException;
  10. import java.util.Date;
  11. public class GenEntityMysql {
  12. private String packageOutPath = "com.yunti.entity";//指定实体生成所在包的路径
  13. private String authorName = "Nmggy";//作者名字
  14. private String tablename = "sponsor";//表名
  15. private String[] colnames; // 列名数组
  16. private String[] colTypes; //列名类型数组
  17. private int[] colSizes; //列名大小数组
  18. private boolean f_util = false; // 是否需要导入包java.util.*
  19. private boolean f_sql = false; // 是否需要导入包java.sql.*
  20. //数据库连接
  21. private static final String URL ="jdbc:mysql://localhost:3306/network";
  22. private static final String NAME = "root";
  23. private static final String PASS = "";
  24. private static final String DRIVER ="com.mysql.jdbc.Driver";
  25. /* * 构造函数 */
  26. public GenEntityMysql(){
  27. //创建连接
  28. Connection con;
  29. //查要生成实体类的表
  30. String sql = "select * from " + tablename;
  31. PreparedStatement pStemt = null;
  32. try {
  33. try {
  34. Class.forName(DRIVER);
  35. } catch (ClassNotFoundException e1) {
  36. // TODO Auto-generated catch block
  37. e1.printStackTrace();
  38. }
  39. con = DriverManager.getConnection(URL,NAME,PASS);
  40. pStemt = con.prepareStatement(sql);
  41. ResultSetMetaData rsmd = pStemt.getMetaData();
  42. int size = rsmd.getColumnCount(); //统计列
  43. colnames = new String[size];
  44. colTypes = new String[size];
  45. colSizes = new int[size];
  46. for (int i = 0; i < size; i++) {
  47. colnames[i] = rsmd.getColumnName(i + 1);
  48. colTypes[i] = rsmd.getColumnTypeName(i + 1);
  49. if(colTypes[i].equalsIgnoreCase("datetime")){
  50. f_util = true;
  51. }
  52. if(colTypes[i].equalsIgnoreCase("image") || colTypes[i].equalsIgnoreCase("text")){
  53. f_sql = true;
  54. }
  55. colSizes[i] = rsmd.getColumnDisplaySize(i + 1);
  56. }
  57. String content = parse(colnames,colTypes,colSizes);
  58. try {
  59. File directory = new File("");
  60. //System.out.println("绝对路径:"+directory.getAbsolutePath());
  61. //System.out.println("相对路径:"+directory.getCanonicalPath());
  62. String path=this.getClass().getResource("").getPath();
  63. System.out.println(path);
  64. System.out.println("src/?/"+path.substring(path.lastIndexOf("/com/", path.length())) );
  65. // String outputPath = directory.getAbsolutePath()+ "/src/"+path.substring(path.lastIndexOf("/com/", path.length()), path.length()) + initcap(tablename) + ".java";
  66. String outputPath = directory.getAbsolutePath()+ "/src/"+this.packageOutPath.replace(".", "/")+"/"+initcap(tablename) + ".java";
  67. FileWriter fw = new FileWriter(outputPath);
  68. PrintWriter pw = new PrintWriter(fw);
  69. pw.println(content);
  70. pw.flush();
  71. pw.close();
  72. } catch (IOException e) {
  73. e.printStackTrace();
  74. }
  75. } catch (SQLException e) {
  76. e.printStackTrace();
  77. } finally{
  78. // try {
  79. // con.close();
  80. // } catch (SQLException e) {
  81. // // TODO Auto-generated catch block
  82. // e.printStackTrace();
  83. // }
  84. }
  85. }
  86. /** * 功能:生成实体类主体代码 * @param colnames * @param colTypes * @param colSizes * @return */
  87. private String parse(String[] colnames, String[] colTypes, int[] colSizes) {
  88. StringBuffer sb = new StringBuffer();
  89. //判断是否导入工具包
  90. if(f_util){
  91. sb.append("import java.util.Date;\r\n");
  92. }
  93. if(f_sql){
  94. sb.append("import java.sql.*;\r\n");
  95. }
  96. sb.append("package " + this.packageOutPath + ";\r\n");
  97. sb.append("\r\n");
  98. //注释部分
  99. sb.append(" /**\r\n");
  100. sb.append(" * "+tablename+" 实体类\r\n");
  101. sb.append(" * "+new Date()+" "+this.authorName+"\r\n");
  102. sb.append(" */ \r\n");
  103. //实体部分
  104. sb.append("\r\n\r\npublic class " + initcap(tablename) + "{\r\n");
  105. processAllAttrs(sb);//属性
  106. processAllMethod(sb);//get set方法
  107. sb.append("}\r\n");
  108. //System.out.println(sb.toString());
  109. return sb.toString();
  110. }
  111. /** * 功能:生成所有属性 * @param sb */
  112. private void processAllAttrs(StringBuffer sb) {
  113. for (int i = 0; i < colnames.length; i++) {
  114. sb.append("\tprivate " + sqlType2JavaType(colTypes[i]) + " " + colnames[i] + ";\r\n");
  115. }
  116. }
  117. /** * 功能:生成所有方法 * @param sb */
  118. private void processAllMethod(StringBuffer sb) {
  119. for (int i = 0; i < colnames.length; i++) {
  120. sb.append("\tpublic void set" + initcap(colnames[i]) + "(" + sqlType2JavaType(colTypes[i]) + " " +
  121. colnames[i] + "){\r\n");
  122. sb.append("\tthis." + colnames[i] + "=" + colnames[i] + ";\r\n");
  123. sb.append("\t}\r\n");
  124. sb.append("\tpublic " + sqlType2JavaType(colTypes[i]) + " get" + initcap(colnames[i]) + "(){\r\n");
  125. sb.append("\t\treturn " + colnames[i] + ";\r\n");
  126. sb.append("\t}\r\n");
  127. }
  128. }
  129. /** * 功能:将输入字符串的首字母改成大写 * @param str * @return */
  130. private String initcap(String str) {
  131. char[] ch = str.toCharArray();
  132. if(ch[0] >= 'a' && ch[0] <= 'z'){
  133. ch[0] = (char)(ch[0] - 32);
  134. }
  135. return new String(ch);
  136. }
  137. /** * 功能:获得列的数据类型 * @param sqlType * @return */
  138. private String sqlType2JavaType(String sqlType) {
  139. if(sqlType.equalsIgnoreCase("bit")){
  140. return "boolean";
  141. }else if(sqlType.equalsIgnoreCase("tinyint")){
  142. return "byte";
  143. }else if(sqlType.equalsIgnoreCase("smallint")){
  144. return "short";
  145. }else if(sqlType.equalsIgnoreCase("int")){
  146. return "int";
  147. }else if(sqlType.equalsIgnoreCase("bigint")){
  148. return "long";
  149. }else if(sqlType.equalsIgnoreCase("float")){
  150. return "float";
  151. }else if(sqlType.equalsIgnoreCase("decimal") || sqlType.equalsIgnoreCase("numeric")
  152. || sqlType.equalsIgnoreCase("real") || sqlType.equalsIgnoreCase("money")
  153. || sqlType.equalsIgnoreCase("smallmoney")){
  154. return "double";
  155. }else if(sqlType.equalsIgnoreCase("varchar") || sqlType.equalsIgnoreCase("char")
  156. || sqlType.equalsIgnoreCase("nvarchar") || sqlType.equalsIgnoreCase("nchar")
  157. || sqlType.equalsIgnoreCase("text")){
  158. return "String";
  159. }else if(sqlType.equalsIgnoreCase("datetime")){
  160. return "Date";
  161. }else if(sqlType.equalsIgnoreCase("image")){
  162. return "Blod";
  163. }
  164. return null;
  165. }
  166. /** * 出口 * TODO * @param args */
  167. public static void main(String[] args) {
  168. new GenEntityMysql();
  169. }
  170. }

发表评论

表情:
评论列表 (有 0 条评论,448人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java实体生成工具

    前言 原因是这样的,eclipse有那种生成实体类的插件,可是我感觉装来装去很麻烦,于是我想,干脆自己做一个生成实体类的工具吧,说做就做,然后就自己花了两个小时左右做出来