Java genericDAO的结构

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

这是一个一般编程实践问题,如果不清楚,完全可以修改。我实现了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)
}
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,或者查看其他一些数据访问设计模式:。请参阅关于对象关系映射模式的部分。另外,为什么要删除解释您的数据库设置的后续问题?请原谅,我删除此部分只是为了保持整洁,在问题或评论中没有进一步的问题。