官网地址: 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