绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
面向sql编程的探索之路
2019-11-25 10:35:15

作者:邵磊

来源:https://juejin.im/post/5b31b12ae51d4558957ddb7f

前言

在我们JavaWeb开发过程中,或多或少会有些只是几行sql语句的service方法或是http请求,总是要反复写Controller层、service层、dao层。于是,我做了一个大胆的尝试,对于此类方法,封装出一个公共方法,不需要写java代码,写几行sql语句就能出各种接口及方法。

表设计

我们选取

id为url请求的方法名

description为描述

sql为具体sql语句

创建人

创建时间、修改时间

url请求

暂定http://a.com/common/sqls/方法名

注:方法名为表中的id。

入参不限,这里controller层都会传到service层,当然啦,如果你想限制,也可以做个入参白名单列表。

Controller层:

controller层主要是将所有变量接收转为一个paramsMap,然后校验用户token,通过token获取用户No。当没有token或者token无法获取到用户No时,抛异常。

得到用户No,将用户No的值 put进map,后将方法名(id)和map传入到service层。

CommonService:

版,我们先通过遍历map里的所有参数替换通过方法id获得到的sql,然后执行。

interface:

public interface CommonDao {

String getSqlById(String id);

List> querySql(String sql);

}

mapper:

mybatis版

getRequestParams:

好了到这里,我们版就出来了,咱先试试效果!

内部调用

java代码内部调用的时候,先实例化一个CommonService,然后调用commonService.querySql(id,params)返回即可,无论是普通调用,还是再次封装暴露rpc接口都没有问题。

新增请求

当我们想新增一个,获取用户好友的接口,我们只需在数据库里增加一条

调用

http://localhost:8080/*/common/sql/friends?token=cc4771aebb444d6c928a61ba5fe1153e

出参:

{"data":[{"id":"1","name":"张三"}] ,"code":200,"message":"success"}

这样一个获取friends的接口就好了,当然啦,实际需求sql可能很复杂,但这个不会影响我们项目执行。

第二版

虽然说版ok了,但是显然有个致命bug,那就是会被注入,所以,这个版本我们要解决注入问题。

思路一

过滤入参:

我们使用正则去过滤敏感字符,为了防止入参过多影响我们正则匹配,所有限定5个入参,限定每个参数值不超过50。

这样一做马上就遭来各种辱骂,好水的代码,为什么不用预编译?那我们接下来继续探索

思路二

预编译参数:

先通过正则替换将

select * from notices where reciever={userNo} and isRead={isRead}

替换为

select * from notices where reciever=? and isRead=?

再将{userNo}、{isRead}加入list,后遍历list,将list的元素userNo、isRead值传入preparedStatement。

思路二的方案可完美解决sql注入问题,当然还有其它方案,比如利用mybatis的sql构造器;利用其它sql预编译框架等。

第三版:

这下我们的安全问题也解决了,我们来追加一些公共方法,比如出参map中包含用户id,不包含用户姓名,而我们需要显示用户姓名。如果使用sql关联的话,各种关联使得sql越来越复杂。这里,我们封装一些公共方法,比如用户id转name、群组id转groupname。

表改造

增加 入参方法、出参方法 两个字段

这里我们支持逗号隔开方法,入参识别方法并追加到params里,代码如下:

switch内可以维护自己公司的内部公用方法,来减少sql书写量。

至于出参,我想大家都懂了,这里就不做介绍。

总结

至此,面向sql编程的一个框架就写好了,写一段sql、写几个公共方法(可选),即可完成一个http接口 或者 普通java方法,是不是很便捷,有没有要试一下的冲动。

分享好友

分享这个小栈给你的朋友们,一起进步吧。

MySQL干货资料
创建时间:2020-05-06 14:18:32
每天都有干货输出哦
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 飘絮絮絮丶
    专家
戳我,来吐槽~