背景:
日常开发中, 如果新建表, 手动敲写 model,dao 和对应的 mapper.xml 文件, 费时费力且容易出错,
所以采用 mybatis 自动生成 model,dao 及对应的 mapper.xml 文件. 代码注释风格采用自定义注释.
环境:
jdk1.8,maven,MySQL
项目结构:
mbg-comment: 自定义注释
pom 文件:
- <?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.lw</groupId>
- <artifactId>mbg-comment</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <name>mbg-comment</name>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <mybatis.generator.version>1.4.0</mybatis.generator.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.mybatis.generator</groupId>
- <artifactId>mybatis-generator-core</artifactId>
- <version>${mybatis.generator.version}</version>
- </dependency>
- </dependencies>
- </project>
如果要实现自定义注释功能, 需要实现 CommentGenerator 接口;
我采用的是, 创建 EmptyCommentGenerator 抽象类实现 CommentGenerator 接口, 创建 MyCommentGenerator 继承 EmptyCommentGenerator 抽象类;
EmptyCommentGenerator 抽象类重写 CommentGenerator 接口中所有的方法即可;
MyCommentGenerator 类代码, 将需要具体实现的方法重写逻辑即可;
- package com.lw.mbgcomment.comment;
- 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.TopLevelClass;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import java.util.Properties;
- /**
- * @Classname MySQLCommentGenerator
- * @Description 自定义注释
- * @Date 2019/12/6 13:32
- * @Author lw
- */
- public class MyCommentGenerator extends EmptyCommentGenerator {
- private Properties properties;
- public MyCommentGenerator() {
- properties = new Properties();
- }
- /**
- * 添加配置属性
- *
- * @param properties
- */
- @Override
- public void addConfigurationProperties(Properties properties) {
- this.properties.putAll(properties);
- }
- /**
- * 模型类注释
- *
- * @param topLevelClass
- * @param introspectedTable
- */
- @Override
- public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
- String author = properties.getProperty("author");
- String dateFormat = properties.getProperty("dateFormat", "yyyy-MM-dd");
- SimpleDateFormat dateFormatter = new SimpleDateFormat(dateFormat);
- // 获取表注释
- String remarks = introspectedTable.getRemarks();
- // 组装注释模板
- topLevelClass.addJavaDocLine("/**");
- topLevelClass.addJavaDocLine("*" + remarks + "实体类");
- topLevelClass.addJavaDocLine("*");
- topLevelClass.addJavaDocLine("* @author" + author);
- topLevelClass.addJavaDocLine("* @date" + dateFormatter.format(new Date()));
- topLevelClass.addJavaDocLine("*/");
- }
- /**
- * 字段注释
- *
- * @param field
- * @param introspectedTable
- * @param introspectedColumn
- */
- @Override
- public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
- // 获取列注释
- String remarks = introspectedColumn.getRemarks();
- // 组装注释模板
- field.addJavaDocLine("/**" + remarks + "*/");
- }
- }
- View Code
mbg-service: 代码生成
pom 文件:
- <?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.lw</groupId>
- <artifactId>mbg-service</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <name>mbg-service</name>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
- <maven.compiler.source>1.8</maven.compiler.source>
- <maven.compiler.target>1.8</maven.compiler.target>
- <mybatis.generator.version>1.4.0</mybatis.generator.version>
- <MySQL.connector.version>5.1.40</MySQL.connector.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.mybatis.generator</groupId>
- <artifactId>mybatis-generator-core</artifactId>
- <version>${mybatis.generator.version}</version>
- </dependency>
- <dependency>
- <groupId>MySQL</groupId>
- <artifactId>MySQL-connector-java</artifactId>
- <version>${MySQL.connector.version}</version>
- </dependency>
- <!-- 通过 java 代码 GeneratorClient 运行 main 方法时, 将此依赖放开;
- 不然会找不到自定义注释类, 要求 classpath 保持一致;-->
- <dependency>
- <groupId>com.lw</groupId>
- <artifactId>mbg-comment</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- </dependency>
- </dependencies>
- <build>
- <plugins>
- <plugin>
- <groupId>org.mybatis.generator</groupId>
- <artifactId>mybatis-generator-maven-plugin</artifactId>
- <version>${mybatis.generator.version}</version>
- <dependencies>
- <dependency>
- <groupId>MySQL</groupId>
- <artifactId>MySQL-connector-java</artifactId>
- <version>${MySQL.connector.version}</version>
- </dependency>
- <dependency>
- <groupId>com.lw</groupId>
- <artifactId>mbg-comment</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- </dependency>
- </dependencies>
- <executions>
- <execution>
- <id>Generate MyBatis Artifacts</id>
- <phase>package</phase>
- <goals>
- <goal>generate</goal>
- </goals>
- </execution>
- </executions>
- <configuration>
- <!-- 允许移动生成的文件 -->
- <verbose>true</verbose>
- <!-- 是否覆盖 -->
- <overwrite>true</overwrite>
- <!-- 自动生成的配置文件 -->
- <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
- </configuration>
- </plugin>
- </plugins>
- <resources>
- <resource>
- <directory>src/main/resources</directory>
- <includes>
- <include>*.properties</include>
- <include>*.xml</include>
- </includes>
- <excludes>
- <exclude>generatorConfig-template.xml</exclude>
- </excludes>
- <filtering>false</filtering>
- </resource>
- </resources>
- </build>
- </project>
- View Code
生成代码配置文件:
<?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="jdbc.properties"/> <!-- 环境信息 --> <context id="myMbg" targetRuntime="MyBatis3Simple" defaultModelType="flat"> <!-- 生成的 Java 文件的编码 --> <property name="javaFileEncoding" value="UTF-8"/> <!-- 格式化 java 代码 --> <property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/> <!-- 格式化 XML 代码 --> <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/> <!-- 标记数据库对象名的符号, MYSQL 默认是 ` 反引号 --> <property name="beginningDelimiter" value="`"/> <property name="endingDelimiter" value="`"/> <!-- 自定义注释生成器 --> <commentGenerator type="com.lw.mbgcomment.comment.MyCommentGenerator"> <property name="author" value="lw"/> <property name="dateFormat" value="yyyy/MM/dd HH:mm:ss"/> </commentGenerator> <!-- jdbc 配置 --> <jdbcConnection driverClass="${jdbc_driver}" connectionURL="${jdbc_url}" userId="${jdbc_username}" password="${jdbc_password}"> <property name="useInformationSchema" value="true" /> </jdbcConnection> <!-- java 类型处理 --> <javaTypeResolver> <property name="forceBigDecimals" value="false"/> </javaTypeResolver> <!-- 生成 Entity 类存放位置 --> <!-- 注意: 通过 java 代码 GeneratorClient 运行 main 方法时, targetProject="mbg-service/src/main/java" --> <javaModelGenerator targetPackage="com.lw.mbgservice.entity" targetProject="src/main/java"> <!-- 是否允许建立子包 (对应 MySql 的 scheme), 默认为 false --> <property name="enableSubPackages" value="true"/> <!-- 设置是否在 getter 方法中, 对 String 类型字段调用 trim() 方法 --> <property name="trimStrings" value="false"/> </javaModelGenerator> <!-- 生成映射文件存放位置 --> <!-- 注意: 通过 java 代码 GeneratorClient 运行 main 方法时, targetProject="mbg-service/src/main/java" --> <sqlMapGenerator targetPackage="mapping" targetProject="src/main/resources"> <property name="enableSubPackages" value="true"/> </sqlMapGenerator> <!-- 生成 Dao 类存放位置 --> <!-- 注意: 通过 java 代码 GeneratorClient 运行 main 方法时, targetProject="mbg-service/src/main/java" --> <javaClientGenerator type="XMLMAPPER" targetPackage="com.lw.mbgservice.dao" targetProject="src/main/java"> <property name="enableSubPackages" value="true"/> </javaClientGenerator> <!-- 设置数据库的表名和实体类名 --> <table tableName="c_bankcard_agreement" domainObjectName="BankcardAgreementEntity"/> <table tableName="b_phone_white_pro" domainObjectName="PhoneWhitePro"/> </context> </generatorConfiguration> View Code
注意: 注释 type 是自定义注释类
代码生成方式, 本文讲述两种 (java 代码运行和 mvn 插件):
1.mvn 插件
打开 maven 窗口, mbg-service 服务 Plugins 目录, 双击 mybatis-generator:generate 即可
2.java 代码运行
package com.lw.mbgservice.client; 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; import java.io.InputStream; import java.util.ArrayList; import java.util.List; /** * @Classname GeneratorClient * @Description 代码生成客户端 * @Date 2019/12/12 9:03 * @Author lw */ public class GeneratorClient { /** * 代码生成: * 1. 将 pom.xml 中, 自定义注释 mbg-comment 依赖放开 * 2.generatorConfig.xml 文中, targetProject 属性加上项目名称, 使用 targetProject="mbg-service/src/main/java" * * @param args */ public static void main(String[] args) { List<String> warnings = new ArrayList<>(); boolean overwrite = true; try{ ClassLoader classloader = Thread.currentThread().getContextClassLoader(); InputStream is = classloader.getResourceAsStream("generatorConfig.xml"); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = cp.parseConfiguration(is); DefaultShellCallback callback = new DefaultShellCallback(overwrite); MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); myBatisGenerator.generate(null); }catch (Exception e){ e.printStackTrace(); } warnings.forEach(warning -> { System.out.println("===" + warning); }); } } View Code
生成代码效果
遇到的问题
1. 中文乱码
在 generatorConfig.xml 中, 添加 <property name="javaFileEncoding" value="UTF-8"/>
2. 数据库字段注释中文乱码, 在数据库连接 url 中添加 characterEncoding=utf-8
数据库字符集设置:
3. 找不到自定义注释类 com.lw.mbgcomment.comment.MyCommentGenerator
需要保证 classpath 一致, 在 pom 文件 < build/> 中引入 mbg-comment 依赖
来源: http://www.bubuko.com/infodetail-3329072.html