Java genericDAO的结构
这是一个一般编程实践问题,如果不清楚,完全可以修改。我实现了customDao,而不是使用hibernate和其他orm工具 看看它的get方法:Java genericDAO的结构,java,hibernate,Java,Hibernate,这是一个一般编程实践问题,如果不清楚,完全可以修改。我实现了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 " de
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)
}
def列表(映射){
def condition=“”
整数计数=0
对于(Map.Entry:Map.entrySet()){
如果(计数!=0)条件+=“和”
def key=entry.getKey().toLowerCase()
def value=“”+entry.getValue()+“”
条件+=键+“=”+值
计数++
}
def SQL=“SELECT*FROM”+entityClass.getSimpleName().toLowerCase()+“WHERE”+条件
log.debug“…”+SQL
返回jdbcTemplate.queryForList(SQL)
}
一般来说,它需要一个Map
作为条件,并返回我们想要的带有Map中条件的列表。
例如,
customDao.list([parentid:1,name:“blabla”])
在这里,我可以请求parentid=1且name=“blablabla”的所有数据库记录
到目前为止还好吗 如果我需要获取
parentid的列表怎么办=1
,我的意思是,现在,我用map条件表示相等,但对于不相等或大于或小于等于条件,我应该怎么做。
长话短说,我必须在接收列表方法的参数时获得这些条件。最佳做法是什么。您的代码最明显的缺陷是易受SQL注入攻击。想象一下,有人会用
customDao.list([parentid:"1; drop table student; --"])
生成的SQL将是
select * from student where parentid = 1; drop table student; --;
你不想那样,对吧
此漏洞非常常见,以至于
一般来说,我建议不要重新发明轮子,除非你能改进已经存在的轮子。在您的情况下,可能有更好的方法,例如。除了像@meriton指出的那样容易受到SQL注入的影响之外(这可能是可以修复的),这种方法可能太通用了 假设您想查询一个关于员工的表。您需要指定特定于数据库中employee表的查询参数。当查询完成时,您还需要从结果列表中提取数据。您可能不会将这些与员工相关的变量/代码分散到整个项目中,而是设置一些类,这些类只与通用dao交互,用于员工相关的查询。。。在这种情况下,您实际上是在创建员工dao。因此,不管怎样,您最终将得到单独的、非泛型的DAO
我建议使用已经建立的ORM,为应用程序中的每个模型创建一个指定的DAO,或者使用其他一些数据访问模式。我建议阅读有关Hibernate标准查询的内容-从精彩的推荐开始,先生。如果无法重新设计数据库本身,您可以继续为应用程序中的每个模型创建一个指定的dao,或者查看其他一些数据访问设计模式:。请参阅关于对象关系映射模式的部分。另外,为什么要删除解释您的数据库设置的后续问题?请原谅,我删除此部分只是为了保持整洁,在问题或评论中没有进一步的问题。