mybatis generator为实体类生成自定义注释(读取数据库字段的注释添加到实体类,不修改源码)

我们都知道mybatis generator自动生成的注释没什么实际作用,而且还增加了代码量。如果能将注释从数据库中捞取到,不仅能很大程度上增加代码的可读性,而且减少了后期手动加注释的工作量。

1、首先定义注释生成插件

package com.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 zhangsan" + "\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 zhangsan" + "\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.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="mmmm" 
password="*1234!"> 
</jdbcConnection> 


<!-- 非必需,类型处理器,在数据库类型和java类型之间的转换控制 --> 
<javaTypeResolver> 
<property name="forceBigDecimals" value="false" /> 
</javaTypeResolver> 


<!-- Model模型生成器,用来生成含有主键key的类,记录类 以及查询Example类 targetPackage 指定生成的model生成所在的包名 
targetProject 指定在该项目下所在的路径 --> 
<javaModelGenerator targetPackage="com.mmmm.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.mmmm.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.mmmm.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.mmmm.cms.modules3; 

import java.util.Date; 

/** 
* 
* @author zhangsan
* @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(); 
} 
}

 

 

 

 

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值