为 r2dbc 提供第三方模板引擎的动态 SQL 支持

原创
2023/11/17 10:19
阅读数 63

templated-spring-data-r2dbc

拓展 spring-data-r2dbc,支持用户自定义引入三方模板引擎来实现动态SQL,默认提供了 enjoy 模板实现。并封装了分页查询,可以一次调用返回总数以及分页记录。

下面是示例:

        <dependency>
            <groupId>com.kfyty</groupId>
            <artifactId>templated-spring-data-r2dbc</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
@Repository
public interface UserDao extends R2dbcRepository<UserDO, Long> {
    @Templated
    @Query(Templated.TEMPLATE)
    Flux<UserDO> page(Pageable<UserDO> page, Long id, UserDO user);
}
<mapper namespace="com.kfyty.templated.r2dbc.dao.UserDao">
    <select id="page">
        <![CDATA[
        select
            id,
            open_id
        from
            user
        where 1 = 1
        #if(id != null)
            and id = :#{[id]}
        #end
        #if(user != null && user.nickname != null)
            and nickname = :#{[user].nickname}
        #end
        ]]>
    </select>
</mapper>

由于 r2dbc 默认使用 Object[] 传参,该项目重写为使用 Map 传参,因此 SQL 中的参数引用接口中的参数时, 需先使用 #{[key]}, 然后再获取参数嵌套属性。对于 enjoy 模板则可以直接引用接口参数值。

单元测试如下:

    @Autowired
    private UserDao userDao;

    @Test
    public void pageTest() {
        Pageable<UserDO> page = Pageable.of(0, 1);

        UserDO user = new UserDO();
        user.setNickname("test");

        // 由于 r2dbc 框架限制,方法接口只能返回 Flux<?> 类型,但提供了转换方法,可以转换为常见的 Mono<Pageable<UserDO>> 类型
        Flux<UserDO> flux = this.userDao.page(page, 1L, user);
        Mono<Pageable<UserDO>> pageUserDO = Pageable.pack(page, flux);

        pageUserDO.subscribe(System.out::println);
    }

github: https://github.com/kfyty/templated-spring-data-r2dbc

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部