前言

如何使用已经有的轮子,快速创建Springboot 子项目,并开始微服务项目业务方面的开发,加速迭代效率。

这篇文章主要聚焦在快速生成java 实体类, Mapper接口和XML Mapper映射文件。

根据以下配置可以通过连接数据库,通过配置好的数据库表和字段配置,在各种IDE(Eclipse, STS, VS Code, IDEA)中运行生成相应文件。

这里用的相对广泛的工具是: mybatis-generator。 并使用MyBatis提供的一款代码生成插件mybatis-generator-maven-plugin,快速生成 MyBatis 所需的基础代码,包括实体类、Mapper 接口以及 XML 映射文件。它能够根据数据库表结构自动生成代码,极大地提高开发效率。

使用mybatis-generator的好处

  1. 快速开发:
    自动生成 Mapper 接口、实体类(POJO)和 XML 映射文件,减少手动编码时间,提高开发效率。

  2. 减少错误:
    自动生成的代码遵循标准的 MyBatis 格式,避免了手写 SQL 和映射配置可能出现的语法错误。

  3. 一致性:
    确保代码结构和命名一致,便于团队协作。

  4. 便于维护:
    如果数据库表结构发生变化,只需重新生成代码即可,无需手动修改每个文件。

  5. 支持复杂配置:
    插件支持自定义生成规则,如表前缀过滤、自定义包名、支持 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();

关键点总结

  1. 数据库要求:需要支持自动生成主键(如 MySQL 的 AUTO_INCREMENT 或 PostgreSQL 的序列)。
  2. JDBC 支持:驱动程序必须支持 Statement.getGeneratedKeys 方法。
  3. MyBatis 配置:正确设置了 useGeneratedKeys=“true” 和 keyProperty。

工作原理

  1. 发送 SQL 到数据库:
    通过 MyBatis 的 INSERT 操作,向数据库插入一条记录。
  2. 数据库生成主键:
    数据库根据表定义自动生成主键值,例如 AUTO_INCREMENT。
  3. 获取生成的主键:
    MyBatis 使用 JDBC 的 Statement.getGeneratedKeys 方法获取数据库生成的主键。
  4. 回填到实体对象:
    根据 keyProperty=“id” 配置,MyBatis 将生成的主键值映射回 Java 实体对象的对应字段。

其中:

  1. useGeneratedKeys=“true” 的作用

    MyBatis 的自动生成键功能:
     当 useGeneratedKeys="true" 时,MyBatis 会在执行插入操作后,尝试通过数据库的自动生成主键机制(如 MySQL 的自增主键)获取生成的键值。
     MyBatis 使用 JDBC 提供的 getGeneratedKeys 方法来获取生成的主键。
    
    数据库支持自动生成主键:
     数据库的表必须启用了主键生成功能(如 MySQL 的 AUTO_INCREMENT)。
     当执行 INSERT 操作时,数据库会自动生成主键值,并返回给客户端。
    
  2. keyProperty=“id” 的作用

    指定实体类中的主键字段:
     keyProperty 的值 id 指定了主键字段在实体类 com.abc.model.Project 中的名称。
     在插入操作执行完成后,MyBatis 会将生成的主键值回填到实体类对应的字段中。
    
    映射过程:
     如果数据库生成了主键值,例如 123,MyBatis 会通过 keyProperty 找到实体类的 id 属性,并将该值设置到实体对象的 id 字段中。
    
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐