[项目总结] Springboot 构建微服务 之 Mybatis 根据数据库表快速生成代码
如何使用已经有的轮子,快速创建Springboot 子项目,并开始微服务的开始项目业务方面的开发,加速迭代效率。这篇文章主要聚焦在快速生成java 实体类, Mapper接口和XML Mapper映射文件。根据以下配置可以通过连接数据库,根据配置好的数据库表和字段配置,在各种IDE(Eclipse, STS, VS Code, IDEA)中运行生成相应文件。
前言
如何使用已经有的轮子,快速创建Springboot 子项目,并开始微服务项目业务方面的开发,加速迭代效率。
这篇文章主要聚焦在快速生成java 实体类, Mapper接口和XML Mapper映射文件。
根据以下配置可以通过连接数据库,通过配置好的数据库表和字段配置,在各种IDE(Eclipse, STS, VS Code, IDEA)中运行生成相应文件。
这里用的相对广泛的工具是: mybatis-generator。 并使用MyBatis提供的一款代码生成插件mybatis-generator-maven-plugin,快速生成 MyBatis 所需的基础代码,包括实体类、Mapper 接口以及 XML 映射文件。它能够根据数据库表结构自动生成代码,极大地提高开发效率。
使用mybatis-generator的好处
-
快速开发:
自动生成 Mapper 接口、实体类(POJO)和 XML 映射文件,减少手动编码时间,提高开发效率。 -
减少错误:
自动生成的代码遵循标准的 MyBatis 格式,避免了手写 SQL 和映射配置可能出现的语法错误。 -
一致性:
确保代码结构和命名一致,便于团队协作。 -
便于维护:
如果数据库表结构发生变化,只需重新生成代码即可,无需手动修改每个文件。 -
支持复杂配置:
插件支持自定义生成规则,如表前缀过滤、自定义包名、支持 Lombok 注解等。
使用mybatis-generator快速生成java代码
1. 配置 generatorConfig.xml
在创建好的springboot项目src/main/resources目录下创建 generator 文件夹和mybatis-generator.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>
<!-- 指定生成一组对象的环境
id:<context>在配置文件中唯一标识
targetRuntime :用于指定生成的代码与 MyBatis 的哪个版本
-->
<context id="MySQLDLPTables" targetRuntime="MyBatis3Simple">
<!--指定是否自动为关键字添加分隔符-->
<property name="autoDelimitKeywords" value="false" />
<!--指定生成的 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" />
<!--指定数据库表和列名的起始和结束分隔符-->
<property name="beginningDelimiter" value="`" />
<property name="endingDelimiter" value="`" />
<commentGenerator>
<!--是否在生成的注释中抑制日期信息-->
<property name="suppressDate" value="true" />
<!--是否抑制所有的注释-->
<property name="suppressAllComments" value="true" />
<!--是否为数据库表的每一列生成注释(从数据库的列备注中提取)-->
<property name="addRemarkComments" value="false" />
</commentGenerator>
<!-- 数据库连接 -->
<jdbcConnection
driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql:{mysql数据库}?characterEncoding=utf8"
userId="{用户名}"
password="{密码}"
></jdbcConnection>
<!--用于强制将数据库中的 DECIMAL 和 NUMERIC 类型映射为 Java 的 BigDecimal 类型-->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- Java 模型生成, 需要指定到对的项目package,例如:com.abc.project.model中 -->
<javaModelGenerator targetPackage="com.abc.project.model"
targetProject="src/main/java">
<property name="constructorBased" value="false" />
<property name="enableSubPackages" value="true" />
<property name="immutable" value="false" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- XML 映射文件生成 -->
<sqlMapGenerator targetPackage="mapper"
targetProject="src/main/resources">
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- Mapper 接口生成, 需要指定到对的项目package,例如:com.abc.project.model中 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.abc.project.mapper"
targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!-- 待生成代码的数据库表,这里可以将方法都生成或者仅生成少量方法,自己在xml中写需要的数据访问方法 -->
<table tableName="o_project" domainObjectName="Project"
enableInsert="false"
enableSelectByPrimaryKey="true"
enableUpdateByPrimaryKey="false"
enableDeleteByPrimaryKey="false"
enableSelectByExample="false"
enableDeleteByExample="false"
enableUpdateByExample="false"
enableCountByExample="false">
</table>
</context>
</generatorConfiguration>
MyBatis GeneratorXML 配置参考文档:https://mybatis.org/generator/configreference/xmlconfig.html
或者可以参考一个很好相关配置介绍的中文博客: https://juejin.cn/post/7376827589907841050
不同的数据库连接可以参考:https://mybatis.org/generator/usage/intro.html
2. 使用配置文件
根据原文,运行generator配置文件可以通过command line, ant, maven, java 和 eclipse几种方式。 这里介绍低代码且最快速启动的两种方式:Eclipse 和 Maven。
a. Eclipse(SpringToolSuite4)中使用
从marketplace查询并安装"MyBatis Generator"。
安装之后,找到mybatis-generator.xml 文件, 右击并运行运行, 之后就可以在配置好的目录位置找到新生成的三个文件。
b. 只用Maven命令运行
在项目的pom文件中引入mybatis-generator-maven-plugin插件, 并将步骤1中的mybatis-generatot.xml路径配置到 位置
<project ...>
... springboot其他配置
<dependencies>
...
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.2</version>
<configuration>
<!-- !!配置文件存放路径, 按需修改 -->
<configurationFile>${basedir}/src/main/resources/generator/mybatis-generator.xml</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
<dependencies>
<!-- mysql connector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
配置完成后, 可以在
命令行中运行命令 mvn mybatis-generator:generate
或者在窗口中找到maven命令,点击运行
Mapper 使用小tips
1. Mapper 接口继承 BaseMapper类,避免为每一个table创建基础的CRUD类, 关注特殊业务实现。
例如
在pom.xml中确认引入一下dependency:
<!-- mybatisPlus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.4.2</version>
</dependency>
在之前生成好的projectMapper.java类中, 在类名后面加入 extends BaseMapper<Project>
// 生成好的mapper接口类
package com.abc.project.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.abc.project.model.Project; //生成好的pojo类
public interface ProjectMapper extends BaseMapper<Project> {
public Project selectProjectByName(@Param("name") String name);
}
在使用ProjectMapper的时候,就可以直接调用BaseMapper类中的selectById, insert等方法。
2. Mapper insert之后拿到自动生成的id
表结构如下, 注意:id 为AUTO_INCREMENT & PRIMARY KEY
CREATE TABLE project (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
description TEXT
);
在上述生成的ProjectMapper.xml中修改insertSelective方法, 添加 useGeneratedKeys="true" keyProperty="id"
<insert id="insertSelective" parameterType="com.abc.model.Project" useGeneratedKeys="true" keyProperty="id">
insert into o_project
(name, description)
values
(
#{name,jdbcType=VARCHAR},
#{description,jdbcType=LONGVARCHAR}
)
</insert>
之后,就可以在service 代码中,调用insertSelective方法后,直接获取到Id。
int insertCount = projectMapper.insertSelective(project);
Long projectId = project.getId();
关键点总结
- 数据库要求:需要支持自动生成主键(如 MySQL 的 AUTO_INCREMENT 或 PostgreSQL 的序列)。
- JDBC 支持:驱动程序必须支持 Statement.getGeneratedKeys 方法。
- MyBatis 配置:正确设置了 useGeneratedKeys=“true” 和 keyProperty。
工作原理
- 发送 SQL 到数据库:
通过 MyBatis 的 INSERT 操作,向数据库插入一条记录。 - 数据库生成主键:
数据库根据表定义自动生成主键值,例如 AUTO_INCREMENT。 - 获取生成的主键:
MyBatis 使用 JDBC 的 Statement.getGeneratedKeys 方法获取数据库生成的主键。 - 回填到实体对象:
根据 keyProperty=“id” 配置,MyBatis 将生成的主键值映射回 Java 实体对象的对应字段。
其中:
-
useGeneratedKeys=“true” 的作用
MyBatis 的自动生成键功能: 当 useGeneratedKeys="true" 时,MyBatis 会在执行插入操作后,尝试通过数据库的自动生成主键机制(如 MySQL 的自增主键)获取生成的键值。 MyBatis 使用 JDBC 提供的 getGeneratedKeys 方法来获取生成的主键。 数据库支持自动生成主键: 数据库的表必须启用了主键生成功能(如 MySQL 的 AUTO_INCREMENT)。 当执行 INSERT 操作时,数据库会自动生成主键值,并返回给客户端。 -
keyProperty=“id” 的作用
指定实体类中的主键字段: keyProperty 的值 id 指定了主键字段在实体类 com.abc.model.Project 中的名称。 在插入操作执行完成后,MyBatis 会将生成的主键值回填到实体类对应的字段中。 映射过程: 如果数据库生成了主键值,例如 123,MyBatis 会通过 keyProperty 找到实体类的 id 属性,并将该值设置到实体对象的 id 字段中。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)