1. 程式人生 > >根據建表語句生成實體類和查詢用的ResultMap

根據建表語句生成實體類和查詢用的ResultMap

import java.io.*;

public class Main {

    public static void main(String[] args) {
        String filePath = "D:\\00t1.txt";
        Main main = new Main();
        main.getModel(filePath);
        main.getResultMapXML(filePath);
    }//main

    /**
     * 根據sql生成實體類,支援多個建表語句
     * 輸入:建表語句的檔案路徑
     * 輸出:ResultMap
     *
     * @param filePath
     */
    private void getModel(String filePath) {
        System.out.println("//------------以下是生成的Model程式碼-----------");
        InputStream is = null;
        String propertyName;
        String typeName;
        String commentStr;
        try {
            is = new FileInputStream(filePath);
            BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"), 512);
            // 讀取一行,儲存於字串列表中
            for (String line = reader.readLine(); line != null; line = reader.readLine()) {
                if (line.length() <= 1) {
                    continue;
                }
                //  生成Model, private String aaColumn; //a_column的註釋
                if (line.contains("CREATE")) {
                    System.out.println();
                    System.out.println(line.substring(line.indexOf("`") + 1, line.lastIndexOf("`")));
                }
                propertyName = this.getPropertyName(line);
                typeName = this.getType(line);
                if (!"NULL".equals(typeName) && !"NULL".equals(propertyName)) {
                    commentStr = this.getComment(line);
                    System.out.println("private " + typeName + " " + propertyName + "; //" + commentStr);
                }
            }
        } catch (FileNotFoundException fnfe) {
            fnfe.printStackTrace();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        } finally {
            try {
                if (is != null) {
                    is.close();
                    is = null;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }//getModel

    /**
     * 根據SQL獲取 ResultMap XML程式碼,支援多個建表語句
     * 輸入:建表語句的檔案路徑
     * 輸出:ResultMap
     *
     * @param filePath
     */
    private void getResultMapXML(String filePath) {
        InputStream is = null;
        try {
            is = new FileInputStream(filePath);
            BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"), 512);
            // 讀取一行,儲存於字串列表中
            System.out.println();
            System.out.println("<!--  ----------以下是生成的XML程式碼---------  -->");
            String tableName;
            String typeName;
            String propertyName;
            String columnName;
            StringBuilder sbTableName = new StringBuilder();
            for (String line = reader.readLine(); line != null; line = reader.readLine()) {
                line = line.trim();
                if (line == null || line.length() == 0 || line.contains("-") || line.contains("DROP")) {
                    continue;
                }
                if (line.contains("CREATE")) {
                    tableName = line.substring(line.indexOf("`") + 1, line.lastIndexOf("`"));
                    tableName = this.getTableName(tableName);
                    sbTableName.append("<resultMap id=\"").append(tableName).append("Map\"  ").append("class=\"").append(tableName).append("\">");
                    System.out.println(sbTableName.toString());
                    sbTableName.delete(0, sbTableName.length());
                }
                //生成xml <result property="abcProperty" column="abc_property"/>
                propertyName = this.getPropertyName(line);
                if (!"NULL".equals(propertyName)) {
                    columnName = this.getColumnName(line);
                    typeName = this.getType(line);
                    System.out.print("<result property=" + "\"" + propertyName + "\""
                            + " column=" + "\"" + columnName + "\"");
                    if ("Date".equals(typeName)) {
                        System.out.println("  javaType=\"java.util.Date\""
                                + "/>");
                    } else {
                        System.out.println("/>");
                    }
                }
                if (line.contains("ENGINE=")) {
                    System.out.println("</resultMap>");
                    System.out.println("");
                }
            }//for
        } catch (FileNotFoundException fnfe) {
            fnfe.printStackTrace();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        } finally {
            try {
                if (is != null) {
                    is.close();
                    is = null;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }//getResultMapXML

    /**
     * 獲取對應的java型別
     *
     * @param line
     * @return
     */
    private String getType(String line) {
        if (line.length() > 1 && !line.contains("CREATE") && !line.contains("PRIMARY") && !line.contains("KEY") && !line.contains("ENGINE=")) {
            line = line.substring(line.lastIndexOf("`") + 2, line.length());
            line = line.substring(0, line.indexOf(" "));
            if (line.contains("bigint")) {
                return "Long";
            } else if (line.contains("char")) {//此時也包括 varchar型別
                return "String";
            } else if (line.contains("double")) {
                return "Double";
            } else if (line.contains("int")) {//此時也包括 tinyint型別
                return "Integer";
            } else if (line.contains("date")) {//此時也包括 datetime型別
                return "Date";
            }
        }
        return "NULL";
    }

    /**
     * 把欄位名轉化為駝峰命名的屬性名,abc_property ->abcProperty
     *
     * @param line
     * @return
     */
    private String getPropertyName(String line) {
        if (line.length() > 1 && !line.contains("CREATE") && !line.contains("PRIMARY") && !line.contains("KEY") && !line.contains("ENGINE=")) {
            String tempDelimiter = line.substring(line.indexOf("`") + 1, line.lastIndexOf("`"));
            String tempDelimiterArray[] = tempDelimiter.split("_");//如果不包含“_”,此時就含有字串一個元素
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < tempDelimiterArray.length; i++) {
                if (i == 0) {
                    sb.append(tempDelimiterArray[i]);
                }
                if (i != 0) {  //除第一個單詞外,其他的單詞的首字母大寫,String substring(int beginIndex)
                    sb.append(tempDelimiterArray[i].substring(0, 1).toUpperCase() + tempDelimiterArray[i].substring(1));
                }
            }//for
            return sb.toString();
        }
        return "NULL";
    }

    /**
     * 獲取SQL的註釋
     *
     * @param line
     * @return
     */
    private String getComment(String line) {
        if (line.contains("COMMENT")) {
            return line.substring(line.indexOf("'") + 1, line.lastIndexOf("',"));
        } else if (line.contains("AUTO_INCREMENT")) {
            return "主鍵Id";
        } else if (line.contains("created_time")) {
            return "建立時間";
        } else if (line.contains("updated_time")) {
            return "修改時間";
        }
        return "NULL";
    }

    /**
     * 獲取sql的欄位名.`abc_property` -> abc_property
     *
     * @param line
     * @return
     */
    private String getColumnName(String line) {
        line = line.substring(line.indexOf("`") + 1, line.lastIndexOf("`"));
        return line;
    }

    /**
     * 轉化為駝峰命名的表名,abc_table -> AbcTable
     *
     * @param tempDelimiter
     * @return
     */
    private String getTableName(String tempDelimiter) {
        String tempDelimiterArray[] = tempDelimiter.split("_");
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < tempDelimiterArray.length; i++) {
            sb.append(tempDelimiterArray[i].substring(0, 1).toUpperCase() + tempDelimiterArray[i].substring(1));
        }//for
        return sb.toString();
    }

}

輸入檔案內容:

CREATE TABLE `abc_table` (
  `id` bigint(20) NOT NULL COMMENT 'ID',
  `aa_column` char(1) DEFAULT NULL COMMENT 'aa_column的註釋',
  `bb_column` varchar(500) DEFAULT NULL COMMENT 'bb_column的註釋',
  `start_time` datetime NOT NULL COMMENT '開始時間',
  `end_time` datetime NOT NULL COMMENT '結束時間',
  `cc_column` tinyint(4) NOT NULL COMMENT 'cc_column的註釋',
  `dt` varchar(255) NOT NULL COMMENT '分割槽',
  `dt` date NOT NULL COMMENT '日期',
  `created_time` datetime NOT NULL,
  `updated_time` datetime NOT NULL,
  `dd_column` double DEFAULT NULL COMMENT 'dd_column的註釋',
  `created_date` datetime NOT NULL COMMENT '建立時間',
  `updated_date` datetime NOT NULL COMMENT '更新時間',
  PRIMARY KEY (`id`),
  KEY `idx_a_column` (`a_column`),
  KEY `idx_b_column_time` (`b_column`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='xxxx表';


CREATE TABLE `abc_table` (
  `id` bigint(20) NOT NULL COMMENT 'ID',
  `aa_column` char(1) DEFAULT NULL COMMENT 'aa_column的註釋',
  `bb_column` varchar(500) DEFAULT NULL COMMENT 'bb_column的註釋',
  `start_time` datetime NOT NULL COMMENT '開始時間',
  `end_time` datetime NOT NULL COMMENT '結束時間',
  `cc_column` tinyint(4) NOT NULL COMMENT 'cc_column的註釋',
  `dt` varchar(255) NOT NULL COMMENT '分割槽',
  `dt` date NOT NULL COMMENT '日期',
  `created_time` datetime NOT NULL,
  `updated_time` datetime NOT NULL,
  `dd_column` double DEFAULT NULL COMMENT 'dd_column的註釋',
  `created_date` datetime NOT NULL COMMENT '建立時間',
  `updated_date` datetime NOT NULL COMMENT '更新時間',
  PRIMARY KEY (`id`),
  KEY `idx_a_column` (`a_column`),
  KEY `idx_b_column_time` (`b_column`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='xxxx表';

輸出內容:

//------------以下是生成的Model程式碼-----------

abc_table
private Long id; //ID
private String aaColumn; //aa_column的註釋
private String bbColumn; //bb_column的註釋
private Date startTime; //開始時間
private Date endTime; //結束時間
private Integer ccColumn; //cc_column的註釋
private String dt; //分割槽
private Date dt; //日期
private Date createdTime; //建立時間
private Date updatedTime; //修改時間
private Double ddColumn; //dd_column的註釋
private Date createdDate; //建立時間
private Date updatedDate; //更新時間

abc_table
private Long id; //ID
private String aaColumn; //aa_column的註釋
private String bbColumn; //bb_column的註釋
private Date startTime; //開始時間
private Date endTime; //結束時間
private Integer ccColumn; //cc_column的註釋
private String dt; //分割槽
private Date dt; //日期
private Date createdTime; //建立時間
private Date updatedTime; //修改時間
private Double ddColumn; //dd_column的註釋
private Date createdDate; //建立時間
private Date updatedDate; //更新時間

<!--  ----------以下是生成的XML程式碼---------  -->
<resultMap id="AbcTableMap"  class="AbcTable">
<result property="id" column="id"/>
<result property="aaColumn" column="aa_column"/>
<result property="bbColumn" column="bb_column"/>
<result property="startTime" column="start_time"  javaType="java.util.Date"/>
<result property="endTime" column="end_time"  javaType="java.util.Date"/>
<result property="ccColumn" column="cc_column"/>
<result property="dt" column="dt"/>
<result property="dt" column="dt"  javaType="java.util.Date"/>
<result property="createdTime" column="created_time"  javaType="java.util.Date"/>
<result property="updatedTime" column="updated_time"  javaType="java.util.Date"/>
<result property="ddColumn" column="dd_column"/>
<result property="createdDate" column="created_date"  javaType="java.util.Date"/>
<result property="updatedDate" column="updated_date"  javaType="java.util.Date"/>
</resultMap>

<resultMap id="AbcTableMap"  class="AbcTable">
<result property="id" column="id"/>
<result property="aaColumn" column="aa_column"/>
<result property="bbColumn" column="bb_column"/>
<result property="startTime" column="start_time"  javaType="java.util.Date"/>
<result property="endTime" column="end_time"  javaType="java.util.Date"/>
<result property="ccColumn" column="cc_column"/>
<result property="dt" column="dt"/>
<result property="dt" column="dt"  javaType="java.util.Date"/>
<result property="createdTime" column="created_time"  javaType="java.util.Date"/>
<result property="updatedTime" column="updated_time"  javaType="java.util.Date"/>
<result property="ddColumn" column="dd_column"/>
<result property="createdDate" column="created_date"  javaType="java.util.Date"/>
<result property="updatedDate" column="updated_date"  javaType="java.util.Date"/>
</resultMap>