一、写在开头

最近一直在更新《Java成长计划》这个专栏,主要是Java全流程学习的一个记录,目前已经更新到Java并发多线程部分,后续会继续更新;而今天准备开设一个全新的专栏 《EfficientFarm》

EfficientFarm:高效农场,期许软件开发工作能够像很多国外的高效农场一般机械化,自动化。拿来即用,提高工作效率,是这个专栏的宗旨!


二、Mybatis 逆向工程

我们在开发传统的Maven项目或者SpringBoot项目过程中,最终处理的就是对于数据的读与存,这时就免不了写对象关系映射代码,实体类、mapper、mapper.xml等代码,若存在大量的增删改查功能的话,我们开发时就会不断重复相同的操作,大大降低了工作效率。

为此便但成了Mybatis “逆向工程” ,所谓逆向工程,就是从数据库表结构出发,反向去生成对应的实体和映射代码,今天我们在这里提供2种方案进行实现。


三、方案一

3.1 环境准备

1)springboot 项目(JDK1.8)
2)apache-maven-3.6.1
3)MySQL 8.0.30

3.2 数据库表

逆向工程的第一步,需要先有数据库表结构!我们在这里先创建一个表,作为示例使用,sql脚本如下:

--若已存在,先删除
drop table user
-- 创建数据库用户表
create table user (
id int NOT NULL AUTO_INCREMENT COMMENT '主键',
name varchar(100) DEFAULT NULL COMMENT '员工姓名',
phone_num varchar(20) DEFAULT NULL COMMENT '联系方式',
address varchar(200) DEFAULT NULL COMMENT '住址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

3.3 添加依赖

逆向工程的实现,需要先引入mybatis相关依赖,如果项目中已经引入过,可自动忽略这一步。

 <dependencies>
<!-- mybatis-generator -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

3.4 数据库连接配置

依赖与数据库表创建好之后,我们就正式进入了springboot项目中进行逆向工程开发啦,首先在resources目录下创建一个数据库连接的配置文件:generator.properties

jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.connectionURL=jdbc:mysql://localhost:3306/vhr?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
jdbc.userId=root
jdbc.password=123456

3.5 逆向工程生成规则配置

数据库配置完成后,我们紧接着来设置一个生成规则,包括编码,生成文件路径、是否设置自定义注释等等,这个配置可以从网上搜,有很多generatorConfiguration的配置。

<?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" />
<!--可以自定义生成model的代码注释-->
<commentGenerator type="org.javaboy.vhr.utils.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>
<!--指定生成model的路径-->
<javaModelGenerator targetPackage="org.javaboy.vhr.pojo" targetProject="vhr-web\src\main\java"/>
<!--指定生成mapper.xml的路径-->
<sqlMapGenerator targetPackage="mybatis.mapper" targetProject="vhr-web\src\main\resources"/>
<!--指定生成mapper接口的的路径-->
<javaClientGenerator type="XMLMAPPER" targetPackage="org.javaboy.vhr.mapper"
targetProject="vhr-web\src\main\java"/>
<!--单独生成某个表,写具体表名,否则生成全部表tableName设为%-->
<table tableName="user" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" selectByExampleQueryId="false">
<property name="useActualColumnNames" value="false"/>
<property name="constructorBased" value="false"/>
<generatedKey column="id" sqlStatement="JDBC" identity="true"/>
</table> </context>
</generatorConfiguration>

3.6 自定义实体类注释配置

由于在上一步我们配置了注释生成器,因此,我们要在相应的路径下,创建一个类,来自定义注释的生成规则。路径:org.javaboy.vhr.utils.CommentGenerator

<commentGenerator type="org.javaboy.vhr.utils.CommentGenerator">
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true"/>
<property name="suppressDate" value="true"/>
<property name="addRemarkComments" value="true"/>
</commentGenerator>

CommentGenerator代码

**
* @author 86138
* @date 2024-05-01 13:27:15
* @description 添加自定义注释
*/
public class CommentGenerator extends DefaultCommentGenerator {
private boolean addRemarkComments = false; /**
* 设置用户配置的参数
*/
@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);
}
} /**
* 给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(" */");
}
}

3.7 生成器

以上步骤做完后,我们就要写我们的逆向工程生成器啦,调用org.mybatis.generator.api中的MyBatisGenerator生成器进行实现。注意:当生成的代码重复时,覆盖原代码!

Generator代码

/**
* @author 86138
* @date 2024-05-01 13:35:22
* @description 逆向工程生成器
*/
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);
}
}
}

3.8 结果展示

直接执行上述的Generator类的main方法,就会自动读取数据库中的表,并生成对应的实体类与映射啦,以及简单的增删改查功能代码。

09:07:48.051 [main] DEBUG org.mybatis.generator.logging.LogFactory - Logging initialized using 'org.mybatis.generator.logging.slf4j.Slf4jLoggingLogFactory@1dde4cb2' adapter.
09:07:48.054 [main] DEBUG org.mybatis.generator.internal.db.DatabaseIntrospector - Retrieving column information for table "user"
09:07:48.086 [main] DEBUG org.mybatis.generator.internal.db.DatabaseIntrospector - Found column "id", data type 4, in table "vhr..user"
09:07:48.086 [main] DEBUG org.mybatis.generator.internal.db.DatabaseIntrospector - Found column "name", data type 12, in table "vhr..user"
09:07:48.086 [main] DEBUG org.mybatis.generator.internal.db.DatabaseIntrospector - Found column "phone_num", data type 12, in table "vhr..user"
09:07:48.086 [main] DEBUG org.mybatis.generator.internal.db.DatabaseIntrospector - Found column "address", data type 12, in table "vhr..user"

【生成文件】


四、方案二

基于方案一,我们可以快速的根据数据库中的表进行逆向工程的创建,大量的减少了我们的重复性工作,但是!它的实现还是比较复杂的,generatorConfiguration配置中的内容丰富且复杂,比较难记,而且在原有代码中需要写一定的代码量才能实现。

接下来我们要说的这种方案二,几乎不用写任何代码,只需要点点点就可以实现逆向工程啦,如果你使用idea的话,这种方案尤其方便。

4.1 下载MybatisX插件

在插件管理中下载MybatisX插件

4.2 配置数据源

在idea的database中配置数据源,这里以MySQL为例,需要注意时区的配置。

点击Test Connection 测试成功说明配置完成啦

4.3 配置maven依赖

<!--lombok依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--MyBatis Plus依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>

4.4 配置生成规则

1)打开刚刚配置好的本地数据库,选择你想构建的数据表,右键 -> MybatisX-Generator。

2)选择项目包路径、实体包名、表名;

3) next后继续配置mapper、xml、service的生成路径以及需要的注释功能,hashCode/equals、Lombk注解等等。

4.5 结果展示

在上一步的最后配置完成,点击Finish按钮,查看结果,在对应的路径下成功的生成了我们需要的文件。


五、总结

这两种方案各有优劣:

  • 方案一实现复杂,但可以满足基本的增删改查的实现,并且熟练的掌握generatorConfiguation配置的编辑,能实现更强大的功能;
  • 方案二,实现简单,只需要页面点几下就可以完成完整的结构,但内容需要我们自己去实现。大家可以根据自己的日常开发场景,进行合理选择。

六、结尾彩蛋

如果本篇博客对您有一定的帮助,大家记得留言+点赞+收藏呀。原创不易,转载请联系Build哥!

Mybatis逆向工程的2种方法,一键高效快速生成Pojo、Mapper、XML,摆脱大量重复开发的更多相关文章

  1. mybatis 批量update两种方法对比

    <!-- 这次用resultmap接收输出结果 --> <select id="findByName" parameterType="string&qu ...

  2. Mybatis在IDEA中使用generator逆向工程生成pojo,mapper

    使用mybatis可以逆向生成pojo和mapper文件有很多种方式,我以前用的是mybtais自带的generator包来生成,连接如下:mybatis自己生成pojo 今天我用了IDEA上使用ma ...

  3. 逆向工程生成的Mapper.xml以及*Example.java详解

    逆向工程生成的接口中的方法详解 在我上一篇的博客中讲解了如何使用Mybayis逆向工程针对单表自动生成mapper.java.mapper.xml.实体类,今天我们先针对mapper.java接口中的 ...

  4. MyBatis从入门到精通:第一章实体类与Mapper.xml文件

    实体类: package tk.mybatis.simple.model; public class Country { public Long getId() { return id; } publ ...

  5. mybatis逆向工程 mbg运行java代码时提示找不到MBG.xml的解决方法

    这里要写全路径才能找到文件

  6. 掌握这10种方法帮你快速在Linux上分析二进制文件

    我们每天都使用二进制文件,但对二进制文件知之甚少.二进制是指您每天运行的可执行文件,从命令行工具到成熟的应用程序.Linux提供了丰富的工具集,可轻松进行二进制分析!无论您的工作角色是什么,如果您在L ...

  7. Java MyBatis逆向工程,自动生成pojo,mapper

    生成xml文件,文件名generator.xml <?xml version="1.0" encoding="UTF-8"?><!DOCTYP ...

  8. 使用mybatis提供的各种标签方法实现动态拼接Sql。使用sql片段提取重复的标签内容

    Sql中可将重复的sql提取出来,使用时用include引用即可,最终达到sql重用的目的,如下: <select id="findUserByNameAndSex" par ...

  9. IDEA 使用generator逆向工程生成pojo,mapper

    1.新建立一个MAVEN项目 2.在pom.xml增加配置 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns: ...

  10. 逆向工程,生成pojo、xml、mapper

    package com.how2java; import java.io.File; import java.io.InputStream; import java.util.ArrayList; i ...

随机推荐

  1. 【Java】快速排序

    代码: 1 public static void quickSort(int[] arr) { 2 if (arr == null || arr.length < 2) { 3 return; ...

  2. 安卓day_1

    今天买了安卓学习的相关书籍,在网站上找到了安卓学习的视频,了解了安卓学习的方向.

  3. Scala 不可变列表List

    1 package chapter07 2 3 object Test04_List { 4 def main(args: Array[String]): Unit = { 5 // 1. 创建一个L ...

  4. python 国家标准行业编码标准格式化处理

    代码在上次的基础上做了一点优化,之前对项目要的最终结果理解有些偏差: 原始数据的那一列行业编码是存在三位数和四位数的,我上次理解的三位数就是分割成两位数进行查找,其实三位数的编码是由于第一位的0没有显 ...

  5. Linux服务器程序规范化

    Linux日志体系 rsyslogd守护进程既能接收用户进程输出的日志,又能接收内核日志.用户进程是通过调用syslog函数生成系统日志的.该函数将日志输出到一个UNIX本地域socket类型(AF_ ...

  6. .net跨平台运行实践

    一个偶然的机会,一个朋友想做一个程序,同时支持windows和linux,本来想用go来写,奈何不太熟练,突然想到.net不是也支持跨平台了吗,还没有操作过,刚好可以试验一下. 最新的.net 6已经 ...

  7. 从0开始学杂项 第四期:隐写分析(3) GIF 图片隐写

    Misc 学习(四) - 隐写分析:GIF 图片隐写 在上一期,我主要讲了讲自己对于隐写分析中的 PNG 图片隐写的一些浅薄理解,这一期我们继续对隐写分析的学习,学习的是图片隐写中的 GIF 图片隐写 ...

  8. 7 JavaScript循环语句

    7 循环语句 在js中有三种循环语句. 首先是while循环. 它的逻辑和咱们python中的while几乎一模一样, 就是符号上有些许的区别. // 语法 while(条件){ 循环体 -> ...

  9. #组合计数,容斥定理#U136346 数星星

    题目 天上的繁星一闪一闪的,甚是好看.你和你的小伙伴们一起坐在草地上,欣赏这美丽的夜景. 我们假定天上有\(n\)颗星星,它们排成一排,从左往右以此编号为1到\(n\),但是天上的星星实在太多了,你和 ...

  10. 使用 rollup 打包可按需加载的 NPM 包

    安装 rollup npm install rollup --save-dev 配置文件 rollup.config.js export default { input: 'src/index.js' ...