文章目录
- 1. 依赖
- 2. 配置文件
- 3. 生成代码
- 4. 详细介绍 generatorConfig.xml
- 5. 代码详细
- 总结
Spring MyBatis Generator 是 MyBatis 官方提供的一个强大的工具,它能够基于数据库表结构自动生成 MyBatis 持久层的代码,包括实体类、Mapper 接口和 XML 映射文件。这种自动代码生成的方式能够提高开发效率,减少手写代码的工作量。本篇博客将引导你如何使用 Spring MyBatis Generator 进行代码生成。
1. 依赖
首先,需要在项目的 pom.xml
文件中引入 Spring MyBatis Generator 插件的依赖:
<dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><version>1.4.2</version></dependency>
2. 配置文件
在 src/main/resources
目录下创建 generatorConfig.xml
文件,配置代码生成的参数,例如:
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration><context id="DemoBatisGenerator" targetRuntime="MyBatis3"><plugin type="org.mybatis.generator.plugins.ToStringPlugin" /><commentGenerator><property name="suppressDate" value="false" /><property name="suppressAllComments" value="true" /><property name="author" value="false" /></commentGenerator><!-- 数据库连接配置 --><jdbcConnection driverClass="org.h2.Driver"connectionURL="jdbc:h2:mem:db1"userId="sa"password=""></jdbcConnection><!-- Java 模型生成器 --><javaModelGenerator targetPackage="com.cheney.demo.model" targetProject="src/main/java"><property name="enableSubPackages" value="true" /><property name="trimStrings" value="true" /></javaModelGenerator><!-- SQL Map 生成器 --><sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"><property name="enableSubPackages" value="true" /></sqlMapGenerator><!-- Mapper 接口生成器 --><javaClientGenerator targetPackage="com.cheney.demo.dao" targetProject="src/main/java" type="XMLMAPPER"><property name="enableSubPackages" value="true" /></javaClientGenerator><!-- 表配置 --><table tableName="t_user" domainObjectName="User" enableCountByExample="false"enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false"selectByExampleQueryId="false"></table></context></generatorConfiguration>
3. 生成代码
使用 Java 编程方式生成代码
@GetMapping("generator")public void generator() throws Exception {List<String> warnings = new ArrayList<>();boolean overwrite = true;ConfigurationParser cp = new ConfigurationParser(warnings);Configuration config = cp.parseConfiguration(this.getClass().getResourceAsStream("/generatorConfig.xml"));DefaultShellCallback callback = new DefaultShellCallback(overwrite);MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);myBatisGenerator.generate(null);}
1)服务启动
2)调用 generator
运行
3)MyBatis Generator 将会根据配置文件自动生成实体类、Mapper 和 XML 映射文件并放置在指定的目录中
User.java
package com.cheney.demo.model;public class User {private Integer id;private String name;private Integer age;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name == null ? null : name.trim();}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {StringBuilder sb = new StringBuilder();sb.append(getClass().getSimpleName());sb.append(" [");sb.append("Hash = ").append(hashCode());sb.append(", id=").append(id);sb.append(", name=").append(name);sb.append(", age=").append(age);sb.append("]");return sb.toString();}
}
UserMapper.java
package com.cheney.demo.dao;import com.cheney.demo.model.User;public interface UserMapper {int deleteByPrimaryKey(Integer id);int insert(User row);int insertSelective(User row);User selectByPrimaryKey(Integer id);int updateByPrimaryKeySelective(User row);int updateByPrimaryKey(User row);
}
UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cheney.demo.dao.UserMapper"><resultMap id="BaseResultMap" type="com.cheney.demo.model.User"><id column="ID" jdbcType="INTEGER" property="id" /><result column="NAME" jdbcType="VARCHAR" property="name" /><result column="AGE" jdbcType="INTEGER" property="age" /></resultMap><sql id="Base_Column_List">ID, NAME, AGE</sql><select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">select <include refid="Base_Column_List" />from T_USERwhere ID = #{id,jdbcType=INTEGER}</select><delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">delete from T_USERwhere ID = #{id,jdbcType=INTEGER}</delete><insert id="insert" parameterType="com.cheney.demo.model.User">insert into T_USER (ID, NAME, AGE)values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER})</insert><insert id="insertSelective" parameterType="com.cheney.demo.model.User">insert into T_USER<trim prefix="(" suffix=")" suffixOverrides=","><if test="id != null">ID,</if><if test="name != null">NAME,</if><if test="age != null">AGE,</if></trim><trim prefix="values (" suffix=")" suffixOverrides=","><if test="id != null">#{id,jdbcType=INTEGER},</if><if test="name != null">#{name,jdbcType=VARCHAR},</if><if test="age != null">#{age,jdbcType=INTEGER},</if></trim></insert><update id="updateByPrimaryKeySelective" parameterType="com.cheney.demo.model.User">update T_USER<set><if test="name != null">NAME = #{name,jdbcType=VARCHAR},</if><if test="age != null">AGE = #{age,jdbcType=INTEGER},</if></set>where ID = #{id,jdbcType=INTEGER}</update><update id="updateByPrimaryKey" parameterType="com.cheney.demo.model.User">update T_USERset NAME = #{name,jdbcType=VARCHAR},AGE = #{age,jdbcType=INTEGER}where ID = #{id,jdbcType=INTEGER}</update>
</mapper>
4. 详细介绍 generatorConfig.xml
-
plugin
提供了一些列插件来扩展其功能供我们使用
- CacheNamespacePlugin:为生成的 Mapper 接口(Kotlin 或 Java)添加 @CacheNamespace 注解。
- CachePlugin:为生成的 SQL 映射文件添加 元素。
- CaseInsensitiveLikePlugin:为 Example 类添加方法,以支持大小写不敏感的 LIKE 搜索。
- EqualsHashCodePlugin:为 MBG 生成的 Java 模型对象添加 equals 和 hashCode 方法。
- FluentBuilderMethodsPlugin:为生成的模型类添加流畅的构建器方法。
- IgnoreViewsPlugin:在代码生成过程中过滤掉“VIEW”类型的表。
- MapperAnnotationPlugin:为生成的 Mapper 接口添加 @Mapper 注解。
- MapperConfigPlugin:生成一个包含对 MBG 生成的 XML 映射文件的引用的 MapperConfig.xml 文件。
- RenameExampleClassPlugin:通过重命名 MBG 生成的 Example 类来演示 initialized 方法的用法。
- RowBoundsPlugin:为 selectByExample 方法添加接受 RowBounds 参数的新版本。
- SerializablePlugin:为 MBG 生成的 Java 模型类添加 java.io.Serializable 标记接口。
- ToStringPlugin:为生成的模型类添加 toString() 方法
-
commentGenerator
用于生成MyBatis Generator(MBG)生成的各种元素的注释,包括Java字段、Java方法、XML元素等
suppressAllComments
:用于指定MBG是否在生成的代码中包含任何注释。你可以将其设置为true
来禁用所有注释,或者保持默认值false
来包含所有生成元素的注释suppressDate
:用于指定MBG是否在生成的注释中包含生成时间戳。你可以将其设置为true
来禁用时间戳,或者保持默认值false
来包含生成时间戳addRemarkComments
:用于指定MBG是否在生成的注释中包含数据库表和列的备注信息。你可以将其设置为true
来包含表和列的备注信息,或者保持默认值false
来不包含表和列的备注信息dateFormat
:用于指定生成的注释中的日期格式。你可以自定义日期格式,也可以使用默认的java.util.Date
格式useLegacyGeneratedAnnotation
:用于指定是否使用来自已弃用的“javax”命名空间的注解。在JDK 9+中,建议使用“jakarta”命名空间。你可以将其设置为true
或false
-
jdbcConnection
配置数据库连接
-
driverClass
属性指定了JDBC驱动程序的完全限定类名 -
connectionURL
属性指定了连接数据库的JDBC连接URL -
userId
属性指定了连接数据库的用户名 -
password
属性指定了连接数据库的密码
-
-
javaModelGenerator
配置 Java 模型生成器
targetPackage
:指定生成的类所在的包targetProject
:指定生成的对象的目标项目
-
sqlMapGenerator
配置 SQL Map 生成器
enableSubPackages
,它用于控制是否为对象生成不同的Java包,基于表的目录和模式
-
javaClientGenerator
配置 Java 客户端生成器
type="XMLMAPPER"
:指定生成的 Java 接口和实现类将引用 MyBatis 的 XML 配置targetPackage="test.dao"
:指定生成的接口和实现类所在的包targetProject="\MBGTestProject\src"
:指定生成的接口和实现类将保存在的项目目录
-
table
配置要生成的数据库表
5. 代码详细
https://github.com/cheney09/spring-practical-combat/tree/main/09/demo
总结
以上是使用 Spring MyBatis Generator 自动生成代码的简要步骤。这种方式可以帮助你更快速地搭建起数据库访问层的基础代码,减少手写代码的工作量,提高开发效率。