V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Joker123456789
V2EX  ›  Java

Magician 发布新版本啦

  •  
  •   Joker123456789 · 2021-08-17 20:40:51 +08:00 · 1632 次点击
    这是一个创建于 1194 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本次更新主要是将 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 官网:https://www.magician-io.com

    7 条回复    2021-08-18 16:07:21 +08:00
    EscYezi
        1
    EscYezi  
       2021-08-18 14:46:57 +08:00 via iPhone
    有没有考虑过给 where 方法加一个参数,为 true 则拼接(类似 mybatis plus )
    kkkkkrua
        2
    kkkkkrua  
       2021-08-18 15:26:57 +08:00
    为啥不把关键字提取成方法呢?
    SqlBuilder.select(XX.class).where().and().where().or.where().orderBy().groupBy()
    之类的,方法支持 lambda 更好
    Joker123456789
        3
    Joker123456789  
    OP
       2021-08-18 15:50:23 +08:00
    @kkkkkrua

    因为关键词太多了,如果都提取的话 需要定义很多方法,而且也会增加学习难度。

    比如这句,where a=3 and (b=4 or c=5); 作为初次使用的人来说 肯定需要去翻一下文档才能知道要怎么写。 而我现在的这个做法,使用者完全可以这样写

    SqlBuilder.select("表名")
    .where("a=3");
    .where("and (b=4 or c=5)");

    毫无学习成本,就是纯 sql 。
    Joker123456789
        4
    Joker123456789  
    OP
       2021-08-18 15:51:06 +08:00
    @EscYezi 这个建议挺好的,下个版本会跟上,谢谢啦。
    kkkkkrua
        5
    kkkkkrua  
       2021-08-18 15:56:17 +08:00
    @Joker123456789 #3 代码里面嵌入 sql 并不美观,也不能通过编译器及时发现问题,这也是为什么 jpa 的 @Query,mybatis 的 xml 不好用的原因,你这种的和单纯拼 sql 字符串区别不大
    Joker123456789
        6
    Joker123456789  
    OP
       2021-08-18 16:04:52 +08:00
    @kkkkkrua

    是的,本来就不大,只是在一定程度上提高了单表操作的编码效率。 这个组件本来就是以写 sql 为主的。遇到多表的查询还是得 拼 sql 。 因为我个人是 sql 党,所以就按照自己喜欢的方式设计的,^_^。
    kkkkkrua
        7
    kkkkkrua  
       2021-08-18 16:07:21 +08:00
    @Joker123456789 #6 可以,没毛病
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2789 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 12:53 · PVG 20:53 · LAX 04:53 · JFK 07:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.