Spring MyBatis Generator 是 MyBatis 官方提供的一个强大的工具,它能够基于数据库表结构自动生成 MyBatis 持久层的代码,包括实体类、Mapper 接口和 XML 映射文件。这种自动代码生成的方式能够提高开发效率,减少手写代码的工作量。本篇博客将引导你如何使用 Spring MyBatis Generator 进行代码生成。
首先,需要在项目的 pom.xml
文件中引入 Spring MyBatis Generator 插件的依赖:
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.4.2</version>
</dependency>
在 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>
使用 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>
plugin
提供了一些列插件来扩展其功能供我们使用
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
配置要生成的数据库表
https://github.com/cheney09/spring-practical-combat/tree/main/09/demo
以上是使用 Spring MyBatis Generator 自动生成代码的简要步骤。这种方式可以帮助你更快速地搭建起数据库访问层的基础代码,减少手写代码的工作量,提高开发效率。