首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >genericDAO的结构

genericDAO的结构
EN

Stack Overflow用户
提问于 2014-02-27 19:20:53
回答 2查看 74关注 0票数 2

这是一个一般的编程实践问题,如果不清楚,完全可以修改。我实现了一个customDao,而不是使用hibernate和其他orm工具。

看看它的get方法:

代码语言:javascript
复制
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的参数是最佳实践。

EN

回答 2

Stack Overflow用户

发布于 2014-02-27 19:39:06

您的代码最明显的缺陷是易受SQL注入的攻击。想象一下,如果有人调用它

代码语言:javascript
复制
customDao.list([parentid:"1; drop table student; --"])

生成的SQL将为

代码语言:javascript
复制
select * from student where parentid = 1; drop table student; --;

你不想这样,对吧?

此漏洞非常常见,以至于cartoons exist about it

一般来说,我建议不要重新发明轮子,除非你可以改进已经存在的轮子。在您的例子中,可能有更好的轮子,比如QueryDSL

票数 3
EN

Stack Overflow用户

发布于 2014-02-27 19:45:58

除了像@meriton指出的那样容易受到SQL注入的攻击外,这种方法可能太通用了。

假设您想查询一个关于雇员的表。您需要指定要查询的特定于数据库中employee表的参数。当查询完成时,您还需要从结果列表中提取数据。而不是将那些与员工相关的变量/代码分散在项目中,您可能会设置一些仅与通用dao交互的类来进行与员工相关的查询……在这种情况下,您实际上是在创建一个employee dao。因此,您最终将得到独立的、非通用的daos。

我建议使用已经建立的ORM,为应用程序中的每个模型创建一个指定的DAO,或者使用其他一些数据访问模式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22066946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档