背景:

  日常开发中,如果新建表,手动敲写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 + " */");
} }

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>

生成代码配置文件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>
<!-- 引入配置文件 -->
<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>

注意: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);
});
} }

生成代码效果


遇到的问题

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依赖

mybatis自动生成model、dao及对应的mapper.xml文件的更多相关文章

  1. Java工具类_表结构自动生成对应的实体类、Mapper.xml文件、Dao类

    import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWrit ...

  2. MyBatis 使用Generator自动生成Model , Dao, mapper

    最近   我新建了一 个maven 项目,使用的是spring + springmvc + mybatis框架. 听说Mybatis可以自动生成model和mapper以及dao层,我就从网上查了查资 ...

  3. mybatis自定义代码生成器(Generator)——自动生成model&dao代码

    花了两天的时间研究了下mybatis的generator大体了解了其生成原理以及实现过程.感觉generator做的非常不错,给开发者也留足了空间.看完之后在generator的基础上实现了自定义的生 ...

  4. mybatis generator.xml 配置 自动生成model,dao,mapping

    generator.xml文件: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE gener ...

  5. dos下mybatis自动生成代码

    今天来介绍下怎么用mybatis-gennerator插件自动生成mybatis所需要的dao.bean.mapper xml文件,这样我们可以节省一部分精力,把精力放在业务逻辑上. 之前看过很多文章 ...

  6. 使用MybatisGenerator自动生成Model,Mapping和Mapper文件

    Mybatis和Hibernate都是持久层框架,MyBatis出现的比Hibernate晚,这两种框架我都用过,对于二者的优势我的感触不深,个人感觉MyBatis自动生成model,Mapping, ...

  7. myBatis自动生成mapping,dao和model

    myBatis没有自动封装实体类.所以都需要自己编写,但是表数据过多时.编写难度就会增加,错误率也会增加! 所以myBatis提供mybatis-generator-core-1.3.2-bundle ...

  8. 使用mybatis-generator自动生成model、dao、mapping文件

    参考文献:http://www.cnblogs.com/smileberry/p/4145872.html 一.所需库 1.mybatis-generator库 2.连接DB的驱动(此以mysql为例 ...

  9. spring和mybatis集成,自动生成model、mapper,增加mybatis分页功能

    软件简介 Spring是一个流行的控制反转(IoC)和面向切面(AOP)的容器框架,在java webapp开发中使用广泛.http://projects.spring.io/spring-frame ...

随机推荐

  1. Spring Boot Web 自定义返回值(通用)

    在项目下新建common.entity包,包中包含两个文件Result数据类,ResultCode接口文件 Result.class @Data @NoArgsConstructor public c ...

  2. MSSQLSERVER 服务运行内存设置较小导致启动服务失败

    问题产生原因: 手动设置MSSQLSERVER 运行内存,设置值未达到MSSQLSERVER 服务运行内存最低值(max server memory 所允许的最小内存量是 128 MB.),导致MSS ...

  3. C# 历遍对象属性

    今天有个网友问如何历遍对象的所有公共属性,并且生成XML.采用序列化方式的话比较简单,我写个手工解析的例子,这样能让初学者更加理解也比较灵活,记录一下吧或许会有人用到. 对象模型: public cl ...

  4. 【题解】Luogu P5342 [TJOI2019]甲苯先生的线段树

    原题传送门 挺有趣的一道题 \(c=1\),暴力求出点权和n即可 \(c=2\),先像\(c=1\)一样暴力求出点权和n,考虑有多少路径点权和也为n 考虑设x为路径的转折点,\(L\)为\(x\)向左 ...

  5. 「UR#5」怎样跑得更快

    「UR#5」怎样跑得更快 膜这个您就会了 下面是复读机mangoyang 我们要求 \[ \sum_{j=1}^n \gcd(i,j)^{c-d} j^d x_j=\frac{b_i}{i^d} \] ...

  6. 阿里巴巴 Java 开发手册(四): OOP 规约

    . [强制]避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成 本,直接用类名来访问即可. 2. [强制]所有的覆写方法,必须加@Override 注解. 说明:getObje ...

  7. 解除Ubuntu系统的root登录图形界面限制

    Ubuntu18.04.1开发团队为了Ubuntu18.04.1系统的安全,默认root不能登录图形界面,普通用户需要使用root权限时,只能通过sudo [命令] [参数] 临时使用root权限,或 ...

  8. springCloud学习笔记2(服务发现)

    本篇代码存放于:https://github.com/FleyX/demo-project/tree/master/springcloud/spring-cloud%E6%9C%8D%E5%8A%A1 ...

  9. shell EOF 用户自定义终止符

    #!/bin/bash ftp -n << EOF user guest 123456 binary cd /home/ prompt mget * close bye EOF 使用Tab ...

  10. HDFS之安全模式

    1.namenode启动的时候,首先将映像文件[fsimage]载入内存,并执行编辑日志[edits]中的各项操作. 2.一旦在内存中成功建立文件系统元数据的映射,则创建一个新的fsimage文件[这 ...