概述
我们将在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的资料请关注代码网其它相关文章!
发表评论