mybatis generator為實體類生成自定義註釋(讀取資料庫欄位的註釋新增到實體類,不修改原始碼)
阿新 • • 發佈:2018-12-14
我們都知道mybatis generator自動生成的註釋沒什麼實際作用,而且還增加了程式碼量。如果能將註釋從資料庫中撈取到,不僅能很大程度上增加程式碼的可讀性,而且減少了後期手動加註釋的工作量。
1、首先定義註釋生成外掛
package com.cmbc.dataplatform.dto.channellabel; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.Properties; import org.mybatis.generator.api.IntrospectedColumn; import org.mybatis.generator.api.IntrospectedTable; import org.mybatis.generator.api.dom.java.Field; import org.mybatis.generator.api.dom.java.InnerClass; import org.mybatis.generator.api.dom.java.Method; import org.mybatis.generator.api.dom.java.Parameter; import org.mybatis.generator.api.dom.java.TopLevelClass; import org.mybatis.generator.internal.DefaultCommentGenerator; public class MyCommentGenerator extends DefaultCommentGenerator { private Properties properties; private Properties systemPro; private boolean suppressDate; private boolean suppressAllComments; private String currentDateStr; public MyCommentGenerator() { super(); properties = new Properties(); systemPro = System.getProperties(); suppressDate = false; suppressAllComments = false; currentDateStr = (new SimpleDateFormat("yyyy-MM-dd")).format(new Date()); } public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) { if (suppressAllComments) { return; } StringBuilder sb = new StringBuilder(); field.addJavaDocLine("/**"); sb.append(" * "); sb.append(introspectedColumn.getRemarks()); sb.append("\n"); sb.append(" * 列名:" + introspectedColumn.getActualColumnName() + " 型別:" + introspectedColumn.getJdbcTypeName() + "(" + introspectedColumn.getLength() + ")" + " 允許空:" + introspectedColumn.isNullable() + " 預設值:" + introspectedColumn.getDefaultValue()); field.addJavaDocLine(sb.toString()); field.addJavaDocLine(" */"); } public void addFieldComment(Field field, IntrospectedTable introspectedTable) { } public void addGeneralMethodComment(Method method, IntrospectedTable introspectedTable) { if (suppressAllComments) { return; } StringBuilder sb = new StringBuilder(); sb.append("/**"); sb.append("\n"); sb.append(" * "); sb.append("\n"); sb.append(" * @author zhangqin" + "\n"); if (!suppressDate) { sb.append(" * @date " + currentDateStr + "\n"); } List<Parameter> parameters = method.getParameters(); for (Parameter parameter : parameters) { sb.append(" * @param " + parameter.getName() + "\n"); } sb.append(" * @return " + method.getReturnType()); sb.append("\n" + " */"); method.addJavaDocLine(sb.toString()); } public void addGetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) { } public void addSetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) { } public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable, boolean markAsDoNotDelete) { super.addClassComment(innerClass, introspectedTable, markAsDoNotDelete); } public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable) { } public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { if (suppressAllComments) { return; } StringBuilder sb = new StringBuilder(); sb.append("/**"); sb.append("\n"); sb.append("* "); sb.append("\n"); sb.append("* @author zhangqin" + "\n"); if (!suppressDate) { sb.append("* @date " + currentDateStr + "\n"); } sb.append("* 資料表" + introspectedTable.getFullyQualifiedTableNameAtRuntime() + "對映bean,由Mybaits自動生成工具生成"); sb.append("\n" + "*/"); topLevelClass.addJavaDocLine(sb.toString()); } }
2、然後為mybatisgenerator配置外掛
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <!--匯入屬性配置 --> <!--<properties resource="generator.properties"></properties> --> <!--指定特定資料庫的jdbc驅動jar包的位置 --> <classPathEntry location="D:\maven_peizhixinxi\local_repository\local_repository\mysql\mysql-connector-java\5.1.18\mysql-connector-java-5.1.18.jar" /> <context id="default" targetRuntime="MyBatis3"> <!-- optional,旨在建立class時,對註釋進行控制 --> <commentGenerator type="com.cmbc.dataplatform.dto.channellabel.MyCommentGenerator"> <!-- <property name="suppressDate" value="true" /> <property name="suppressAllComments" value="true" /> --> </commentGenerator> <!--jdbc的資料庫連線 --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://mysql.local.gene:3306/dms" userId="cmbc" password="Cmbc*1234!"> </jdbcConnection> <!-- 非必需,型別處理器,在資料庫型別和java型別之間的轉換控制 --> <javaTypeResolver> <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <!-- Model模型生成器,用來生成含有主鍵key的類,記錄類 以及查詢Example類 targetPackage 指定生成的model生成所在的包名 targetProject 指定在該專案下所在的路徑 --> <javaModelGenerator targetPackage="com.cmbc.cms.modules3" targetProject="src/main/java"> <!-- 是否允許子包,即targetPackage.schemaName.tableName --> <property name="enableSubPackages" value="false" /> <!-- 是否對model新增 建構函式 --> <property name="constructorBased" value="false" /> <!-- 是否對類CHAR型別的列的資料進行trim操作 --> <property name="trimStrings" value="true" /> <!-- 建立的Model物件是否 不可改變 即生成的Model物件不會有 setter方法,只有構造方法 --> <property name="immutable" value="false" /> </javaModelGenerator> <!--Mapper對映檔案生成所在的目錄 為每一個數據庫的表生成對應的SqlMap檔案 --> <sqlMapGenerator targetPackage="META-INF.mapper.cms3" targetProject="src/main/resources"> <property name="enableSubPackages" value="false" /> </sqlMapGenerator> <!-- 客戶端程式碼,生成易於使用的針對Model物件和XML配置檔案 的程式碼 type="ANNOTATEDMAPPER",生成Java Model 和基於註解的Mapper物件 type="MIXEDMAPPER",生成基於註解的Java Model 和相應的Mapper物件 type="XMLMAPPER",生成SQLMap XML檔案和獨立的Mapper介面 --> <javaClientGenerator targetPackage="com.cmbc.cms.dao3" targetProject="src/main/java" type="XMLMAPPER"> <property name="enableSubPackages" value="true" /> </javaClientGenerator> <table tableName="application_detail" domainObjectName="applicationDetail" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"> </table> </context> </generatorConfiguration>
3、使用mybatis generator自動生成程式碼
由於使用的是maven專案,而且使用了了自定義的外掛,所以採用 main方法啟動,適用場景更對,而且能將程式碼生成到對應的工程目錄下,免去拷貝的過程(當然也可以用maven外掛、控制檯、eclipse外掛等多種方式啟動)。
注意:當前類所在的工程要新增mybatis generator的依賴包
啟動類如下
package com.cmbc.dataplatform.dto.channellabel; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.mybatis.generator.api.MyBatisGenerator; import org.mybatis.generator.config.Configuration; import org.mybatis.generator.config.xml.ConfigurationParser; import org.mybatis.generator.internal.DefaultShellCallback; public class MyBatisGeneratorRun { public static void main(String[] args) throws Exception{ MyBatisGeneratorRun app = new MyBatisGeneratorRun(); System.out.println(app.getClass().getResource("/").getPath()); app.generator(); System.out.println(System.getProperty("user.dir")); } public void generator() throws Exception{ List<String> warnings = new ArrayList<String>(); boolean overwrite = true; InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("generatorConfig.xml"); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = cp.parseConfiguration(resourceAsStream); DefaultShellCallback callback = new DefaultShellCallback(overwrite); MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); myBatisGenerator.generate(null); for(String warning:warnings){ System.out.println(warning); } } }
再貼下專案的maven依賴,有需要的可以看下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>party.lovey</groupId>
<artifactId>generator</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.29</version>
</dependency>
</dependencies>
</project>
4、生成效果
package com.cmbc.cms.modules3;
import java.util.Date;
/**
*
* @author zhangqin
* @date 2018-10-11
* 資料表application_detail對映bean,由Mybaits自動生成工具生成
*/
public class applicationDetail {
/**
* 主鍵 唯一標識
* 列名:id 型別:INTEGER(10) 允許空:false 預設值:null
*/
private Integer id;
/**
* 申請原始資訊表id
* 列名:application_original_id 型別:INTEGER(10) 允許空:true 預設值:null
*/
private Integer applicationOriginalId;
/**
* 機構id
* 列名:org_id 型別:VARCHAR(12) 允許空:true 預設值:null
*/
private String orgId;
/**
* 進件編碼
* 列名:zg_application_no 型別:VARCHAR(15) 允許空:false 預設值:null
*/
private String zgApplicationNo;
/**
* 渠道程式碼
* 列名:source 型別:VARCHAR(20) 允許空:true 預設值:null
*/
private String source;
/**
* 申請時間
* 列名:apply_time 型別:TIMESTAMP(19) 允許空:true 預設值:null
*/
private Date applyTime;
/**
* 申請人姓名
* 列名:apply_name 型別:VARCHAR(16) 允許空:true 預設值:null
*/
private String applyName;
/**
* 申請人證件號
* 列名:apply_id 型別:VARCHAR(18) 允許空:true 預設值:null
*/
private String applyId;
/**
* 申請人手機號碼
* 列名:apply_phone 型別:VARCHAR(20) 允許空:true 預設值:null
*/
private String applyPhone;
/**
* 單位地址-省
* 列名:com_province 型別:VARCHAR(60) 允許空:true 預設值:null
*/
private String comProvince;
/**
* 單位地址-市
* 列名:com_city 型別:VARCHAR(60) 允許空:true 預設值:null
*/
private String comCity;
/**
* 單位地址-區
* 列名:com_area 型別:VARCHAR(60) 允許空:true 預設值:null
*/
private String comArea;
/**
* 單位地址-詳細地址
* 列名:com_detail_addr 型別:VARCHAR(200) 允許空:true 預設值:null
*/
private String comDetailAddr;
/**
* 是否是持卡人
* 列名:is_card_holder 型別:BIT(0) 允許空:true 預設值:null
*/
private Boolean isCardHolder;
/**
* 推薦人id
* 列名:recom_id 型別:VARCHAR(16) 允許空:true 預設值:null
*/
private String recomId;
/**
* 父推薦人id
* 列名:parent_recom_id 型別:VARCHAR(16) 允許空:true 預設值:null
*/
private String parentRecomId;
/**
* 打標異常,更新打標狀態【'notmark'-還沒有打標 'success'-打標成功 '其他'-打標異常】
* 列名:state 型別:VARCHAR(1024) 允許空:true 預設值:notmark
*/
private String state;
/**
* 建立時間
* 列名:create_time 型別:TIMESTAMP(19) 允許空:true 預設值:CURRENT_TIMESTAMP
*/
private Date createTime;
/**
* 更新時間
* 列名:modify_time 型別:TIMESTAMP(19) 允許空:true 預設值:CURRENT_TIMESTAMP
*/
private Date modifyTime;
/**
* 批次號碼
* 列名:batch_no 型別:VARCHAR(16) 允許空:false 預設值:null
*/
private String batchNo;
/**
* 擴充套件欄位1
* 列名:ext_1 型別:VARCHAR(256) 允許空:true 預設值:null
*/
private String ext1;
/**
* 擴充套件欄位2
* 列名:ext_2 型別:VARCHAR(256) 允許空:true 預設值:null
*/
private String ext2;
/**
* 擴充套件欄位3
* 列名:ext_3 型別:VARCHAR(256) 允許空:true 預設值:null
*/
private String ext3;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getApplicationOriginalId() {
return applicationOriginalId;
}
public void setApplicationOriginalId(Integer applicationOriginalId) {
this.applicationOriginalId = applicationOriginalId;
}
public String getOrgId() {
return orgId;
}
public void setOrgId(String orgId) {
this.orgId = orgId == null ? null : orgId.trim();
}
public String getZgApplicationNo() {
return zgApplicationNo;
}
public void setZgApplicationNo(String zgApplicationNo) {
this.zgApplicationNo = zgApplicationNo == null ? null : zgApplicationNo.trim();
}
public String getSource() {
return source;
}
public void setSource(String source) {
this.source = source == null ? null : source.trim();
}
public Date getApplyTime() {
return applyTime;
}
public void setApplyTime(Date applyTime) {
this.applyTime = applyTime;
}
public String getApplyName() {
return applyName;
}
public void setApplyName(String applyName) {
this.applyName = applyName == null ? null : applyName.trim();
}
public String getApplyId() {
return applyId;
}
public void setApplyId(String applyId) {
this.applyId = applyId == null ? null : applyId.trim();
}
public String getApplyPhone() {
return applyPhone;
}
public void setApplyPhone(String applyPhone) {
this.applyPhone = applyPhone == null ? null : applyPhone.trim();
}
public String getComProvince() {
return comProvince;
}
public void setComProvince(String comProvince) {
this.comProvince = comProvince == null ? null : comProvince.trim();
}
public String getComCity() {
return comCity;
}
public void setComCity(String comCity) {
this.comCity = comCity == null ? null : comCity.trim();
}
public String getComArea() {
return comArea;
}
public void setComArea(String comArea) {
this.comArea = comArea == null ? null : comArea.trim();
}
public String getComDetailAddr() {
return comDetailAddr;
}
public void setComDetailAddr(String comDetailAddr) {
this.comDetailAddr = comDetailAddr == null ? null : comDetailAddr.trim();
}
public Boolean getIsCardHolder() {
return isCardHolder;
}
public void setIsCardHolder(Boolean isCardHolder) {
this.isCardHolder = isCardHolder;
}
public String getRecomId() {
return recomId;
}
public void setRecomId(String recomId) {
this.recomId = recomId == null ? null : recomId.trim();
}
public String getParentRecomId() {
return parentRecomId;
}
public void setParentRecomId(String parentRecomId) {
this.parentRecomId = parentRecomId == null ? null : parentRecomId.trim();
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state == null ? null : state.trim();
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getModifyTime() {
return modifyTime;
}
public void setModifyTime(Date modifyTime) {
this.modifyTime = modifyTime;
}
public String getBatchNo() {
return batchNo;
}
public void setBatchNo(String batchNo) {
this.batchNo = batchNo == null ? null : batchNo.trim();
}
public String getExt1() {
return ext1;
}
public void setExt1(String ext1) {
this.ext1 = ext1 == null ? null : ext1.trim();
}
public String getExt2() {
return ext2;
}
public void setExt2(String ext2) {
this.ext2 = ext2 == null ? null : ext2.trim();
}
public String getExt3() {
return ext3;
}
public void setExt3(String ext3) {
this.ext3 = ext3 == null ? null : ext3.trim();
}
}