最近接触到的项目都会用到mybatis框架,会涉及到实体和表的映射,mapper以及mapper.xml的生成,mybatis-generator插件可以根据表结构自动生成实体、mapper、mapper.xml,大大简化了开发的工作量,现有的插件有点小缺陷,注释没有获取数据库字段的注释(mysql为例就是字段的comment),包括不支持lombok。
查阅相关资料,我这边修改了下mybatis-generator-core-1.3.7.jar包,生成的实体取数据库注释,并支持lombok,废话不多说,先看下效果。
建表语句:
CREATE TABLE `t_person` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘自增ID‘, `name` varchar(50) NOT NULL COMMENT ‘姓名‘, `nick` varchar(50) NOT NULL COMMENT ‘昵称‘, `sex` varchar(50) NOT NULL COMMENT ‘性别‘, `age` int(5) NOT NULL COMMENT ‘年龄‘, `create_time` datetime NOT NULL COMMENT ‘创建时间‘, `modify_time` datetime DEFAULT NULL COMMENT ‘最后修改时间‘, PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=‘用户表‘;
生成的实体类
package com.sicent.firm.bean; import java.util.Date; import lombok.Data; /** * t_person * @author yl.bu * @date 2019-05-30 09:01:47 */ @Data public class Person { /** * 自增ID */ private Long id; /** * 姓名 */ private String name; /** * 昵称 */ private String nick; /** * 性别 */ private String sex; /** * 年龄 */ private Integer age; /** * 创建时间 */ private Date createTime; /** * 最后修改时间 */ private Date modifyTime; }
下面讲一下实现方式:
第一步:新建类 MyBatisPlugin 继承 PluginAdapter,如下所示
package org.mybatis.generator.plugins; import java.util.Date; import java.util.List; import org.apache.commons.lang3.time.DateFormatUtils; import org.mybatis.generator.api.IntrospectedColumn; import org.mybatis.generator.api.IntrospectedTable; import org.mybatis.generator.api.PluginAdapter; import org.mybatis.generator.api.dom.java.Field; import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType; import org.mybatis.generator.api.dom.java.Interface; import org.mybatis.generator.api.dom.java.Method; import org.mybatis.generator.api.dom.java.TopLevelClass; import org.mybatis.generator.internal.util.StringUtility; /** * @ClassName: MyBatisPlugin * @Description: mybatis-generator注释插件 * @author buyl * @date 2019年5月30日 上午9:34:55 * @Version V1.0 */ public class MyBatisPlugin extends PluginAdapter { @Override public boolean validate(List<String> list) { return true; } @Override public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { // 添加domain的import topLevelClass.addImportedType("lombok.Data"); // 添加domain的注解 topLevelClass.addAnnotation("@Data"); topLevelClass.addJavaDocLine("/**"); String remarks = introspectedTable.getRemarks(); if (StringUtility.stringHasValue(remarks)) { String[] remarkLines = remarks.split(System.getProperty("line.separator")); for (String remarkLine : remarkLines) { topLevelClass.addJavaDocLine(" * " + remarkLine); } } StringBuilder sb = new StringBuilder(); sb.append(" * ").append(introspectedTable.getFullyQualifiedTable()); topLevelClass.addJavaDocLine(sb.toString()); sb.setLength(0); sb.append(" * @author ").append(System.getProperties().getProperty("user.name")); topLevelClass.addJavaDocLine(sb.toString()); sb.setLength(0); sb.append(" * @date "); sb.append(getDateString()); topLevelClass.addJavaDocLine(sb.toString()); topLevelClass.addJavaDocLine(" */"); return true; } @Override public boolean modelFieldGenerated(Field field, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) { field.addJavaDocLine("/**"); String remarks = introspectedColumn.getRemarks(); if (StringUtility.stringHasValue(remarks)) { String[] remarkLines = remarks.split(System.getProperty("line.separator")); for (String remarkLine : remarkLines) { field.addJavaDocLine(" * " + remarkLine); } } field.addJavaDocLine(" */"); return true; } @Override public boolean clientGenerated(Interface interfaze, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { // 添加Mapper的import interfaze.addImportedType(new FullyQualifiedJavaType("org.apache.ibatis.annotations.Mapper")); // 添加Mapper的注解 interfaze.addAnnotation("@Mapper"); return true; } @Override public boolean modelSetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) { // 不生成getter return false; } @Override public boolean modelGetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) { // 不生成setter return false; } protected String getDateString() { return DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"); } }
第二步:压缩解压工具打开mybatis-generator-core-1.3.7.jar, 拷贝第一步编译后的class文件即MyBatisPlugin.class到org.mybatis.generator.plugins下,
懒的人可直接下载:https://download.csdn.net/download/littlelittlequie/11216045,如下图所示:
第三步:pom依赖,mybatis-generator-core-1.3.7.jar需要为上面替换过的,如果只能用原来的mybatis-generator-core-1.3.7.jar,只需要把第一步的java代码拷贝一份到项目中即可(有不懂得可以下来咨询我)
<dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.7</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency>
第四步:配置generatorConfig.xml
<?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> <!-- 引入mysql-connector-java-5.1.47.jar位置 --> <classPathEntry location="D:/workspaces/workspace/z-mybatis-generator/lib/mysql-connector-java-5.1.47.jar" /> <!-- 插件配置并去掉自动生成的注释 是否去除自动生成的注释 true:是 : false:否 --> <context id="DB2Tables" targetRuntime="MyBatis3"> <plugin type="org.mybatis.generator.plugins.MyBatisPlugin" > <property name="hasLombok" value="true"/> </plugin> <commentGenerator> <property name="suppressAllComments" value="true" /> </commentGenerator> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1/test" userId="root" password="123456"> </jdbcConnection> <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer true,把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal --> <javaTypeResolver> <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <!-- 生成model模型,对应的包路径,以及文件存放路径(targetProject),targetProject可以指定具体的路径 也可以使用“MAVEN”来自动生成,这样生成的代码会在target/generatord-source目录下 --> <javaModelGenerator targetPackage="com.sicent.firm.bean" targetProject="src/main/java"> <property name="enableSubPackages" value="true" /> <!-- 从数据库返回的值被清理前后的空格 --> <property name="trimStrings" value="true" /> </javaModelGenerator> <!--对应的mapper.xml文件 --> <sqlMapGenerator targetPackage="com.sicent.firm.dao" targetProject="src/main/resources"> <property name="enableSubPackages" value="true" /> </sqlMapGenerator> <!-- 对应的Mapper接口类文件 --> <javaClientGenerator type="XMLMAPPER" targetPackage="com.sicent.firm.dao" targetProject="src/main/java"> <property name="enableSubPackages" value="true" /> </javaClientGenerator> <table tableName="t_person" domainObjectName="Person" enableCountByExample="true" enableUpdateByExample="true" enableDeleteByExample="false" enableSelectByExample="true" selectByExampleQueryId="false"> <property name="useActualColumnNames" value="false"/> </table> </context> </generatorConfiguration>
关键的地方就是配置插件:
<plugin type="org.mybatis.generator.plugins.MyBatisPlugin" > <property name="hasLombok" value="true"/> </plugin>
第五步:执行命令 java -jar mybatis-generator-core-1.3.7.jar -configfile generatorConfig.xml -overwrite
或者eclipse或者idea安装mybatis-generator插件运行
插件安装以及其他涉及到的我就不详细讲了,有问题可随时找我。
原文地址:https://www.cnblogs.com/kukudexin/p/10947657.html