这是一个一般的编程实践问题,如果不清楚,完全可以修改。我实现了一个customDao,而不是使用hibernate和其他orm工具。
看看它的get方法:
def list(Map map){
def condition=""
int count=0
for (Map.Entry<String, Object> entry : map.entrySet()) {
if(count != 0) condition +=" AND "
def key=entry.getKey().toLowerCase()
def value="'"+entry.getValue()+"'"
condition +=key+" = "+value
count++
}
def SQL="SELECT * FROM "+entityClass.getSimpleName().toLowerCase()+" WHERE "+condition
log.debug "........"+SQL
return jdbcTemplate.queryForList(SQL)
}通常情况下,它需要一个Map作为条件,并返回我们想要的map中的条件列表。
例如:customDao.list([parentid:1,name:"blabla"])
在这里,我可以使用parentid=1和name="blabla“请求所有数据库记录。
到目前一切尚好?
如果我需要得到一个parentid!=1的列表,我的意思是现在,我接受了关于相等的映射条件,但是对于不等式,或者greaterThan或lesserThan条件,我应该怎么做呢?
长话短说,我必须在接收列表时获得这些条件,method.What的参数是最佳实践。
发布于 2014-02-27 19:39:06
您的代码最明显的缺陷是易受SQL注入的攻击。想象一下,如果有人调用它
customDao.list([parentid:"1; drop table student; --"])生成的SQL将为
select * from student where parentid = 1; drop table student; --;你不想这样,对吧?
此漏洞非常常见,以至于cartoons exist about it。
一般来说,我建议不要重新发明轮子,除非你可以改进已经存在的轮子。在您的例子中,可能有更好的轮子,比如QueryDSL。
发布于 2014-02-27 19:45:58
除了像@meriton指出的那样容易受到SQL注入的攻击外,这种方法可能太通用了。
假设您想查询一个关于雇员的表。您需要指定要查询的特定于数据库中employee表的参数。当查询完成时,您还需要从结果列表中提取数据。而不是将那些与员工相关的变量/代码分散在项目中,您可能会设置一些仅与通用dao交互的类来进行与员工相关的查询……在这种情况下,您实际上是在创建一个employee dao。因此,您最终将得到独立的、非通用的daos。
我建议使用已经建立的ORM,为应用程序中的每个模型创建一个指定的DAO,或者使用其他一些数据访问模式。
https://stackoverflow.com/questions/22066946
复制相似问题