SpringCloud 从入门到精通 03--- 自动生成数据模型
本节就不针对
mybatis-generator
进行详细的配置解释了,如果需要查看mybatis-generator
的教程,请大家自行搜索.
首先,创建一个简单的数据库和单独的一个c_payent
表,sql
语句如下
DROP TABLE IF EXISTS c_payment;
CREATE TABLE c_payment (
id bigint(20) NOT NULL AUTO_INCREMENT,
serial_no varchar(100) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='支付表';
执行完sql
语句之后,开始创建项目用来针对数据库做模型映射
按照第二节的方法,创建一个新的模块cloud-mbg
,这个模块用来自动生成数据模型和对应的xml
文件
![](https://static001.geekbang.org/infoq/17/17d5402e27bb793e5d2e7b0b88601da5.png)
mbg
模块中,pom.xml
文件配置如下
<?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">
<parent>
<artifactId>cloudservice</artifactId>
<groupId>com.felix</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-mbg</artifactId>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
</project>
这里我们引入mybatis
mybatis-generator
mysql-connector
三个包
然后,在项目中创建三个包,分别为com.felix.mbg.model
com.felix.mbg.mapper
,在mbg
包下创建两个java
文件,分别为CommentGenerator
和 Generator
,在resources
中创建一个dao
,结果如下
![](https://static001.geekbang.org/infoq/db/db19d4da8a51344f45e541ecca476dc4.png)
接下来编写generator
的配置文件.在resources
中创建generator.properties
的配置文件,用来配置数据库连接的信息
jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.connectionURL=jdbc:mysql://localhost:3306/cloud?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false
jdbc.userId=root
jdbc.password=b5c0f98553507347461ae6ffe4f907d9
然后在resources
中创建generatorConfig.xml
的配置文件,用来配置自动生成的mapper
model
dao
的路径,配置文件如下
<?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"/>
<context id="MySqlContext" targetRuntime="MyBatis3" defaultModelType="flat">
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<property name="javaFileEncoding" value="UTF-8"/>
<!-- 为模型生成序列化方法-->
<plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
<!-- 为生成的Java模型创建一个toString方法 -->
<plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>
<!--生成mapper.xml时覆盖原文件-->
<plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin" />
<commentGenerator type="com.felix.mbg.CommentGenerator">
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true"/>
<property name="suppressDate" value="true"/>
<property name="addRemarkComments" value="true"/>
</commentGenerator>
<jdbcConnection driverClass="${jdbc.driverClass}"
connectionURL="${jdbc.connectionURL}"
userId="${jdbc.userId}"
password="${jdbc.password}">
<!--解决mysql驱动升级到8.0后不生成指定数据库代码的问题-->
<property name="nullCatalogMeansCurrent" value="true" />
</jdbcConnection>
<javaModelGenerator targetPackage="com.felix.mbg.model" targetProject="cloud-mbg/src/main/java"/>
<sqlMapGenerator targetPackage="dao" targetProject="cloud-mbg/src/main/resources"/>
<javaClientGenerator type="XMLMAPPER" targetPackage="com.felix.mbg.mapper"
targetProject="cloud-mbg/src/main/java"/>
<!--生成全部表tableName设为%-->
<table tableName="%">
<generatedKey column="id" sqlStatement="MySql" identity="true"/>
</table>
</context>
</generatorConfiguration>
此 xml
文件中,我们把数据库中的表结构对应的数据模型映射到model
中,mapper
映射到mapper
包中,生成的xml
文件映射到dao
中
然后,在CommentGenerator
文件中,根据自己的需求创建自定义的注释逻辑,这里我的代码如下
package com.felix.mbg;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.CompilationUnit;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.internal.DefaultCommentGenerator;
import org.mybatis.generator.internal.util.StringUtility;
import java.util.Properties;
/**
* 自定义注释生成器
* Created by macro on 2018/4/26.
*/
public class CommentGenerator extends DefaultCommentGenerator {
private boolean addRemarkComments = false;
private static final String EXAMPLE_SUFFIX="Example";
// private static final String API_MODEL_PROPERTY_FULL_CLASS_NAME="io.swagger.annotations.ApiModelProperty";
/**
* 设置用户配置的参数
*/
@Override
public void addConfigurationProperties(Properties properties) {
super.addConfigurationProperties(properties);
this.addRemarkComments = StringUtility.isTrue(properties.getProperty("addRemarkComments"));
}
/**
* 给字段添加注释
*/
@Override
public void addFieldComment(Field field, IntrospectedTable introspectedTable,
IntrospectedColumn introspectedColumn) {
String remarks = introspectedColumn.getRemarks();
//根据参数和备注信息判断是否添加备注信息
if(addRemarkComments&&StringUtility.stringHasValue(remarks)){
// addFieldJavaDoc(field, remarks);
//数据库中特殊字符需要转义
if(remarks.contains("\"")){
remarks = remarks.replace("\"","'");
}
//给model的字段添加swagger注解
// field.addJavaDocLine("@ApiModelProperty(value = \""+remarks+"\")");
}
}
/**
* 给model的字段添加注释
*/
private void addFieldJavaDoc(Field field, String remarks) {
//文档注释开始
field.addJavaDocLine("/**");
//获取数据库字段的备注信息
String[] remarkLines = remarks.split(System.getProperty("line.separator"));
for(String remarkLine:remarkLines){
field.addJavaDocLine(" * "+remarkLine);
}
addJavadocTag(field, false);
field.addJavaDocLine(" */");
}
@Override
public void addJavaFileComment(CompilationUnit compilationUnit) {
super.addJavaFileComment(compilationUnit);
//只在model中添加swagger注解类的导入
if(!compilationUnit.isJavaInterface()&&!compilationUnit.getType().getFullyQualifiedName().contains(EXAMPLE_SUFFIX)){
// compilationUnit.addImportedType(new FullyQualifiedJavaType(API_MODEL_PROPERTY_FULL_CLASS_NAME));
}
}
}
这里大家可以直接拷贝到自己的项目中,根据自己的需求进行修改即可.
然后,在Generator
中,我们进行数据的生成
package com.felix.mbg;
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;
public class Generator {
public static void main(String[] args) throws Exception{
//MBG 执行过程中的警告信息
List<String> warnings = new ArrayList<String>();
//当生成的代码重复时,覆盖原代码
boolean overwrite = true;
//读取我们的 MBG 配置文件
InputStream is = Generator.class.getResourceAsStream("/generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(is);
is.close();
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
//创建 MBG
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
//执行生成代码
myBatisGenerator.generate(null);
//输出警告信息
for (String warning : warnings) {
System.out.println(warning);
}
}
}
这节我们不对mybatis-generator
多做解释,大家也无需在数据模型上面花太多的时间,毕竟我们的主要目的是SpringCloud
上面的配置文件、代码、数据库准备好以后,直接运行Generator
即可生成对应的数据模型,结果如下图所示
![](https://static001.geekbang.org/infoq/84/84077774b331cd0507a25516de5ed5d3.png)
本节配置虽然看起来稍微麻烦了一点,但是当我们的数据表逐渐增多,或者修改了数据库需要重新生成mapper
和xml
的时候,它能为我们减少很多的工作.
版权声明: 本文为 InfoQ 作者【Felix】的原创文章。
原文链接:【http://xie.infoq.cn/article/c0e6dc804358c7d413091744f】。文章转载请联系作者。
![用户头像](http://static001.geekbang.org/account/avatar/00/24/67/1a/4a2bb165.jpg?x-oss-process=image/resize,w_200,h_200)
Felix
还未添加个人签名 2020.12.24 加入
还未添加个人简介
评论