1. 程式人生 > >mybatis generator為實體類生成自定義註釋(讀取資料庫欄位的註釋新增到實體類,不修改原始碼)

mybatis generator為實體類生成自定義註釋(讀取資料庫欄位的註釋新增到實體類,不修改原始碼)

我們都知道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(); 
} 
}