精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2011-06-10
最后修改:2011-06-10
引用 我是说不需要写DAO,不是说不需要DAO层.
不需要写dao? 那你认为 你写的 mapper 难道不是 DAO(数据访问对象) 啊? 之所以叫它是DAO,不是因为他命名后缀有 DAO 他就是DAO。 |
|
返回顶楼 | |
发表时间:2011-06-10
最后修改:2011-06-10
squll369 写道 其实mapping层就是原来的dao层。 这本来就是我的观点,没有说后缀叫DAO,就是DAO.我们2个观点一致呀,可能题目有点歧义,应该叫可以省去编写DAO的实现
|
|
返回顶楼 | |
发表时间:2011-06-10
squll369 写道 squll369 写道 其实mapping层就是原来的dao层。 这本来就是我的观点,没有说后缀叫DAO,就是DAO.我们2个观点一致呀OK~ |
|
返回顶楼 | |
发表时间: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做分页包装而已; |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间: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 是的,这样做就比较简洁些, 什么时候需要做分页语句包装,由分页方法入口触发,整个原理就是这样~~ |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间: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(); } } |
|
返回顶楼 | |
发表时间: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 后面写分号。 |
|
返回顶楼 | |
发表时间: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 后面写分号。 哈哈~~~ 是的~~~这个检查与处理是需要的~~ |
|
返回顶楼 | |