根据Oracle表结构生成PO实体工具类

﹏ヽ暗。殇╰゛Y 2022-04-08 09:20 608阅读 0赞

每次根据数据表写实体类和form类都觉得好麻烦,也没有装相应的工具,闲来无事就自己写了个工具类。具体代码如下:

  1. package com.hnjz.app.common;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.sql.Connection;
  5. import java.sql.DriverManager;
  6. import java.sql.ResultSet;
  7. import java.sql.ResultSetMetaData;
  8. import java.sql.SQLException;
  9. import java.sql.Statement;
  10. import java.util.Properties;
  11. import com.hnjz.base.db.MetaDataUtil;
  12. /**
  13. * 根据传入的数据库表名,生成po属性
  14. * 以_结尾的会去掉_ 例如:数据库字段名称 id_,实体类属性名称:id
  15. * 以_分割的,会以_分割,分割后的字符串数组从第二个字符串开始首字母大写,然后再组成最终的属性名称
  16. * 例 :数据库字段名称unit_name,实体类属性名称:unitName
  17. * @param tableName
  18. */
  19. public class BuildPoByTable {
  20. public static void buildPoByTable(String tableName){
  21. Connection con = getJdbcConn();
  22. Statement st = null;
  23. ResultSet rs = null;
  24. String sql = "select * from "+tableName;
  25. try {
  26. st = con.createStatement();
  27. rs = st.executeQuery(sql);
  28. ResultSetMetaData md = rs.getMetaData();
  29. for(int i = 1;i<=md.getColumnCount();i++){
  30. String columnName = md.getColumnName(i);
  31. String columnType = md.getColumnTypeName(i);
  32. columnName = lowerCaseChar(columnName);
  33. int xsws = md.getScale(i);//小数点右边的位数
  34. //改造字段名称
  35. if(columnName.endsWith("_")){
  36. columnName = columnName.replace('_', ' ');
  37. }else if(columnName.contains("_")){
  38. String[] tempName = columnName.split("_");
  39. String tempstr = "";
  40. for(int j=1;j<tempName.length;j++){
  41. tempName[j] = PoFormConverseUtil.upCaseFirstChar(tempName[j]);
  42. tempstr = tempstr+tempName[j];
  43. }
  44. columnName = tempName[0]+tempstr;
  45. }
  46. if("VERSION_".equals(columnName)){
  47. continue;
  48. }else{
  49. if("VARCHAR2".equals(columnType)||"NVARCHAR2".equals(columnType)){
  50. System.out.println("private String "+columnName+";");
  51. }else if("NUMBER".equals(columnType)){
  52. if(xsws==0){
  53. System.out.println("private Integer "+columnName+";");
  54. }else if(xsws>0){
  55. System.out.println("private Double "+columnName+";");
  56. }
  57. }else if("DATE".equals(columnType)){
  58. System.out.println("private Date "+columnName+";");
  59. }else if("CLOB".equals(columnType)){
  60. System.out.println("private String "+columnName+";");
  61. }
  62. }
  63. }
  64. } catch (SQLException e) {
  65. // TODO Auto-generated catch block
  66. e.printStackTrace();
  67. }finally{
  68. try {
  69. con.close();
  70. } catch (SQLException e) {
  71. // TODO Auto-generated catch block
  72. e.printStackTrace();
  73. }
  74. }
  75. }
  76. public static Connection getJdbcConn(){
  77. Connection con = null;
  78. try {
  79. String name = "/jdbc.properties";
  80. Properties p = new Properties();
  81. InputStream in = MetaDataUtil.class.getResourceAsStream(name);
  82. p.load(in);
  83. String url = p.getProperty("jdbc.url");
  84. String username = p.getProperty("jdbc.username");
  85. String password = p.getProperty("jdbc.password");
  86. String driverName = p.getProperty("jdbc.driverClassName");
  87. Class.forName(driverName);
  88. //System.out.println("加载驱动成功!");
  89. //获取数据库连接
  90. con = DriverManager.getConnection(url, username, password);
  91. //System.out.println("获取数据库连接成功!");
  92. //System.out.println("进行数据库操作!");
  93. } catch (IOException e) {
  94. // TODO Auto-generated catch block
  95. e.printStackTrace();
  96. } catch (ClassNotFoundException e) {
  97. // TODO Auto-generated catch block
  98. e.printStackTrace();
  99. } catch (SQLException e) {
  100. // TODO Auto-generated catch block
  101. e.printStackTrace();
  102. }
  103. return con;
  104. }
  105. //字符串大写换小写
  106. public static String lowerCaseChar(String str){
  107. char[] chars = str.toCharArray();
  108. for(int i=0;i<chars.length;i++){
  109. if (chars[i] >= 'A' && chars[i] <= 'Z') {
  110. chars[i] = (char)(chars[i] + 32);
  111. }
  112. }
  113. return new String(chars);
  114. }
  115. }

控制台打印如下:

  1. private String id ;
  2. private String unitName;
  3. private String unitCode;
  4. private String unitAddr;
  5. private Double unitCapital;
  6. private Double unitInvestment;

字段已经有了,用myEclipse生成get,set方法即可。

注意:循环ResultSetMetaData下标从1开始,不是从0开始。

2、第二种方法(可以查出来注释):

利用下面的sql查出指定数据库表的字段信息,生成实体类

  1. SELECT C.COLUMN_NAME, C.DATA_TYPE, C.DATA_SCALE, D.COMMENTS
  2. FROM all_tab_columns C, all_col_comments D
  3. WHERE C.TABLE_NAME = D.TABLE_NAME
  4. AND C.OWNER = D.OWNER
  5. AND C.TABLE_NAME = 'tabname'
  6. AND D.TABLE_NAME = 'tabname'
  7. AND C.COLUMN_NAME = D.COLUMN_NAME
  8. AND C.OWNER = 'dbusername';

发表评论

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

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

相关阅读

    相关 java实体生成工具

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