最新java持久层框架七 summer-data Jql查询

官网地址: https://www.summer-data.com
代码库地址:https://gitee.com/hahan2020/summer-data

Jql = Java Query Language

Jql 的初心

Jql 的初心就是想用 SQL 查询数据,又想避免这个过程中的重大问题。

问题如下:

  • 拼 sql 就是拼字符串,而拼装字符串就容易拼错,这是不可避免的;
  • 我们设计的数据库表难免会有错误,必然会有改名、改字段等操作,这个时候就要重新检查所有拼装的sql字符串的正确性,这无疑是一场灾难;

为了解决这些问题,summer-data提出 Jql,jql 是summer-data的精髓,应该也是大家选择summer-data的原因。

第一个查询

Prod p = new Prod();
Jql jql = new Jql(){{
    select(p.prod_name);
    from(p)
}};
jql.queryForMap();

这里有一个不经常使用的java语法,双括弧语法(double-brace syntax),其实就是匿名类加初始块。我们不对这个语法做过多的解释,只需要知道这个块在实例构造时被执行。我们把这个块理解成是这个实例的一个方法,所以,方法自然就可以调用Jql的其他函数和方法了,而且不用加this.前缀。

在执行queryForMap时,jql会先生成一个jsql对象,然后调用jsql对象的queryForMap方法,最后返回结果。

语法糖

在实际的业务中基本都是需要很多表做联合查询,每个表类都定义一个实例显然是笨拙的,为此,summer-data提供了语法糖。

Jql jql = Jql
        .with(Prod.class, Prod.class, ProdDetail.class)
        .then((t1, t2, t3) -> new Jql(){{
            
        }});
jql.queryForMap();

这段代码使用了匿名表达式,他是当匿名函数只有一个返回值语法时,可以使用匿名表达式。如果你已经适应双括弧语法和匿名表达式了,推荐使用这些语法糖来写Jql语句。这段代码还有一个知识点,就是同一个标类可以通过多个实例完成表的自连接查询。接下来我们通过几段代码来展示Jql的使用方法。

一个典型的查询

Jql jql = Jql
    .with(Prod.class, ProdDetail.class)
    .then((t1, t2) -> new Jql(){{
        distinct();
        select(t1.prod_name, t1.prod_desc);
        select(t2);
        from(t1);
        join(t2).on(
                t1.res_id.eq(t2.prod_res_id)
        );
        where(
                t1.res_id.notEq(100),
                t1.prod_name.isNotNull()
        );
        and(t1.res_id.lt(200));
        and(t1.prod_name.like("中文"));
        or(t1.res_id.in(1, 2, 3));
        order(t2.detail_name.desc());
    }});

Jql基本上做到了望文知意,下面我把一些特殊的点介绍一下。

  • select(t2); 这句表示 select t2.*
  • distinct();select 没有顺序要求
  • t1.res_id.notEq(100) 这句转换成Jsql:prod.res_id = ? + 参数列表100
  • 17
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值