mybatis-dynamic-sql 升级遇到的坑

背景

因某些原因需要将项目中mybatis-dynamic-sql 升级,从远古版本的1.2.1 升级到1.5.2
MyBatis Dynamic SQL change log

遇到的问题

1.空where导致的NonRenderingWhereClauseException

旧代码中有部分空where条件或者可能导致where条件为空的代码
如:

.where(PermissionDSS.type, isEqualToWhenPresent(type))
.where()

这个问题在2022年已经有人遇到并且提了issue,解决方案也在这里面,在官方文档中也有说明:地址
在这里插入图片描述
主要就是在全局或者单个逻辑中增加

.configureStatement(c -> c.setNonRenderingWhereClauseAllowed(true))

2.renderWithTableAlias弃用

原方法的renderWithTableAlias已弃用,推荐使用render

@deprecated Please replace this method by overriding the more general "render" method

原代码

	@Override
    public String renderWithTableAlias(TableAliasCalculator tableAliasCalculator) {
        return "sum( to_number(" + column.renderWithTableAlias(tableAliasCalculator) + "))";
    }

新代码

	@Override
    public FragmentAndParameters render(RenderingContext renderingContext) {
        return column.render(renderingContext).mapFragment(s ->
                "sum( to_number(" + s + "))"
        );
    }
<think>嗯,用户想了解如何在Gradle中配置MyBatis Dynamic SQL。我需要先回忆一下相关的依赖项和配置步骤。首先,MyBatis Dynamic SQL是一个基于MyBatis的库,用于构建动态SQL语句,所以需要引入MyBatis的核心依赖以及MyBatis Dynamic SQL的相关库。 接下来,用户可能使用的是Gradle,所以得考虑Gradle的依赖配置方式。需要确保添加正确的仓库,比如Maven Central。然后,主要的依赖项应该包括mybatis-dynamic-sqlmybatis、以及数据库驱动,比如H2或者MySQL,根据用户的实际数据库选择。另外,可能还需要MyBatis的Spring集成,如果用户的项目是基于Spring的话,比如mybatis-spring。 然后,配置数据源。在Gradle项目中,通常会在application.properties或application.yml中配置数据源,但如果是纯Gradle项目,可能需要使用其他方式,比如HikariCP。不过用户可能更熟悉Spring Boot的配置方式,所以可能需要提到在Spring Boot下的配置方法,比如使用spring-boot-starter-jdbc或者spring-boot-starter-data-jpa。 接下来,MyBatis的配置,比如Mapper接口的扫描路径,XML映射文件的位置。在Gradle中,可能需要配置资源目录,确保XML文件被正确打包。同时,MyBatis Dynamic SQL通常推荐使用Java配置而非XML,所以需要说明如何编写Mapper接口和动态SQL的构建方式。 另外,可能需要提到插件,比如MyBatis Generator插件,用于生成模型和Mapper接口,不过MyBatis Dynamic SQL可能有自己的代码生成方式,需要查证。例如,MyBatis Generator有一个官方插件,可以配置生成动态SQL支持的代码。 用户可能的疑问点包括依赖版本的选择,是否需要额外的插件,数据源配置是否正确,以及如何实际编写动态查询。因此,回答中需要分步骤说明,确保依赖项正确,配置数据源,配置MyBatis,并给出一个简单的示例,比如创建实体、Mapper接口和动态查询的使用。 还需要注意Gradle的依赖语法是否正确,比如implementation还是compile,根据Gradle版本不同可能有差异,现在一般推荐使用implementation。另外,测试部分是否需要,比如配置测试数据库或者示例测试用例。 最后,确认所有步骤是否连贯,是否覆盖了用户可能遇到的问题,比如依赖冲突、配置文件位置错误、动态SQL的使用方法等。可能需要提醒用户注意版本兼容性,以及提供参考链接或官方文档供进一步查阅。</think>以下是配置MyBatis Dynamic SQL的Gradle步骤详解: ### 一、添加依赖 ```gradle // build.gradle 配置 dependencies { // MyBatis核心 implementation 'org.mybatis:mybatis:3.5.13' // MyBatis Dynamic SQL核心库 implementation 'org.mybatis.dynamic-sql:mybatis-dynamic-sql:1.4.0' // 数据库驱动(以MySQL为例) implementation 'mysql:mysql-connector-java:8.0.33' // 连接池(以HikariCP为例) implementation 'com.zaxxer:HikariCP:5.0.1' // 代码生成插件(可选) implementation 'org.mybatis.generator:mybatis-generator-core:1.4.2' } ``` ### 二、配置数据源 在`src/main/resources/application.yml`中添加: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=UTC username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver hikari: maximum-pool-size: 10 ``` ### 三、MyBatis配置类 ```java @Configuration @MapperScan("com.example.mapper") // 指定Mapper接口位置 public class MyBatisConfig { @Bean public DataSource dataSource() { return new HikariDataSource(hikariConfig()); } @Bean public SqlSessionFactory sqlSessionFactory() throws Exception { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(dataSource()); return factoryBean.getObject(); } } ``` ### 四、动态SQL使用示例 1. 创建实体类: ```java public class User { private Long id; private String name; private Integer age; // getters/setters } ``` 2. 编写Mapper接口: ```java @Mapper public interface UserMapper { @SelectProvider(type=SqlProvider.class, method="buildSelectQuery") List<User> selectByCondition(SelectStatementProvider selectStatement); } ``` 3. 构建动态查询: ```java public List<User> findUsers(String name, Integer minAge) { SelectStatementProvider selectStatement = select(id, name, age) .from(user) .where(name, isEqualToWhenPresent(name)) .and(age, isGreaterThanOrEqualToWhenPresent(minAge)) .build() .render(RenderingStrategies.MYBATIS3); return userMapper.selectByCondition(selectStatement); } ``` ### 五、代码生成配置(可选) 创建`generatorConfig.xml`: ```xml <generatorConfiguration> <context id="MyBatisDynamic" targetRuntime="MyBatis3DynamicSql"> <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/your_db" userId="root" password="123456"/> <javaModelGenerator targetPackage="com.example.model"/> <sqlMapGenerator targetPackage="com.example.mapper"/> <table tableName="user"/> </context> </generatorConfiguration> ``` ### 六、常见问题排查 1. **依赖冲突**:使用`./gradlew dependencies`查看依赖树 2. **SQL未生效**:检查动态条件中的`isXXXWhenPresent`方法 3. **映射错误**:确保实体类字段与数据库列名匹配 4. **连接问题**:验证数据库URL和防火墙设置 最新版本建议查看[MyBatis Dynamic SQL官方文档](https://mybatis.org/mybatis-dynamic-sql/docs/index.html)获取最新配置方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值