Magician 发布新版本啦

288 阅读2分钟

本次更新主要是将 Magician-Web,Magician-JDBC 进行了一个小小的升级。

改动点如下:

  1. 修复了 Magician-Web 的拦截器,通配符过于严谨的问题
  2. 增强了 Magician-JDBC 的 sql 辅助器

拦截器的通配符过于严谨

在之前的版本中,如果我们的接口 url 是这样的: [/api/order/list,/api/order/create,/api/lottery/list ]

如果想拦截所有 api 开头的接口,大家肯定能想到在拦截器中这么配置

@Interceptor(pattern = "/api/*")
public class DemoInterceptor implements MagicianInterceptor {
}

但是很遗憾,上个版本不支持,你要么 配置 [ pattren="/api/order/"] 拦截所有 [/api/order/] 开头的接口,要么配置 [ pattren="/api/lottery/ "] 拦截所有 [/api/lottery/] 开头的接口,又或者像下面这样配

@Interceptor(pattern = "/api/*/*")
public class DemoInterceptor implements MagicianInterceptor {
}

但是这也会有点问题,不够灵活,等于是限制死了 url 的级数,必须等于 3 级 不能多也不能少。所以新版本修复了这个小问题,现在可以这样配置了

@Interceptor(pattern = "/api/*")
public class DemoInterceptor implements MagicianInterceptor {
}

增强了 Magician-JDBC 的 sql 辅助器

我拿查询举例子,以前我们写 where 条件必须这样

String sql = SqlBuilder
                .select("lottery_order_list")
                .column(OrderPO.class)
                .where("user_id = #{user_id} and pay_status = #{pay_status} and lottery_status = #{lottery_status} order by create_time desc")
                .builder();

这样写有三个问题

  1. where 方法的参数太长了,阅读困难
  2. 如果条件需要动态拼接就得自己定义一个 StringBuffer
  3. 最后面那些 group by,order by,limit 等都跟 where 窝在一起,有点奇怪

所以在这个版本,对这块做了增强,还是上面那个例子,我们可以改成这样

String sql = SqlBuilder
                .select("lottery_order_list")
                .column(OrderPO.class)
                // where 可以传入多次,SqlBuilder 会自动拼接
                .where("user_id = #{user_id}")
                .where("and pay_status = #{pay_status}")
                .where("and lottery_status = #{lottery_status}")
                // order by 和 where 分开了
                .end("order by create_time desc")
                .builder();

where 可以传入多次,SqlBuilder 会自动拼接这些条件,这样写的话,一行一行很清晰,而且如果遇到了需要动态拼 sql 的时候,可以这样

Select select = SqlBuilder
                .select("lottery_order_list")
                .column(OrderPO.class);
                
// if 里面的条件只是举例子,java 没有这种语法
if(user_id 不等于 null){
    select.where("user_id = #{user_id}");
}
if(pay_status 不等于 null){
    select.where("and pay_status = #{pay_status}");
}
if(lottery_status 不等于 null){
    select.where("and lottery_status = #{lottery_status}");
}           
select.end("order by create_time desc");

String sql = select.builder();

这边再说点小插曲吧,sql 辅助器听字面意思应该就能理解了,他只是一个写 sql 的辅助器,并不是那些什么把 sql 代码化的设计思路,更不是 JPA 那套东西。他就是一个辅助写 sql 的工具类而已。而且仅针对单表的增删改查。

Magician-JDBC 从一开始就是遵循的写 sql 的设计方向,一切周边工具都是为了更方便的写 sql,千万不要理解偏了哦,^_^。

Magician 官网:www.magician-io.com