通过markdown实现自定义动态sql拼接,实现通过sql配置完成接口开发发布
整体框架还是依据0行代码写服务的框架不清楚的看一下前几篇文章,这里我们为了满足复杂查询利用动态sql拼接的方式去实现具体实现如下:
首先来看一下自定义的markdown sql文件:test.md
文件真实内容如下:
第一步配置sql文件:
首先我们根据“;”定义每一条sql的结尾,用“===”分割sql的标记名称和具体执行的sql,用“@”符号来确定出动态sql的部位,根据传的值是否为空去动态拼接sql
selectlike
===
select * from test where 1=1
@times
and times = #times#
@name
and instr(name, #name#)
selectpage
===
select * from test where 1=1
@times
and times = #times#
@name
and name = #name#
delete
===
delete from test where 1=1
@times
and times = #times#
@name
and name = #name#
@id
and id = #id#;
myselect
===
select p.province_name,p.province_id,c.city_id,c.city_name,c.lat,c.lon from b_china_provice p LEFT JOIN b_china_city c on p.province_id=c.province_id where 1=1
@name
and p.province_name in(#name#)
第二步接口服务注册:
为了和框架保持一致性,表结构完全采用以前框架的结构,我们把sql文件写好之后在这个表里面配置需要执行的方法名如“moreConditionsSearch”,这个参数是暴露给前端的参数,他对应的sqls为"test.selectlike",也就是我们后台需要执行的sql,test是sql文件的名称,selectlike是我们对应test.md文件中具体要执行的那一条sql
第三步调用已配置通用化的数据服务接口:
以上两步配置我们的通用接口地址如下:
/commapi?m=q&k=moreConditionsSearch
这个接口对应的动态sql为:
selectlike
===
select * from test where 1=1
@times
and times = #times#
@name
and instr(name, #name#)
也就是这个sql里可以传递的参数有times,name。那么我们分别执行以下看一下结果
1、不带参数:/commapi?m=q&k=moreConditionsSearch
2.携带一个参数name;/commapi?m=q&k=moreConditionsSearch&name=王
3.携带一个参数name和times两个参数;
/commapi?m=q&k=moreConditionsSearch&name=王×=3
4.携带一个参数name和times两个参数并且加上分页;
/commapi?m=q&k=moreConditionsSearch&name=王×=3&page=1&size=1
如果此处携带分页参数,则实际执行sql为加了分页后的,这里打印打印的执行sql并不是最终的执行sql 。最终的执行sql会变成"select * from test where 1=1 and times = 3 and instr(name, '王') limit 1,1"
5.只携带分页参数;
/commapi?m=q&k=moreConditionsSearch&page=1&size=1
复杂sql:动态拼接参数:
问同时要了一个比较长的sql如下
这个sql是个查询的,我们可以看到这里有两个参数我们做成动态传入:
最终解析结果如下:
下片文章演示删除和修改相关执行测试结果,新增动态接口正在开发中,欢迎讨论交流