• java 快速生成javaBean类


    1. package com.angen.util;
    2. import java.io.FileWriter;
    3. import java.io.IOException;
    4. import java.sql.*;
    5. import java.util.ArrayList;
    6. import java.util.List;
    7. /**
    8. * @description: PojoUtil
    9. * @date: 2022/7/20
    10. */
    11. public class PojoUtil {
    12. public static void main(String[] args) throws ClassNotFoundException, SQLException {
    13. String url = "jdbc:mysql://localhost:3306/test_mybatis?useSSL=false";
    14. String user = "root";
    15. String pass = "root";
    16. Class.forName("com.mysql.jdbc.Driver");
    17. Connection conn = DriverManager.getConnection(url, user, pass);
    18. //java文件输出路径
    19. String path = "E:\\java重新学习\\mybatis_test\\src\\main\\java\\com\\angen\\pojo";
    20. GetModel getModel = new GetModel(conn);
    21. /*
    22. 使用:
    23. pojo: 包含属性与getter、setter
    24. bean: 包含属性与getter、setter与无参构造器,并实现Serializable接口
    25. */
    26. //生成pojo到path
    27. //getModel.generatePojo(path);
    28. //生成pojo到path,在pojo中添加包信息"package com.ren.model"
    29. //getModel.generatePojo(path, "com.ren.model");
    30. //生成Bean到path
    31. //getModel.generateBean(path);
    32. //生成Bean到path,在Bean中添加包信息"package com.ren.bean"
    33. //getModel.generateBean(path, "com.ren.bean");
    34. getModel.generateBean(path);
    35. }
    36. }
    37. class GetModel {
    38. private Connection connection;
    39. private List tables;
    40. public GetModel() {
    41. }
    42. public GetModel(Connection connection) throws SQLException {
    43. this.connection = connection;
    44. this.tables = getTableList();
    45. }
    46. public Connection getConnection() {
    47. return connection;
    48. }
    49. public void setConnection(Connection connection) {
    50. this.connection = connection;
    51. }
    52. /**
    53. * 获取数据库中所有表信息封装到List
    54. tables
    55. * @return List
    56. 包含数据库中所有的表
    57. * @throws SQLException
    58. */
    59. private List
    60. getTableList()throws SQLException {
    61. List
    62. tableList = newArrayList<>();
    63. DatabaseMetaData dbMetaData = connection.getMetaData();
    64. ResultSet rs = dbMetaData.getTables(null, null, null, new String[] { "TABLE" });
    65. while (rs.next()) {
    66. Table table = new Table();
    67. String tableName = rs.getString("TABLE_NAME");
    68. table.setTableName(tableName);
    69. table.setDatabaseName(rs.getString("TABLE_CAT"));
    70. table.setColumns(getTableColumnList(tableName));
    71. tableList.add(table);
    72. }
    73. return tableList;
    74. }
    75. /**
    76. * 获取某表的所有column信息封装到List columnList中
    77. */
    78. private List getTableColumnList(String tableName) throws SQLException {
    79. List columnList = new ArrayList<>();
    80. String sql = "select * from " + tableName;
    81. PreparedStatement stmt;
    82. try {
    83. stmt = connection.prepareStatement(sql);
    84. ResultSet rs = stmt.executeQuery(sql);
    85. ResultSetMetaData data = rs.getMetaData();
    86. for (int i = 1; i <= data.getColumnCount(); i++) {
    87. Column column = new Column();
    88. // 获得所有列的数目及实际列数
    89. int columnCount = data.getColumnCount();
    90. // 获得指定列的列名
    91. String columnName = data.getColumnName(i);
    92. // 获得指定列的数据类型名
    93. String columnTypeName = data.getColumnTypeName(i);
    94. // 对应数据类型的类
    95. String columnClassName = data.getColumnClassName(i);
    96. // 在数据库中类型的最大字符个数
    97. int columnDisplaySize = data.getColumnDisplaySize(i);
    98. // 某列类型的精确度(类型的长度)
    99. int precision = data.getPrecision(i);
    100. // 小数点后的位数
    101. int scale = data.getScale(i);
    102. // 是否自动递增
    103. Boolean isAutoInctement = data.isAutoIncrement(i);
    104. // 是否为空
    105. int isNullable = data.isNullable(i);
    106. column.setColumnName(columnName);
    107. column.setColumnTypeName(columnTypeName);
    108. column.setColumnClassName(columnClassName);
    109. column.setTableName(tableName);
    110. column.setColumnDisplaySize(columnDisplaySize);
    111. column.setPrecision(precision);
    112. column.setScale(scale);
    113. column.setAutoInctement(isAutoInctement);
    114. columnList.add(column);
    115. }
    116. }
    117. catch (SQLException e) {
    118. e.printStackTrace();
    119. }
    120. return columnList;
    121. }
    122. /**
    123. * 为table创建pojo
    124. * @param table 表
    125. * @param path 输出路径
    126. */
    127. private static void writeFilePojo(Table table, String path, String packagePath) {
    128. String fileName = path + "\\" + upperCase(table.getTableName()) + ".java";
    129. try {
    130. FileWriter writer = new FileWriter(fileName);
    131. StringBuilder getterSetter = new StringBuilder();
    132. //需要添加包路径
    133. if (!packagePath.equals("0")) {
    134. writer.write("package " + packagePath + ";\n\n");
    135. }
    136. writer.write("public class " + upperCase(table.getTableName()) + " {\n");
    137. for (Column column : table.getColumns()) {
    138. writer.write(" private " + changeType(column.getColumnTypeName()) + " " + column.getColumnName() + ";\n");
    139. //getter()
    140. getterSetter.append("\n public " + changeType(column.getColumnTypeName()) + " get" + upperCase(column.getColumnName()) + "() {\n");
    141. getterSetter.append(" return " + column.getColumnName() + ";\n");
    142. getterSetter.append(" }\n\n");
    143. //setter()
    144. getterSetter.append(" public void set" + upperCase(column.getColumnName()) + "(" + changeType(column.getColumnTypeName()) + " " + column.getColumnName() + ") {\n");
    145. getterSetter.append(" this." + column.getColumnName() + " = " + column.getColumnName() + ";\n");
    146. getterSetter.append(" }\n");
    147. }
    148. writer.write(getterSetter.toString());
    149. writer.write("}");
    150. writer.close();
    151. } catch (IOException e) {
    152. e.printStackTrace();
    153. }
    154. }
    155. /**
    156. * 为table创建Bean
    157. * @param table 表
    158. * @param path 输出路径
    159. */
    160. private static void writeFileBean(Table table, String path, String packagePath) {
    161. String fileName = path + "\\" + upperCase(table.getTableName()) + ".java";
    162. try {
    163. FileWriter writer = new FileWriter(fileName);
    164. StringBuilder getterSetter = new StringBuilder();
    165. //需要添加包路径
    166. if (!packagePath.equals("0")) {
    167. writer.write("package " + packagePath + ";\n\n");
    168. }
    169. writer.write("import java.io.Serializable;\n\n");
    170. writer.write("public class " + upperCase(table.getTableName()) + " implements Serializable {\n");
    171. for (Column column : table.getColumns()) {
    172. writer.write(" private " + changeType(column.getColumnTypeName()) + " " + column.getColumnName() + ";\n");
    173. //getter()
    174. getterSetter.append("\n public " + changeType(column.getColumnTypeName()) + " get" + upperCase(column.getColumnName()) + "() {\n");
    175. getterSetter.append(" return " + column.getColumnName() + ";\n");
    176. getterSetter.append(" }\n\n");
    177. //setter()
    178. getterSetter.append(" public void set" + upperCase(column.getColumnName()) + "(" + changeType(column.getColumnTypeName()) + " " + column.getColumnName() + ") {\n");
    179. getterSetter.append(" this." + column.getColumnName() + " = " + column.getColumnName() + ";\n");
    180. getterSetter.append(" }\n");
    181. }
    182. //无参构造器
    183. writer.write("\n public " + upperCase(table.getTableName()) + "() { }\n");
    184. writer.write(getterSetter.toString());
    185. writer.write("}");
    186. writer.close();
    187. } catch (IOException e) {
    188. e.printStackTrace();
    189. }
    190. }
    191. /**
    192. * 将 str 首字母大写
    193. * @param str
    194. * @return
    195. */
    196. private static String upperCase(String str) {
    197. return str.substring(0, 1).toUpperCase() + str.substring(1);
    198. }
    199. /**
    200. * 将数据库类型转换为java中合适的类型
    201. * @param typeName
    202. * @return
    203. */
    204. private static String changeType(String typeName) {
    205. switch (typeName) {
    206. case "VARCHAR":
    207. case "CHAR":
    208. case "TEXT":
    209. case "TINYTEXT":
    210. case "MEDIUMTEXT":
    211. case "LONGTEXT":
    212. case "ENUM":
    213. case "SET":
    214. return "String";
    215. case "BLOB":
    216. case "BINARY":
    217. case "VARBINARY":
    218. case "TINYBLOB":
    219. case "MEDIUMBLOB":
    220. case "LONGBLOB":
    221. return "byte[]";
    222. case "INTEGER":
    223. case "ID":
    224. case "BIGINT":
    225. return "Long";
    226. case "TINYINT":
    227. case "SMALLINT":
    228. case "MEDIUMINT":
    229. case "INT":
    230. return "Integer";
    231. case "DECIMAL":
    232. return "BigDecimal";
    233. case "BIT":
    234. return "Boolean";
    235. case "FLOAT":
    236. return "Float";
    237. case "DOUBLE":
    238. return "Double";
    239. case "DATE":
    240. case "YEAR":
    241. return "Date";
    242. case "TIME":
    243. return "Time";
    244. }
    245. return "String";
    246. }
    247. /**
    248. * 根据tables生成pojo到path
    249. * @param path 输出路径
    250. */
    251. public void generatePojo(String path) {
    252. for (Table table : tables) {
    253. writeFilePojo(table, path, "0");
    254. System.out.println("已创建Pojo: " + path + "\\" + upperCase(table.getTableName()) + ".java");
    255. }
    256. }
    257. /**
    258. * 根据tables生成Bean到path
    259. * @param path 输出路径
    260. */
    261. public void generateBean(String path) {
    262. for (Table table : tables) {
    263. writeFileBean(table, path, "0");
    264. System.out.println("已创建Bean: " + path + "\\" + upperCase(table.getTableName()) + ".java");
    265. }
    266. }
    267. /**
    268. * 根据tables生成pojo到path
    269. * @param path 输出路径
    270. * @param packagePath 添加包路径
    271. */
    272. public void generatePojo(String path, String packagePath) {
    273. for (Table table : tables) {
    274. writeFilePojo(table, path, packagePath);
    275. System.out.println("已创建Pojo: " + path + "\\" + upperCase(table.getTableName()) + ".java 包名:" + packagePath);
    276. }
    277. }
    278. /**
    279. * 根据tables生成Bean到path
    280. * @param path 输出路径
    281. * @param packagePath 添加包路径
    282. */
    283. public void generateBean(String path, String packagePath) {
    284. for (Table table : tables) {
    285. writeFileBean(table, path, packagePath);
    286. System.out.println("已创建Bean: " + path + "\\" + upperCase(table.getTableName()) + ".java 包名:" + packagePath);
    287. }
    288. }
    289. }
    290. class Table {
    291. private String tableName;
    292. private String databaseName;
    293. private List columns;
    294. public String getTableName() {
    295. return tableName;
    296. }
    297. public void setTableName(String tableName) {
    298. this.tableName = tableName;
    299. }
    300. public String getDatabaseName() {
    301. return databaseName;
    302. }
    303. public void setDatabaseName(String databaseName) {
    304. this.databaseName = databaseName;
    305. }
    306. public List getColumns() {
    307. return columns;
    308. }
    309. public void setColumns(List columns) {
    310. this.columns = columns;
    311. }
    312. @Override
    313. public String toString() {
    314. return "Table{" +
    315. "\n tableName='" + tableName + '\'' +
    316. "\n databaseName='" + databaseName + '\'' +
    317. "\n columns=" + columns +
    318. '}';
    319. }
    320. }
    321. class Column {
    322. // 列名
    323. private String columnName;
    324. // 列的数据类型名
    325. private String columnTypeName;
    326. // 对应数据类型的类
    327. private String columnClassName;
    328. // 在数据库中类型的最大字符个数
    329. private int columnDisplaySize;
    330. // 某列类型的精确度(类型的长度)
    331. private int precision;
    332. // 小数点后的位数
    333. private int scale;
    334. // 获取某列对应的表名
    335. private String tableName;
    336. // 是否自动递增
    337. private Boolean isAutoInctement;
    338. public String getColumnName() {
    339. return columnName;
    340. }
    341. public void setColumnName(String columnName) {
    342. this.columnName = columnName;
    343. }
    344. public String getColumnTypeName() {
    345. return columnTypeName;
    346. }
    347. public void setColumnTypeName(String columnTypeName) {
    348. this.columnTypeName = columnTypeName;
    349. }
    350. public String getColumnClassName() {
    351. return columnClassName;
    352. }
    353. public void setColumnClassName(String columnClassName) {
    354. this.columnClassName = columnClassName;
    355. }
    356. public int getColumnDisplaySize() {
    357. return columnDisplaySize;
    358. }
    359. public void setColumnDisplaySize(int columnDisplaySize) {
    360. this.columnDisplaySize = columnDisplaySize;
    361. }
    362. public int getPrecision() {
    363. return precision;
    364. }
    365. public void setPrecision(int precision) {
    366. this.precision = precision;
    367. }
    368. public int getScale() {
    369. return scale;
    370. }
    371. public void setScale(int scale) {
    372. this.scale = scale;
    373. }
    374. public String getTableName() {
    375. return tableName;
    376. }
    377. public void setTableName(String tableName) {
    378. this.tableName = tableName;
    379. }
    380. public Boolean getAutoInctement() {
    381. return isAutoInctement;
    382. }
    383. public void setAutoInctement(Boolean autoInctement) {
    384. isAutoInctement = autoInctement;
    385. }
    386. @Override
    387. public String toString() {
    388. return "\n Column{" +
    389. "columnName='" + columnName + '\'' +
    390. ", columnTypeName='" + columnTypeName + '\'' +
    391. ", columnClassName='" + columnClassName + '\'' +
    392. ", columnDisplaySize=" + columnDisplaySize +
    393. ", precision=" + precision +
    394. ", scale=" + scale +
    395. ", tableName='" + tableName + '\'' +
    396. ", isAutoInctement=" + isAutoInctement +
    397. '}';
    398. }
    399. }
    400. 相关阅读:
      天谋科技 Timecho 完成近亿元人民币天使轮融资,打造工业物联网原生时序数据库
      个人开发者轻松接入支付回调
      软件测试面试题:黑盒测试、白盒测试以及单元测试、集成测试、系统测试、验收测试的区别与联系?
      Kafka核心概念详解
      java代码审计-某酒店管理系统
      Day 62 数据结构(单向链表,单向循环链表,双向链表)
      软考高级系统架构设计师系列之:深入理解设计模式
      Java实现-跳跃游戏
      磁环选型攻略及EMC整改技巧
      STM32串口详解
    401. 原文地址:https://blog.csdn.net/qq_42572322/article/details/125897514