开源项目
github地址: https://github.com/sagframe/sagacity-sqltoy
gitee地址: https://gitee.com/sagacity/sagacity-sqltoy
在开场之前,先简单说一下sqltoy是有基于对象的crud的,通过quickvo产生pojo通过annotation对应表和字段。但这里不作介绍。
一说最强大,很多人带着质疑进来了,我想说不会让你失望的,会给你带来不一样的视角和对问题处理的策略!
我们假设一个场景:查询员工信息表
分析:涉及员工表、机构表(取机构名称)、数据字典表(取岗位名称)
代码:
select t1.STAFF_ID,
t1.STAFF_NAME,
t1.ORGAN_ID,
-- 子查询岗位名称,应该还有性别等,这里简化一下
(select dict_name 、
from sys_dict_detail
where dict_type='POST_TYPE'
and dict_key=t1.POST_CODE) postName,
t2.ORGAN_NAME,
t1.DUTY_DATE,
t1.EMAIL,
t1.MOBILE_NO
from sys_staff_info t1
left join sys_organ_info t2
on t1.ORGAN_ID=t2.ORGAN_ID
where t1.name like '陈%'
and t1.DUTY_DATE>='2019-01-01'
and t1.DUTY_DATE<='2019-12-31'
order by t1.DUTY_DATE desc
<sql id="sqltoy_fastPage">
<value>
<![CDATA[
select t1.*,
(select dict_name
from sys_dict_detail
where dict_type='POST_TYPE'
and dict_key=t1.POST_CODE) postName,
t2.ORGAN_NAME
-- @fast 实现先分页提取最小范围数据,再跟其他表关联查询
from @fast(select STAFF_ID,
STAFF_NAME,
ORGAN_ID,
POST_CODE,
DUTY_DATE,
EMAIL,
MOBILE_NO
from sys_staff_info
where #[name like :staffName]
#[and DUTY_DATE>=:beginDate]
#[and DUTY_DATE<=:endDate]
order by t1.DUTY_DATE desc
) t1
left join sys_organ_info t2
on t1.ORGAN_ID=t2.ORGAN_ID
]]>
</value>
</sql>
<sql id="sqltoy_fastPage">
<!--alive-max:表示存放100条不同条件的count结果; alive-seconds:表示每个条件组合的结果只在120秒内有效 -->
<page-optimize alive-max="100" alive-seconds="120" />
<value>
<![CDATA[
select t1.*,
(select dict_name
from sys_dict_detail
where dict_type='POST_TYPE'
and dict_key=t1.POST_CODE) postName,
t2.ORGAN_NAME
-- @fast 实现先分页提取最小范围数据,再跟其他表关联查询
from @fast(select STAFF_ID,
STAFF_NAME,
ORGAN_ID,
POST_CODE,
DUTY_DATE,
EMAIL,
MOBILE_NO
from sys_staff_info
where #[name like :staffName]
#[and DUTY_DATE>=:beginDate]
#[and DUTY_DATE<=:endDate]
order by t1.DUTY_DATE desc
) t1
left join sys_organ_info t2
on t1.ORGAN_ID=t2.ORGAN_ID
]]>
</value>
</sql>
<sql id="sqltoy_fastPage">
<!-- alive-max:不同查询条件的总记录量; alive-seconds:查询条件记录量存活时长-->
<page-optimize alive-max="100" alive-seconds="120" />
<!-- 通过缓存对代码直接翻译,根本上去除掉一些不必要的关联查询 -->
<translate cache="dictKeyName" cache-type="POST_TYPE" columns="postName"/>
<translate cache="organIdName" columns="ORGAN_NAME"/>
<!-- 对电话号码做一个安全脱敏 -->
<secure-mask columns="MOBILE_NO" type="tel"/>
<value>
<![CDATA[
select t1.STAFF_ID,
t1.STAFF_NAME,
t1.ORGAN_ID,
t1.DUTY_DATE,
t1.POST_CODE postName,
t1.ORGAN_ID ORGAN_NAME,
t1.EMAIL,
t1.MOBILE_NO
from sys_staff_info
where #[name like :staffName]
#[and DUTY_DATE>=:beginDate]
#[and DUTY_DATE<=:endDate]
order by t1.DUTY_DATE desc
]]>
</value>
</sql>