public static void main(String[] args) { ActiveRecordPlugin ar = new ActiveRecordPlugin(getDataSource()); ar.start(); Kv params = Kv.by("sb", "select name from account where id = #p(id)").set("id", 1); String sql = "select id,(#(sb)) from table where id = #p(id)"; String ret = Db.templateByString(sql, params).getSqlPara().getSql(); System.out.println(ret); }
输出:
select id,(select name from account where id = #p(id)) from table where id = ?
上面的sql是演示SQL,实际的业务sql非常复查,所有子sql是通过业务判断才能传进模板。也许我走进死逻辑胡同了,但确实有这种场景 #(sb) 。这个子sql一开始是没有带id=#p(id)的,而是写死的值,但是这种写法,存在SQL注入漏洞。
或许我只能通过校验子sql的入参是否合法,然后 改成如下:
Kv params = Kv.by("sb", "select name from account where id = '#(id')").set("id", 1); String sql = "select id,(#(sb)) from table where id = #p(id)";
但我的目的是想让子sql的参数也用预编译。
大家有没有什么好的办法?@JFinal