据说在代码里拼接查询条件不够优雅?Magic-1.0.2 发布

不好意思,我吹牛了,有点标题党。

本次的升级并没有什么新鲜的东西,就是给 StringBuilder 套了个壳子,本质上还是字符串的拼接,目的是为了减少大量的 if,让判断 + 拼接的过程缩短在一行上,以及在拼接时不再需要注意空格了。

可是,不管怎么样,反正比以前更方便了就是了,大家如果有兴趣的话可以了解一下。

假如我们有一个实体对象,需要把它作为查询条件,那么我们一般的做法是这样的。

java 复制代码
// 作为查询条件的实体对象
ParamPO paramPO = new ParamPO();
paramPO.setAge(10);
paramPO.setHeight(1);


// sql主体,JDK17+的写法
String sql = """
             select 
                 id,name,age,create_time
             from 
                 user_info
             where 1=1
""";


// 拼接条件
StringBuilder stringBuilder = new StringBuilder(sql);

if(paramPO.getAge() > 0){
      stringBuilder.append(" and age > {age}"); // 需要注意空格,不然一不小心就沾一起了
}

if(paramPO.getName() != null){
      stringBuilder.append(" and name = {name}"); // 需要注意空格,不然一不小心就沾一起了
}

if(paramPO.getHeight() != null){
      stringBuilder.append(" and height > {height}"); // 需要注意空格,不然一不小心就沾一起了
}

// 查询数据
List<ParamPO> result = MagicDBUtils.get(jdbcTemplate).selectList(stringBuilder.toString(), paramPO, ParamPO.class);

这里面最被人诟病的就在于拼接条件的这一段,因为会出现大量的 if,本来一行就可以解决的,现在变成了三行

所以,我们此次的升级就是为了让这一段更优雅一点。

以实体对象作为参数的示例

java 复制代码
ParamPO paramPO = new ParamPO();
paramPO.setAge(10);
paramPO.setHeight(1);

// sql主体,JDK17+的写法
String sql = """
             select 
                 id,name,age,create_time
             from 
                 user_info
             where 1=1
""";

// 条件拼接
SqlBuilder sqlBuilder = SqlBuilder.builder()
        .init(sql) // 这里传入sql主体
        .append("and age > {age}", paramPO.getAge() > 0) // 第一个参数传入要拼接的where条件,第二个参数传入是否要拼接的判断条件,也就是说第二个参数的等式成立才会将第一个参数拼接到sql上去,下面都是一样的
        .append("and name = {name}", paramPO.getName() != null)
        .append("and height > {height}", paramPO.getHeight() != null);

// 直接toString 可以获取到拼接后的完整sql
String sql = sqlBuilder.toString();

// 查询数据
List<ParamPO> result = MagicDBUtils.get(jdbcTemplate).selectList(sql, paramPO, ParamPO.class);

以数组作为参数的示例

java 复制代码
// 作为参数的数组
List<Object> params = new ArrayList<>();

// sql主体,JDK17+的写法
String sql = """
             select 
                 id,name,age,create_time
             from 
                 user_info
             where 1=1
""";

// 条件拼接
SqlBuilder sqlBuilder = SqlBuilder.builder()
        .init(sql) // 这里传入sql主体
        
        // 这里为了偷懒,还是用到了paramPO对象,反正大家懂那个意思就行了
        // 第一个参数传入要拼接的where条件,第二个参数传入是否要拼接的判断条件
        // 也就是说第二个参数的等式成立才会将第一个参数拼接到sql上去,下面都是一样的
        // 第三个参数是一个回调函数,用来往params里添加数据的
        .append("and age > ?", paramPO.getAge() > 0, ()->{params.add(paramPO.getAge());}) 
        .append("and name = ?", paramPO.getName() != null, ()->{params.add(paramPO.getName());})
        .append("and height > ?", paramPO.getHeight() != null, ()->{params.add(paramPO.getHeight());});

// 直接toString 可以获取到拼接后的完整sql
String sql = sqlBuilder.toString();

// 查询数据,注意看第二个参数,需要将List转成数组
List<ParamPO> result = MagicDBUtils.get(jdbcTemplate).selectList(sql, params.toArray(), ParamPO.class);

简单说明

我们肯定都知道这个吧

java 复制代码
@Resource
private JdbcTemplate jdbcTemplate;

本工具包只是对它做了一个很轻微的扩展,大家不必把它当成是一个持久层框架,而且它事实上也不是一个框架,就是个小型的工具包而已,里面提供的功能也不仅仅是操作数据库。

大家如果有兴趣可以访问官网了解详情:magician-io.com

相关推荐
进击的小菜鸡dd几秒前
互联网大厂Java面试:从Spring Boot到微服务架构的场景化技术问答
java·spring boot·redis·ci/cd·微服务·消息队列·mybatis
IT19951 分钟前
IDEA+JDK11编译SpringCore5源码及替换项目中的Springcore
java·ide·intellij-idea
techzhi1 分钟前
IntelliJ IDEA 启动卡顿问题排查与解决
java·ide·intellij-idea
WayneJoon.H5 分钟前
2023CISCN deserbug复现
java·安全·web安全·cc链·反序列化
week_泽6 分钟前
第8课:LangGraph Memory管理机制与实现方案 - 学习笔记_8
java·笔记·学习·ai agent
李日灐7 分钟前
C++STL:仿函数、模板(进阶) 详解!!:“伪装术”和模板特化、偏特化的深度玩法指南
开发语言·c++·后端·stl
万岳软件开发小城14 分钟前
如何用直播电商系统源码低成本打造自己的直播带货APP/小程序?
开源·php·源码·直播带货系统源码·直播带货软件开发·直播带货app开发·电商直播小程序
装不满的克莱因瓶16 分钟前
【cursor】前后端分离项目下的AI跨工程管理方案
java·人工智能·ai·ai编程·cursor·trae·qoder
何中应20 分钟前
使用Spring自带的缓存注解维护数据一致性
java·数据库·spring boot·后端·spring·缓存
ZeroToOneDev20 分钟前
Mybatis
java·数据库·mybatis