文章目录
- 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;
}
@Override
public 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_USER
where ID = #{id,jdbcType=INTEGER}
</select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
delete from T_USER
where 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_USER
set 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 自动生成代码的简要步骤。这种方式可以帮助你更快速地搭建起数据库访问层的基础代码,减少手写代码的工作量,提高开发效率。