概述
我们将在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映射文件。 javaclientgenerator的type设置为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的资料请关注代码网其它相关文章!
发表评论