这是一个通用的编程实践问题,如果不清楚则完全可以修改。我已经实现了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
的列表怎么办?我的意思是,现在,我采用地图条件求平等,但我应该做些什么来处理不平等或更大或更小或更小的条件。
长话短说我必须在接收列表方法的参数时得到这些条件。什么是最佳实践。
答案 0 :(得分:3)
您的代码最明显的缺陷是它易受SQL注入攻击。想象一下有人打电话给
customDao.list([parentid:"1; drop table student; --"])
生成的SQL将是
select * from student where parentid = 1; drop table student; --;
你不想那样,对吧?
此漏洞非常常见,cartoons exist about it。
一般情况下,我建议不要重新发明轮子,除非你可以改进已经存在的轮子。在你的情况下,可能有更好的轮子,例如QueryDSL。
答案 1 :(得分:0)
除了像@meriton指出的那样容易受到SQL注入的攻击,这可能是可以修复的,这种方法可能过于通用了。
假设您想要查询有关员工的表格。您需要指定要查询的特定于数据库中employee表的参数。在查询完成后,您还需要从结果列表中提取数据。您可能会设置一些只与员工相关查询的通用dao交互的类,而不是在项目中分散与员工相关的变量/代码......在这种情况下,您实际上是在创建员工dao。因此,无论如何,你最终会得到单独的,非通用的daos。
我建议使用已经建立的ORM,为应用程序中的每个模型创建一个指定的DAO,或者使用其他一些数据访问模式。