spring boot 整合MyBatis Generator自动生成动态sql代码

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: spring boot 整合MyBatis Generator自动生成动态sql代码

目录

一、背景

二、实践

三、总结



一、背景

    最近使用mybatis时,看到一篇文章使用yml配置来简化MyBatis Generator默认使用的xml配置,就想着使用人家提供的MyBatis Generator去自动生成一些bean,动态mapper文件。

项目整合地址:

https://github.com/xujiankang6/study/tree/main/spring-boot-research

二、实践

1、maven里面添加该插件

(1)configurationFile属性为MyBatis Generator的配置yml文件路径。

            <plugin>
                <groupId>io.github.javthon</groupId>
                <artifactId>mybatis-generator-yml-maven-plugin</artifactId>
                <version>0.0.1</version>
                <configuration>
                    <configurationFile>src/main/resources/generator/generatorConfig.yml</configurationFile>
                </configuration>
            </plugin>

2、generatorConfig.yml配置文件

(1)配置如下

mybatisGenerator:
  datasource:
    type: mysql
    address: localhost:3306
    db: test?serverTimezone=GMT
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: 123456
  targetPackage:
    model: com.example.demo.model
    mapper: com.example.demo.mapper
    javaXmlFilesSamePackage: true
  targetRuntime: MyBatis3DynamicSql
  mapperSuffixName: mapper
  java8: false
  disableExample: true
  plugins:
    comment: true
    lombok: false
    swagger: false
    mapperAnnotation: false
    serializable: false
  tables:
    - user

(2)主要属性说明

image.png

(3)更多配置看该插件git仓库mybatis-generator-yml-maven-plugin/Readme-CN.md at master · javthon/mybatis-generator-yml-maven-plugin · GitHub


(4)目前只支持sqlserver,mysql,oracle。


(5)注意上面db的配置需要在数据库名后加该属性?serverTimezone=GMT,否则会报下面错误:


[ERROR] The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the 'serverTimezone' configuration property) to use a more specifc time zone value if you want to utilize time zone support.


3、通过idea执行该插件

(1)可以多次执行,每次执行覆盖上次生成的代码。

image.png

4、查看结果

(1)自动生成的bean文件如下:

public class User {
    /**
     */
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    private Integer uid;
    /**
     */
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    private String uname;
    /**
     */
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    private String upwd;
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    public Integer getUid() {
        return uid;
    }
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    public void setUid(Integer uid) {
        this.uid = uid;
    }
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    public String getUname() {
        return uname;
    }
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    public void setUname(String uname) {
        this.uname = uname;
    }
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    public String getUpwd() {
        return upwd;
    }
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    public void setUpwd(String upwd) {
        this.upwd = upwd;
    }
}

(2)自动生成的mapper文件如下:

@Mapper
public interface UserMapper {
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    BasicColumn[] selectList = BasicColumn.columnList(uid, uname, upwd);
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    @SelectProvider(type=SqlProviderAdapter.class, method="select")
    long count(SelectStatementProvider selectStatement);
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    @DeleteProvider(type=SqlProviderAdapter.class, method="delete")
    int delete(DeleteStatementProvider deleteStatement);
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    @InsertProvider(type=SqlProviderAdapter.class, method="insert")
    int insert(InsertStatementProvider<User> insertStatement);
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    @InsertProvider(type=SqlProviderAdapter.class, method="insertMultiple")
    int insertMultiple(MultiRowInsertStatementProvider<User> multipleInsertStatement);
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    @SelectProvider(type=SqlProviderAdapter.class, method="select")
    @Results(id="UserResult", value = {
        @Result(column="uid", property="uid", jdbcType=JdbcType.INTEGER, id=true),
        @Result(column="uname", property="uname", jdbcType=JdbcType.VARCHAR),
        @Result(column="upwd", property="upwd", jdbcType=JdbcType.VARCHAR)
    })
    Optional<User> selectOne(SelectStatementProvider selectStatement);
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    @SelectProvider(type=SqlProviderAdapter.class, method="select")
    @Results(id="UserResult", value = {
        @Result(column="uid", property="uid", jdbcType=JdbcType.INTEGER, id=true),
        @Result(column="uname", property="uname", jdbcType=JdbcType.VARCHAR),
        @Result(column="upwd", property="upwd", jdbcType=JdbcType.VARCHAR)
    })
    List<User> selectMany(SelectStatementProvider selectStatement);
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    @UpdateProvider(type=SqlProviderAdapter.class, method="update")
    int update(UpdateStatementProvider updateStatement);
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    default long count(CountDSLCompleter completer) {
        return MyBatis3Utils.countFrom(this::count, user, completer);
    }
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    default int delete(DeleteDSLCompleter completer) {
        return MyBatis3Utils.deleteFrom(this::delete, user, completer);
    }
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    default int deleteByPrimaryKey(Integer uid_) {
        return delete(c -> 
            c.where(uid, isEqualTo(uid_))
        );
    }
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    default int insert(User record) {
        return MyBatis3Utils.insert(this::insert, record, user, c ->
            c.map(uid).toProperty("uid")
            .map(uname).toProperty("uname")
            .map(upwd).toProperty("upwd")
        );
    }
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    default int insertMultiple(Collection<User> records) {
        return MyBatis3Utils.insertMultiple(this::insertMultiple, records, user, c ->
            c.map(uid).toProperty("uid")
            .map(uname).toProperty("uname")
            .map(upwd).toProperty("upwd")
        );
    }
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    default int insertSelective(User record) {
        return MyBatis3Utils.insert(this::insert, record, user, c ->
            c.map(uid).toPropertyWhenPresent("uid", record::getUid)
            .map(uname).toPropertyWhenPresent("uname", record::getUname)
            .map(upwd).toPropertyWhenPresent("upwd", record::getUpwd)
        );
    }
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    default Optional<User> selectOne(SelectDSLCompleter completer) {
        return MyBatis3Utils.selectOne(this::selectOne, selectList, user, completer);
    }
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    default List<User> select(SelectDSLCompleter completer) {
        return MyBatis3Utils.selectList(this::selectMany, selectList, user, completer);
    }
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    default List<User> selectDistinct(SelectDSLCompleter completer) {
        return MyBatis3Utils.selectDistinct(this::selectMany, selectList, user, completer);
    }
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    default Optional<User> selectByPrimaryKey(Integer uid_) {
        return selectOne(c ->
            c.where(uid, isEqualTo(uid_))
        );
    }
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    default int update(UpdateDSLCompleter completer) {
        return MyBatis3Utils.update(this::update, user, completer);
    }
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    static UpdateDSL<UpdateModel> updateAllColumns(User record, UpdateDSL<UpdateModel> dsl) {
        return dsl.set(uid).equalTo(record::getUid)
                .set(uname).equalTo(record::getUname)
                .set(upwd).equalTo(record::getUpwd);
    }
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    static UpdateDSL<UpdateModel> updateSelectiveColumns(User record, UpdateDSL<UpdateModel> dsl) {
        return dsl.set(uid).equalToWhenPresent(record::getUid)
                .set(uname).equalToWhenPresent(record::getUname)
                .set(upwd).equalToWhenPresent(record::getUpwd);
    }
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    default int updateByPrimaryKey(User record) {
        return update(c ->
            c.set(uname).equalTo(record::getUname)
            .set(upwd).equalTo(record::getUpwd)
            .where(uid, isEqualTo(record::getUid))
        );
    }
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    default int updateByPrimaryKeySelective(User record) {
        return update(c ->
            c.set(uname).equalToWhenPresent(record::getUname)
            .set(upwd).equalToWhenPresent(record::getUpwd)
            .where(uid, isEqualTo(record::getUid))
        );
    }

(3)自动生成的mapper支持类如下:

public final class UserDynamicSqlSupport {
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    public static final User user = new User();
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    public static final SqlColumn<Integer> uid = user.uid;
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    public static final SqlColumn<String> uname = user.uname;
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    public static final SqlColumn<String> upwd = user.upwd;
    @Generated("org.mybatis.generator.api.MyBatisGenerator")
    public static final class User extends SqlTable {
        public final SqlColumn<Integer> uid = column("uid", JDBCType.INTEGER);
        public final SqlColumn<String> uname = column("uname", JDBCType.VARCHAR);
        public final SqlColumn<String> upwd = column("upwd", JDBCType.VARCHAR);
        public User() {
            super("user");
        }
    }
}

5、项目整合中用到的mybatis相关maven依赖如下

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot</artifactId>
            <version>2.0.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.mybatis.dynamic-sql/mybatis-dynamic-sql -->
        <dependency>
            <groupId>org.mybatis.dynamic-sql</groupId>
            <artifactId>mybatis-dynamic-sql</artifactId>
            <version>1.3.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.35</version>
        </dependency>

三、总结

       以上就是实现spring boot 整合MyBatis Generator自动生成动态sql代码所有内容,希望能够帮到大家,可以git下载下来,参考一下,觉得不错的话,欢迎微信搜索关注java基础笔记,后面会不断更新相关知识,大家一起进步。

https://github.com/xujiankang6/study/tree/main/spring-boot-research

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
6月前
|
安全 Java 应用服务中间件
Spring Boot + Java 21:内存减少 60%,启动速度提高 30% — 零代码
通过调整三个JVM和Spring Boot配置开关,无需重写代码即可显著优化Java应用性能:内存减少60%,启动速度提升30%。适用于所有在JVM上运行API的生产团队,低成本实现高效能。
734 3
|
5月前
|
人工智能 监控 Java
零代码改造 + 全链路追踪!Spring AI 最新可观测性详细解读
Spring AI Alibaba 通过集成 OpenTelemetry 实现可观测性,支持框架原生和无侵入探针两种方式。原生方案依赖 Micrometer 自动埋点,适用于快速接入;无侵入探针基于 LoongSuite 商业版,无需修改代码即可采集标准 OTLP 数据,解决了原生方案扩展性差、调用链易断链等问题。未来将开源无侵入探针方案,整合至 AgentScope Studio,并进一步增强多 Agent 场景下的观测能力。
2379 72
|
5月前
|
安全 Java 测试技术
《深入理解Spring》单元测试——高质量代码的守护神
Spring测试框架提供全面的单元与集成测试支持,通过`@SpringBootTest`、`@WebMvcTest`等注解实现分层测试,结合Mockito、Testcontainers和Jacoco,保障代码质量,提升开发效率与系统稳定性。
|
12月前
|
SQL Java 数据库连接
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
|
7月前
|
SQL XML Java
通过MyBatis的XML配置实现灵活的动态SQL查询
总结而言,通过MyBatis的XML配置实现灵活的动态SQL查询,可以让开发者以声明式的方式构建SQL语句,既保证了SQL操作的灵活性,又简化了代码的复杂度。这种方式可以显著提高数据库操作的效率和代码的可维护性。
444 18
|
6月前
|
安全 IDE Java
Spring 的@FieldDefaults和@Data:Lombok 注解以实现更简洁的代码
本文介绍了如何在 Spring 应用程序中使用 Project Lombok 的 `@Data` 和 `@FieldDefaults` 注解来减少样板代码,提升代码可读性和可维护性,并探讨了其适用场景与限制。
229 0
Spring 的@FieldDefaults和@Data:Lombok 注解以实现更简洁的代码
|
11月前
|
SQL Java 数据库连接
MyBatis动态SQL字符串空值判断,这个细节99%的程序员都踩过坑!
本文深入探讨了MyBatis动态SQL中字符串参数判空的常见问题。通过具体案例分析,对比了`name != null and name != &#39;&#39;`与`name != null and name != &#39; &#39;`两种写法的差异,指出后者可能引发逻辑混乱。为避免此类问题,建议在后端对参数进行预处理(如trim去空格),简化MyBatis判断逻辑,提升代码健壮性与可维护性。细节决定成败,严谨处理参数判空是写出高质量代码的关键。
1472 0
|
9月前
|
Java 数据库连接 数据库
Spring boot 使用mybatis generator 自动生成代码插件
本文介绍了在Spring Boot项目中使用MyBatis Generator插件自动生成代码的详细步骤。首先创建一个新的Spring Boot项目,接着引入MyBatis Generator插件并配置`pom.xml`文件。然后删除默认的`application.properties`文件,创建`application.yml`进行相关配置,如设置Mapper路径和实体类包名。重点在于配置`generatorConfig.xml`文件,包括数据库驱动、连接信息、生成模型、映射文件及DAO的包名和位置。最后通过IDE配置运行插件生成代码,并在主类添加`@MapperScan`注解完成整合
1463 1
Spring boot 使用mybatis generator 自动生成代码插件
|
8月前
|
安全 Java Nacos
0代码改动实现Spring应用数据库帐密自动轮转
Nacos作为国内被广泛使用的配置中心,已经成为应用侧的基础设施产品,近年来安全问题被更多关注,这是中国国内软件行业逐渐迈向成熟的标志,也是必经之路,Nacos提供配置加密存储-运行时轮转的核心安全能力,将在应用安全领域承担更多职责。