当前位置: 代码网 > it编程>编程语言>Java > SpringBoot使用MyBatis Generator生成动态SQL的详细步骤

SpringBoot使用MyBatis Generator生成动态SQL的详细步骤

2025年06月20日 Java 我要评论
概述我们将在spring boot项目中集成mybatis generator,并配置其生成mybatis dynamic sql风格的代码。 mybatis dynamic sql是mybatis

概述

我们将在spring boot项目中集成mybatis generator,并配置其生成mybatis dynamic sql风格的代码。 mybatis dynamic sql是mybatis 3的一个特性,它允许使用java api构建动态sql查询,避免编写xml或使用example类。

mybatis dynamic sql 核心优势

  • 类型安全:所有列引用都是类型安全的
  • 流畅的api:链式调用构建查询
  • 动态sql:自然处理条件逻辑
  • 无xml:避免xml配置的繁琐
  • ide支持:自动补全和类型检查

步骤概述:

  • 创建spring boot项目,添加必要的依赖(包括mybatis spring boot starter、数据库驱动、mybatis generator等)。
  • 配置mybatis generator(通过maven插件方式)。
  • 编写generatorconfig.xml配置文件,指定生成dynamic sql风格的代码。
  • 运行mybatis generator生成代码。
  • 在spring boot中配置mybatis,使用生成的mapper。

详细步骤

一、创建spring boot项目并添加依赖

使用spring initializr创建一个新项目,选择以下依赖:

  • spring web (如果构建web应用)
  • mybatis framework
  • mysql driver (以mysql为例,或者根据你的数据库选择)

然后在pom.xml中添加mybatis generator maven插件以及mybatis dynamic sql依赖:

<dependencies>
    <!-- spring boot starter -->
    <dependency>
        <groupid>org.springframework.boot</groupid>
        <artifactid>spring-boot-starter-web</artifactid>
    </dependency>
    <!-- mybatis spring boot starter -->
    <dependency>
        <groupid>org.mybatis.spring.boot</groupid>
        <artifactid>mybatis-spring-boot-starter</artifactid>
        <version>3.0.3</version>
    </dependency>
    <!-- mysql 驱动 -->
    <dependency>
        <groupid>com.mysql</groupid>
        <artifactid>mysql-connector-j</artifactid>
        <scope>runtime</scope>
    </dependency>
    <!-- lombok -->
    <dependency>
        <groupid>org.projectlombok</groupid>
        <artifactid>lombok</artifactid>
        <optional>true</optional>
    </dependency>
    <!-- mybatis dynamic sql -->
    <dependency>
        <groupid>org.mybatis.dynamic-sql</groupid>
        <artifactid>mybatis-dynamic-sql</artifactid>
        <version>1.5.0</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <!-- mybatis generator 插件 -->
        <plugin>
            <groupid>org.mybatis.generator</groupid>
            <artifactid>mybatis-generator-maven-plugin</artifactid>
            <version>1.4.2</version>
            <dependencies>
                <dependency>
                    <groupid>com.mysql</groupid>
                    <artifactid>mysql-connector-j</artifactid>
                    <version>8.0.33</version>
                </dependency>
                <!-- 支持生成 dynamic sql -->
                <dependency>
                    <groupid>org.mybatis.dynamic-sql</groupid>
                    <artifactid>mybatis-dynamic-sql</artifactid>
                    <version>1.5.0</version>
                </dependency>
            </dependencies>
            <configuration>
                <configurationfile>src/main/resources/generatorconfig.xml</configurationfile>
                <overwrite>true</overwrite>
                <verbose>true</verbose>
            </configuration>
        </plugin>
    </plugins>
</build>

二、编写generatorconfig.xml配置文件

src/main/resources目录下创建generatorconfig.xml文件。我们需要配置生成dynamic sql风格的代码,这通过设置targetruntime="mybatis3dynamicsql"来实现。

示例配置:

<?xml version="1.0" encoding="utf-8"?>
<!doctype generatorconfiguration
        public "-//mybatis.org//dtd mybatis generator configuration 1.0//en"
        "https://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorconfiguration>
    <!-- 引入 application.properties 中的配置(可选) -->
    <properties resource="application.properties"/>

    <!-- 数据库驱动路径(如果未通过maven依赖管理) -->
    <!-- <classpathentry location="/path/to/mysql-connector-java-8.0.33.jar"/> -->

    <context id="mysql" targetruntime="mybatis3dynamicsql">
        <!-- 生成的java文件编码 -->
        <property name="javafileencoding" value="utf-8"/>

        <!-- 生成的java文件的注释 -->
        <commentgenerator>
            <!-- 注释配置:不生成注释 -->
            <property name="suppressallcomments" value="true"/>
            <!-- 生成注释 -->
            <!--            <property name="addremarkcomments" value="true"/>-->
        </commentgenerator>
        <!-- 数据库连接信息 -->
        <jdbcconnection driverclass="${spring.datasource.driver-class-name}"
                        connectionurl="${spring.datasource.url}"
                        userid="${spring.datasource.username}"
                        password="${spring.datasource.password}">
        </jdbcconnection>
        <!-- java模型生成配置 -->
        <javamodelgenerator targetpackage="com.example.demo.model.entity" targetproject="src/main/java">
            <property name="enablesubpackages" value="true"/>
            <property name="trimstrings" value="true"/>
        </javamodelgenerator>
        <!-- 注意:如果使用dynamic sql方式,不需要xml映射文件 -->
        <!-- 生成 sql map xml 文件的配置 -->
        <!--        <sqlmapgenerator targetpackage="mapper" targetproject="src/main/resources">-->
        <!--            <property name="enablesubpackages" value="true" />-->
        <!--        </sqlmapgenerator>-->
        <!-- mapper接口生成配置 -->
        <javaclientgenerator type="annotatedmapper"
                             targetpackage="com.example.demo.repository.generated"
                             targetproject="src/main/java">
            <property name="enablesubpackages" value="true"/>
        </javaclientgenerator>
        <!-- 指定要生成的表 -->
        <table tablename="user" domainobjectname="user">
            <generatedkey column="id" sqlstatement="mysql" identity="true"/>
        </table>
        <table tablename="rule" domainobjectname="ruleentity" mappername="rulemapper">
            <generatedkey column="id" sqlstatement="mysql" identity="true"/>
        </table>

        <table tablename="rule_version" domainobjectname="ruleversionentity" mappername="ruleversionmapper">
            <generatedkey column="id" sqlstatement="mysql" identity="true"/>
        </table>
        <!-- 生成所有表 -->
        <!--         <table tablename="%" />-->
    </context>
</generatorconfiguration>


注意:

  • 我们使用了targetruntime="mybatis3dynamicsql",这会生成dynamic sql风格的代码。
  • 不需要配置sqlmapgenerator,因为dynamic sql不生成xml映射文件。
  • javaclientgeneratortype设置为annotatedmapper,表示使用注解方式(实际上dynamic sql的mapper接口是通过java api构建的,由dynamic sql的运行时库提供支持)。
  • jdbcconnection中,我们使用了spring boot的application.properties中的数据库配置(通过${}占位符引用)。需要在generatorconfig.xml文件中配置 <properties resource="application.properties"/>,并且确保application.properties中有这些属性。

三、配置application.properties

src/main/resources/application.properties中配置数据源:

spring.application.name=demo
server.port=8088
# 数据源配置
spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase
spring.datasource.username=root
spring.datasource.password=mysecretpassword
spring.datasource.driver-class-name=com.mysql.cj.jdbc.driver

四、运行mybatis generator生成代码

在项目根目录下运行命令:

mvn mybatis-generator:generate

或者在ide中运行maven插件的mybatis-generator:generate目标。

生成的文件将包括:

  • 实体类(pojo):在com.example.demo.model.entity包下。
  • mapper接口:在com.example.demo.repository.generated包下。注意,生成的mapper接口会继承mybatis dynamic sql提供的mybatis3mapper接口(比如commoncountmapper, commondeletemapper, commonupdatemapper),这些接口提供了一些基本的crud方法。

五、在spring boot中使用生成的mapper

  • 在目录 com.example.demo.config 创建 mybatisconfig.java 配置类:
import org.apache.ibatis.session.sqlsessionfactory;
import org.mybatis.spring.sqlsessionfactorybean;
import org.mybatis.spring.annotation.mapperscan;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;

import javax.sql.datasource;

@configuration
@mapperscan("com.example.demo.repository")
public class mybatisconfig {
    @bean
    public sqlsessionfactory sqlsessionfactory(datasource datasource) throws exception {
        sqlsessionfactorybean sessionfactory = new sqlsessionfactorybean();
        sessionfactory.setdatasource(datasource);
        sessionfactory.settypealiasespackage("com.example.demo.model.entity");

        return sessionfactory.getobject();
    }

}

在spring boot项目中,使用@mapperscan注解可以方便地扫描并注册mybatis的mapper接口。这样,我们就不需要在每个mapper接口上都添加@mapper注解。

注意事项:

  • @mapperscan@mapper:如果使用了@mapperscan,则不需要在每个mapper接口上再写@mapper。但是,如果有些mapper接口不在扫描路径下,那么仍然需要在该接口上使用@mapper
  • 包路径:确保@mapperscan指定的包路径正确,否则spring容器无法创建mapper的bean,导致注入失败。
  • 多模块项目:如果项目有多个模块,并且mapper接口分布在不同的模块中,确保这些模块的包路径都被扫描到。

在service中注入mapper并使用:

@service
@requiredargsconstructor
public class userservice {
    
    private final usermapper usermapper;
    
    // 创建用户
    public int createuser(user user) {
        return usermapper.insert(user);
    }
    
    // 根据id获取用户
    public optional<user> getuserbyid(long id) {
        return usermapper.selectbyprimarykey(id);
    }
    
    // 更新用户
    public int updateuser(user user) {
        return usermapper.updatebyprimarykeyselective(user);
    }
    
    // 删除用户
    public int deleteuser(long id) {
        return usermapper.deletebyprimarykey(id);
    }
    
    // 动态查询用户
    public list<user> findusers(string username, integer minage, integer maxage) {
        return usermapper.select(c -> c
            .where(userdynamicsqlsupport.username, islikeifpresent(username).map(s -> s + "%")
            .and(userdynamicsqlsupport.age, isbetweenwhenpresent(minage, maxage))
            .orderby(userdynamicsqlsupport.createtime.descending())
            .build()
            .execute());
    }
    
    // 辅助方法:条件存在时使用 like
    private optional<condition> islikeifpresent(string value) {
        return optional.ofnullable(value)
            .filter(v -> !v.isempty())
            .map(v -> userdynamicsqlsupport.username.like(v));
    }
    
    // 辅助方法:条件存在时使用 between
    private optional<betweencondition> isbetweenwhenpresent(integer min, integer max) {
        if (min != null && max != null) {
            return optional.of(userdynamicsqlsupport.age.between(min, max));
        }
        return optional.empty();
    }
}

注意:上面的user是一个自动生成的表对应的对象(在usermapper中有一个静态字段user,用于构建查询)。实际使用时,需要导入生成的mapper和表对象。

例如,在userservice中导入:

import static com.example.demo.mapper.userdynamicsqlsupport.*;

import static org.mybatis.dynamic.sql.sqlbuilder.*;

  • 在controller中注入service并使用
@restcontroller
@requestmapping("/api/users")
@requiredargsconstructor
public class usercontroller {
    
    private final userservice userservice;
    
    @postmapping
    public responseentity<?> createuser(@requestbody user user) {
        int result = userservice.createuser(user);
        return result > 0 
            ? responseentity.ok("user created")
            : responseentity.badrequest().body("create failed");
    }
    
    @getmapping("/{id}")
    public responseentity<user> getuser(@pathvariable long id) {
        return userservice.getuserbyid(id)
            .map(responseentity::ok)
            .orelse(responseentity.notfound().build());
    }
    
    @putmapping("/{id}")
    public responseentity<?> updateuser(@pathvariable long id, @requestbody user user) {
        user.setid(id);
        int result = userservice.updateuser(user);
        return result > 0 
            ? responseentity.ok("user updated")
            : responseentity.badrequest().body("update failed");
    }
    
    @deletemapping("/{id}")
    public responseentity<?> deleteuser(@pathvariable long id) {
        int result = userservice.deleteuser(id);
        return result > 0 
            ? responseentity.ok("user deleted")
            : responseentity.badrequest().body("delete failed");
    }
    
    @getmapping("/search")
    public list<user> searchusers(
            @requestparam(required = false) string username,
            @requestparam(required = false) integer minage,
            @requestparam(required = false) integer maxage) {
        
        return userservice.findusers(username, minage, maxage);
    }
}

六、mybatis dynamic sql 生成代码的特点

生成的mapper接口包含的方法:

  • insert:插入记录
  • insertmultiple:批量插入
  • insertselective:选择性插入(忽略null)
  • selectbyprimarykey:根据主键查询
  • select:根据条件查询(可返回多条)
  • selectone:根据条件查询一条
  • update:更新
  • delete:删除

同时会生成一个与表同名的辅助类(如userdynamicsqlsupport),其中包含表的列定义,用于构建动态sql。

不需要xml映射文件,所有sql通过java api动态构建。

七、注意事项

  • 确保数据库表有主键,否则生成代码时可能会出现问题。
  • 如果表名或列名是sql关键字,需要在配置中使用<columnoverride><table>delimitidentifiers属性处理。
  • 生成的代码可能会覆盖已有的文件,注意备份自定义代码(通常不要修改生成的代码,而是通过扩展方式)。

八、总结

本方案在 spring boot 中集成了 mybatis generator,并配置生成 mybatis dynamic sql 风格的代码,具有以下特点:

  • 代码简洁:使用 lombok 减少样板代码
  • 类型安全:dynamic sql 提供编译时检查
  • 易于维护:无需 xml 配置
  • 动态查询:灵活构建复杂查询
  • 高效开发:自动生成基础 crud 代码

通过这种方式,你可以专注于业务逻辑开发,而无需手动编写重复的数据访问层代码。

以上就是springboot使用mybatis generator生成动态sql的详细步骤的详细内容,更多关于springboot生成动态sql的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com