SpringBoot大大简化了Web开发流程。可以这么说,做Web后来开发大部分时间就是在做配置文件修改。Web开发中,终端的运算能力越来越强,大部分场景就是数据库的操作,只有少部分逻辑会放在Web端处理。而这些增删查改基本属于标准的格式,因为大家开始琢磨,能不能搞定数据格式就能生成sql语句和相关查询代码。或者是有了数据库,就能自动生成对应的逻辑代码?
于是就有人发明了MyBatis-Plus和MyBatis-Generate。针对企业级开发,后者基本是必备。因为后端的强大,导致架构师和编码人员在分工上有区别,架构师负责指定目录结构,用到的技术栈,并设计好数据库,命名规范,数据字典等。然后通过mybatis-generate就能自动生成想要的代码了。
下面是我这个Demo的目录结构,因为这里只延时MyBatis相关木块的使用,其他的地方都没有加。
别看上面列出了不少的代码,实际上再使用MyBatis-Gen的时候只需要编辑几个文件就ok,其他文件都是运行后生成的。
既然是自动生成,自然离不开三要素:
- 环境
- 配置文件
- 执行程序
为了方便区分,我把项目以外的所有依赖库都去掉了,除了spring-boot初始依赖,我只加入了mybatis-gen和mysql链接依赖(根目录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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>org.lange</groupId>
<artifactId>study</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>study</name>
<description>study</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<!-- Spring 启动库,整合了很多Spring相关的依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MyBatis 生成器 -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.3</version>
</dependency>
<!--Mysql数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
环境有了,接下来是配置。因为我们只需要生成sql相关代码,因此我们暂时不需要配置application.yml,只需要编辑MyBatis-generate相关的配置。我们在resource目录下创建一个文件,文件名随便,一般叫做generatorConfig.xml,我这里叫作mbg_config.xml。属性文件叫做generator.properties。如果你想把配置属性写死在配置文件中,generator.properties可以不用。
generator.properties
jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.connectionURL=jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false
jdbc.userId=mall
jdbc.password=123456
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="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"/>
<!--可以自定义生成model的代码注释,不配置没关系,配置就要实现对应类-->
<commentGenerator type="org.lange.study.mbg.CommentGenerator">
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true"/>
<property name="suppressDate" value="true"/>
<property name="addRemarkComments" value="true"/>
</commentGenerator>
<!--配置数据库连接,这里的$就是从属性中取值,对应generator.properties-->
<jdbcConnection driverClass="${jdbc.driverClass}"
connectionURL="${jdbc.connectionURL}"
userId="${jdbc.userId}"
password="${jdbc.password}">
<!--解决mysql驱动升级到8.0后不生成指定数据库代码的问题-->
<property name="nullCatalogMeansCurrent" value="true" />
</jdbcConnection>
<!-- 下面就是业务相关配置啦 -->
<!--指定生成model的路径-->
<javaModelGenerator targetPackage="org.lange.study.mbg.model" targetProject="src\main\java"/>
<!--指定生成mapper.xml的路径-->
<sqlMapGenerator targetPackage="org.lange.study.mbg.mapper" targetProject="src\main\resources"/>
<!--指定生成mapper接口的的路径-->
<javaClientGenerator type="XMLMAPPER" targetPackage="org.lange.study.mbg.mapper"
targetProject="src\main\java"/>
<!--生成全部表tableName设为%-->
<table tableName="pms_brand">
<generatedKey column="id" sqlStatement="MySql" identity="true"/>
</table>
</context>
</generatorConfiguration>
配置文件写好了,接下来就是写执行配置文件的程序来生成代码了。我这里为了掩饰方便直接在mbg包下创建了Generator类,用来读取配置并生成。
Generator.java
package org.lange.study.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("/mbg_config.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);
}
}
}
然后就是执行main方法,就可以自动生成了;
我们可以看到他自动生成了。不过我怕这里为了演示方便,只在配置中配置了一张表,大家可以根据自己需要把整个数据库都用生成的方式来做,这样就只需要关心业务代码就可以了。