论坛首页 Java企业应用论坛

用了mybatis,我认为不需要再要写DAO

浏览 66447 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (1)
作者 正文
   发表时间:2011-06-10   最后修改:2011-06-10
引用
我是说不需要写DAO,不是说不需要DAO层.

不需要写dao? 那你认为 你写的 mapper 难道不是 DAO(数据访问对象) 啊?

之所以叫它是DAO,不是因为他命名后缀有 DAO 他就是DAO。
0 请登录后投票
   发表时间:2011-06-10   最后修改:2011-06-10
squll369 写道
其实mapping层就是原来的dao层。
这本来就是我的观点,没有说后缀叫DAO,就是DAO.我们2个观点一致呀,可能题目有点歧义,应该叫可以省去编写DAO的实现
0 请登录后投票
   发表时间:2011-06-10  
squll369 写道
squll369 写道
其实mapping层就是原来的dao层。
这本来就是我的观点,没有说后缀叫DAO,就是DAO.我们2个观点一致呀

OK~ 
0 请登录后投票
   发表时间:2011-06-10  
denger 写道
@star022
1. 你这种方页方式应该是只适用于非 Mapper Interface 方式吧~   Mapper Interface 中是没有任何实现...  要达到这种效果只能使用拦截器器对 interface 中的 method 进行拦截了`

2.
引用
sBuilder.append("select * from (").append(sql).append(" ) limit ? , ?");

请问一下你是不是将 xml 中配置的 sql 连接在这里面了? 比如  xml 的 sql是  select * from members
而最终生成的是:
select * from (select * from members) limit 1, 10
是不是?如果是的话那问题就来了..


sql 连接在这里面了?
你是指jdbc conn?
sqlmap配置,就是原生的ibatis配置,没有什么特别的,与jdbc conn没有任何关系;
在分页配上,仅仅配置你需要做分页的sql语句;
真正做分页的时候,先“截获”需要分页的语句,用SqlProcessor做分页包装而已;

0 请登录后投票
   发表时间:2011-06-10  
star022 写道
denger 写道
@star022
1. 你这种方页方式应该是只适用于非 Mapper Interface 方式吧~   Mapper Interface 中是没有任何实现...  要达到这种效果只能使用拦截器器对 interface 中的 method 进行拦截了`

2.
引用
sBuilder.append("select * from (").append(sql).append(" ) limit ? , ?");

请问一下你是不是将 xml 中配置的 sql 连接在这里面了? 比如  xml 的 sql是  select * from members
而最终生成的是:
select * from (select * from members) limit 1, 10
是不是?如果是的话那问题就来了..


sql 连接在这里面了?
你是指jdbc conn?
sqlmap配置,就是原生的ibatis配置,没有什么特别的,与jdbc conn没有任何关系;
在分页配上,仅仅配置你需要做分页的sql语句;
真正做分页的时候,先“截获”需要分页的语句,用SqlProcessor做分页包装而已;


嗯,明白。
那是不是xml 中的SQL如果是: select * from members
而包装后最终生成分页的SQL是不是:
select * from (select * from members) limit 1, 10
0 请登录后投票
   发表时间:2011-06-10  
denger 写道
star022 写道
denger 写道
@star022
1. 你这种方页方式应该是只适用于非 Mapper Interface 方式吧~   Mapper Interface 中是没有任何实现...  要达到这种效果只能使用拦截器器对 interface 中的 method 进行拦截了`

2.
引用
sBuilder.append("select * from (").append(sql).append(" ) limit ? , ?");

请问一下你是不是将 xml 中配置的 sql 连接在这里面了? 比如  xml 的 sql是  select * from members
而最终生成的是:
select * from (select * from members) limit 1, 10
是不是?如果是的话那问题就来了..


sql 连接在这里面了?
你是指jdbc conn?
sqlmap配置,就是原生的ibatis配置,没有什么特别的,与jdbc conn没有任何关系;
在分页配上,仅仅配置你需要做分页的sql语句;
真正做分页的时候,先“截获”需要分页的语句,用SqlProcessor做分页包装而已;


嗯,明白。
那是不是xml 中的SQL如果是: select * from members
而包装后最终生成分页的SQL是不是:
select * from (select * from members) limit 1, 10


是的,这样做就比较简洁些,
什么时候需要做分页语句包装,由分页方法入口触发,整个原理就是这样~~
0 请登录后投票
   发表时间:2011-06-10   最后修改:2011-06-10
star022 写道
denger 写道
star022 写道
denger 写道
@star022
1. 你这种方页方式应该是只适用于非 Mapper Interface 方式吧~   Mapper Interface 中是没有任何实现...  要达到这种效果只能使用拦截器器对 interface 中的 method 进行拦截了`

2.
引用
sBuilder.append("select * from (").append(sql).append(" ) limit ? , ?");

请问一下你是不是将 xml 中配置的 sql 连接在这里面了? 比如  xml 的 sql是  select * from members
而最终生成的是:
select * from (select * from members) limit 1, 10
是不是?如果是的话那问题就来了..


sql 连接在这里面了?
你是指jdbc conn?
sqlmap配置,就是原生的ibatis配置,没有什么特别的,与jdbc conn没有任何关系;
在分页配上,仅仅配置你需要做分页的sql语句;
真正做分页的时候,先“截获”需要分页的语句,用SqlProcessor做分页包装而已;


嗯,明白。
那是不是xml 中的SQL如果是: select * from members
而包装后最终生成分页的SQL是不是:
select * from (select * from members) limit 1, 10


是的,这样做就比较简洁些,
什么时候需要做分页语句包装,由分页方法入口触发,整个原理就是这样~~

好,那不知道你考虑过以下问题:
sBuilder.append("select * from (").append(sql).append(" ) limit ? , ?");

1. 首先这条 sql select * from (select * from members) limit 1, 10 ,在mysql中无法执行,因为没有加别名.   select * from (select * from members) as tab limit 1, 10


2. 就是执行效率的问题了。我刚才在我的库中试了一下。使用
select * from synsource limit 1, 10
用时0.01秒,而使用
select * from (select * from synsource) as tab limit 1, 10
10 rows in set (46.77 sec)
数据大概20多万左右,一个八个表相连的视图。目前还没有具体去分析 sql 的执行计划,只是看到的情况就是这样。估计 mysql 执行了两次 select


0 请登录后投票
   发表时间:2011-06-10   最后修改:2011-06-10
select * from synsource limit 1, 10
用时0.01秒,而使用
select * from (select * from synsource) as tab limit 1, 10
10 rows in set (46.77 sec)
数据大概20多万左右,一个八个表相连的视图。目前还没有具体去分析 sql 的执行计划,只是看到的情况就是这样。估计 mysql 执行了两次 select

这个问题你到提醒我了,多谢你的提醒;
对于oracle,应该影响不太大,本身oracle的分页,需要再包装;
多包装一层select,确实对sql执行效率有所影响,针对mysql,应该不需要再包装一层;
如果是MySQL数据库,直接如下处理是不是性能会好些~~~
public class MySqlSqlProcessor implements SqlProcessor {
    // select * from Member limit 1000, 100
    public String pageSqlProcess(String sql) {
        StringBuilder sBuilder = new StringBuilder();
        //sBuilder.append("select * from (").append(sql).append(" ) limit ? , ?");影响了执行效率
        sBuilder.append(sql).append(" limit ? , ?");//更简单,效率更高

        return sBuilder.toString();
    }
}
0 请登录后投票
   发表时间:2011-06-10  
star022 写道
select * from synsource limit 1, 10
用时0.01秒,而使用
select * from (select * from synsource) as tab limit 1, 10
10 rows in set (46.77 sec)
数据大概20多万左右,一个八个表相连的视图。目前还没有具体去分析 sql 的执行计划,只是看到的情况就是这样。估计 mysql 执行了两次 select

这个问题你到提醒我了,多谢你的提醒;
对于oracle,应该影响不太大,本身oracle的分页,需要再包装;
多包装一层select,确实对sql执行效率有所影响,针对mysql,应该不需要再包装一层;
如果是MySQL数据库,直接如下处理是不是性能会好些~~~
public class MySqlSqlProcessor implements SqlProcessor {
    // select * from Member limit 1000, 100
    public String pageSqlProcess(String sql) {
        StringBuilder sBuilder = new StringBuilder();
        //sBuilder.append("select * from (").append(sql).append(" ) limit ? , ?");影响了执行效率
        sBuilder.append(sql).append(" limit ? , ?");//更简单,效率更高

        return sBuilder.toString();
    }
}

呵呵,是的。不过再建议 replace 一下 sql 未尾的 ; 号, 因为经常有人喜欢在xml  中 sql 后面写分号。
0 请登录后投票
   发表时间:2011-06-10  
denger 写道
star022 写道
select * from synsource limit 1, 10
用时0.01秒,而使用
select * from (select * from synsource) as tab limit 1, 10
10 rows in set (46.77 sec)
数据大概20多万左右,一个八个表相连的视图。目前还没有具体去分析 sql 的执行计划,只是看到的情况就是这样。估计 mysql 执行了两次 select

这个问题你到提醒我了,多谢你的提醒;
对于oracle,应该影响不太大,本身oracle的分页,需要再包装;
多包装一层select,确实对sql执行效率有所影响,针对mysql,应该不需要再包装一层;
如果是MySQL数据库,直接如下处理是不是性能会好些~~~
public class MySqlSqlProcessor implements SqlProcessor {
    // select * from Member limit 1000, 100
    public String pageSqlProcess(String sql) {
        StringBuilder sBuilder = new StringBuilder();
        //sBuilder.append("select * from (").append(sql).append(" ) limit ? , ?");影响了执行效率
        sBuilder.append(sql).append(" limit ? , ?");//更简单,效率更高

        return sBuilder.toString();
    }
}

呵呵,是的。不过再建议 replace 一下 sql 未尾的 ; 号, 因为经常有人喜欢在xml  中 sql 后面写分号。


哈哈~~~ 是的~~~这个检查与处理是需要的~~
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics