写点什么

SpringCloud 从入门到精通 03--- 自动生成数据模型

用户头像
Felix
关注
发布于: 2021 年 01 月 08 日

本节就不针对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文件

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文件,分别为CommentGeneratorGenerator,在resources中创建一个dao,结果如下


接下来编写generator 的配置文件.在resources中创建generator.properties的配置文件,用来配置数据库连接的信息

jdbc.driverClass=com.mysql.cj.jdbc.Driverjdbc.connectionURL=jdbc:mysql://localhost:3306/cloud?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=falsejdbc.userId=rootjdbc.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即可生成对应的数据模型,结果如下图所示

本节配置虽然看起来稍微麻烦了一点,但是当我们的数据表逐渐增多,或者修改了数据库需要重新生成mapperxml的时候,它能为我们减少很多的工作.


发布于: 2021 年 01 月 08 日阅读数: 35
用户头像

Felix

关注

还未添加个人签名 2020.12.24 加入

还未添加个人简介

评论

发布
暂无评论
SpringCloud 从入门到精通 03---自动生成数据模型