- 浏览: 1052722 次
- 性别:
- 来自: 郑州
文章分类
- 全部博客 (605)
- 数据挖掘 (22)
- spring (40)
- 工具使用 (39)
- java (137)
- JavaScript (40)
- webwork (12)
- web (120)
- 资源 (7)
- SSH (5)
- oracle (20)
- J2ME (1)
- 环境配置 (37)
- 项目管理 (29)
- mysql (14)
- struts (4)
- 项目总结 (27)
- ibatis学习 (33)
- 学习计划 (2)
- 缓存 (7)
- 重构 (3)
- Android (1)
- jquery (12)
- UML (3)
- 用户体验 (4)
- 习惯 (7)
- sakai (1)
- urlrewrite (4)
- rss (5)
- C plus plus (5)
- 算法 (5)
- 海量数据处理 (7)
- office(word、excel) (1)
- 面试题 (3)
- solr (8)
- 大数据 (2)
最新评论
-
hujin19861102:
截图看不见,最后一个webwrok的配置看不见
Ext+Webwork+Json 实现分页表格查询效果 -
蜗牛笔:
弱弱的问一句,要是分出来的词在词典中没有,那么两部分的pos- ...
ICTCLAS 中科院分词系统 -
weipeng1986:
授人予鱼不如授人予鱼,我想问你的是你是怎么总结的。比如第四种情 ...
JAVA中字符串连接效率的测试 -
xiaoqiang2008:
执行两次的原因是什么,好像楼主没弄清楚啊!是不是在web.xm ...
关于Spring中用quartz定时器在定时到达时同时执行两次的问题 -
Kent_Mu:
...
ibatis-dynamic的用法
对于iBATIS一对多/多对多的问题,传统的办法是在一对多/多对多关联的属性上再做一次子查询,这个解决办法很简单易懂,但是有个缺点,会导致N+1 selects,导致查询的性能瓶颈,更好的解决办法是sql做一个表连接,然后主表的resultMap配置上加“groupBy='...'”属性,这样一次查询就搞定,避免了N+1问题,下面请看代码:
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
- "http://www.ibatis.com/dtd/sql-map-2.dtd">
- <sqlMap namespace="sys">
- <typeAlias alias="menu" type="com.cuishen.sqlmaptest.vo.Menu" />
- <resultMap id="sub-menu-map" class="menu">
- <result property="id" column="subid" />
- <result property="name" column="subname" />
- <result property="url" column="suburl" />
- <result property="layer" column="sublayer" />
- <result property="grade" column="subgrade" />
- <result property="position" column="subposition" />
- <result property="parentId" column="subparentid" />
- </resultMap>
- <resultMap id="menu-map" class="menu" groupBy="id">
- <result property="id" column="id" />
- <result property="name" column="name" />
- <result property="url" column="url" />
- <result property="layer" column="layer" />
- <result property="grade" column="grade" />
- <result property="position" column="position" />
- <result property="parentId" column="parentid" />
- <result property="subMenus" resultMap="sys.sub-menu-map" />
- </resultMap>
- <select id="getTopMenu" parameterClass="java.util.HashMap" resultMap="sys.menu-map">
- select
- t.id as id,t.name as name,t.url as url,t.layer as layer,t.grade as grade,t.position as position,
- t.parentid as parentid,s.id as subid,s.name as subname,s.url as suburl,s.layer as sublayer,
- s.grade as subgrade,s.position as subposition,s.parentid as subparentid
- from menu t left join menu s
- on t.id = s.parentid
- where t.layer=1 order by t.position, s.position
- </select>
- </sqlMap>
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd"> <sqlMap namespace="sys"> <typeAlias alias="menu" type="com.cuishen.sqlmaptest.vo.Menu" /> <resultMap id="sub-menu-map" class="menu"> <result property="id" column="subid" /> <result property="name" column="subname" /> <result property="url" column="suburl" /> <result property="layer" column="sublayer" /> <result property="grade" column="subgrade" /> <result property="position" column="subposition" /> <result property="parentId" column="subparentid" /> </resultMap> <resultMap id="menu-map" class="menu" groupBy="id"> <result property="id" column="id" /> <result property="name" column="name" /> <result property="url" column="url" /> <result property="layer" column="layer" /> <result property="grade" column="grade" /> <result property="position" column="position" /> <result property="parentId" column="parentid" /> <result property="subMenus" resultMap="sys.sub-menu-map" /> </resultMap> <select id="getTopMenu" parameterClass="java.util.HashMap" resultMap="sys.menu-map"> select t.id as id,t.name as name,t.url as url,t.layer as layer,t.grade as grade,t.position as position, t.parentid as parentid,s.id as subid,s.name as subname,s.url as suburl,s.layer as sublayer, s.grade as subgrade,s.position as subposition,s.parentid as subparentid from menu t left join menu s on t.id = s.parentid where t.layer=1 order by t.position, s.position </select> </sqlMap>
com.cuishen.sqlmaptest.vo.Menu如下:
- package com.cuishen.sqlmaptest.vo;
- import java.util.List;
- /**
- * POJO - 菜单
- * @author cuishen
- */
- public class Menu implements java.io.Serializable {
- private static final long serialVersionUID = 7172793340860021199L;
- private Long id;
- private String name;
- private String url;
- private Short layer;
- private Short grade;
- private Short position;
- private Long parentId;
- private List subMenus;
- public Menu() { }
- public Long getId() {
- return this.id;
- }
- public void setId(Long id) {
- this.id = id;
- }
- //...
- //getter、setter方法
- //...
- public List getSubMenus() {
- return subMenus;
- }
- public void setSubMenus(List subMenus) {
- this.subMenus = subMenus;
- }
- }
package com.cuishen.sqlmaptest.vo; import java.util.List; /** * POJO - 菜单 * @author cuishen */ public class Menu implements java.io.Serializable { private static final long serialVersionUID = 7172793340860021199L; private Long id; private String name; private String url; private Short layer; private Short grade; private Short position; private Long parentId; private List subMenus; public Menu() { } public Long getId() { return this.id; } public void setId(Long id) { this.id = id; } //... //getter、setter方法 //... public List getSubMenus() { return subMenus; } public void setSubMenus(List subMenus) { this.subMenus = subMenus; } }
测试类如下:
- package com.cuishen.sqlmaptest;
- import java.sql.SQLException;
- import java.util.List;
- import com.ibatis.sqlmap.client.SqlMapClient;
- import com.cuishen.sqlmaptest.vo.Menu;
- /**
- * iBATIS 1:N & M:N(N+1 selects)解决方案
- * @author cuishen
- */
- public class Test {
- public static void main(String args[]) throws SQLException {
- SqlMapClient sqlMapClient = SqlMapClientFactory.getSqlMapClient();
- List topMenus = sqlMapClient.queryForList("getTopMenu", null);
- for(int i = 0; i < topMenus.size(); i++) {
- Menu menu = (Menu)topMenus.get(i);
- List subMenus = (List)menu.getSubMenus();
- System.out.println("top menu name >> " + menu.getName());
- for(int j = 0; j < subMenus.size(); j++) {
- Menu subMenu = (Menu)subMenus.get(j);
- System.out.println(">> sub menu name >> " + subMenu.getName());
- }
- }
- }
- }
package com.cuishen.sqlmaptest; import java.sql.SQLException; import java.util.List; import com.ibatis.sqlmap.client.SqlMapClient; import com.cuishen.sqlmaptest.vo.Menu; /** * iBATIS 1:N & M:N(N+1 selects)解决方案 * @author cuishen */ public class Test { public static void main(String args[]) throws SQLException { SqlMapClient sqlMapClient = SqlMapClientFactory.getSqlMapClient(); List topMenus = sqlMapClient.queryForList("getTopMenu", null); for(int i = 0; i < topMenus.size(); i++) { Menu menu = (Menu)topMenus.get(i); List subMenus = (List)menu.getSubMenus(); System.out.println("top menu name >> " + menu.getName()); for(int j = 0; j < subMenus.size(); j++) { Menu subMenu = (Menu)subMenus.get(j); System.out.println(">> sub menu name >> " + subMenu.getName()); } } } }
是不是很简单,但是有三点需要注意:
1. 注意这个配置:<result property="subMenus" resultMap="sys.sub-menu-map" />,resultMap是sys.sub-menu-map,要加命名空间sys,而不是sub-menu-map,否则iBATIS可能会报错!
2. 一对多/多对多映射的集合属性subMenus必须用简单的getter/setter,不能在getter/setter里做其他处理,否则会导致iBATIS报错!!
3. 在iBATIS2.3.0.677上测试通过,更老旧的版本可能不支持该解决方案!!
从iBATIS3.0开始该解决方案的配置改为:
- <resultMap id="blogResult" type="Blog">
- <id property=”id” column="blog_id" />
- <result property="title" column="blog_title"/>
- <collection property="posts" ofType="Post">
- <id property="id" column="post_id"/>
- <result property="subject" column="post_subject"/>
- <result property="body" column="post_body"/>
- </collection>
- </resultMap>
发表评论
-
list in传参 与批量插入 批量更新
2017-04-01 10:48 818传入一个map的参数,map里有一个tenantIds的Lis ... -
fork/join框架
2017-03-09 11:03 501http://blog.csdn.net/ye1992/art ... -
protobuffer
2017-03-09 10:54 701http://blog.csdn.net/antgan/art ... -
整理上传代码容易忽略的注意事项
2013-08-31 11:28 1166每个公司都有自己的代码代码上传流程:如果打包发布的话,是不存 ... -
mysql版本升级引发的问题
2013-05-16 15:25 1658问题描述: 1. ibatis 中 mysql语 ... -
网站的记住密码功能设计
2013-02-27 19:09 1311http://greenyouyou.blog.163 ... -
大型网站架构演变之路
2013-02-27 19:08 1149http://www.cnblogs.com/ivanjack ... -
使用Filter统计Java(J2EE)的web程序http请求响应时间
2013-02-27 19:07 1392http://www.cnblogs.com/ivan ... -
java bean与xml相互转换
2013-02-06 10:27 2054最近在做的项目,在各个平台之间需要大量传输数据,且结构比较 ... -
java 反射
2013-01-14 18:21 834http://www.cnblogs.com/rollenh ... -
字符串替换
2012-12-17 11:17 1160高效的字符串模式替换实现效果如下 String str ... -
httpURLConnection获取网络数据:XML格式返回与Json格式返回
2012-12-15 16:57 149291.服务器端代码样例: public class ... -
利用Freemarker实现表到功能界面的一键生成
2012-11-22 18:03 1021利用Freemarker实现表到功能界面的一键生成 h ... -
ibatis in ##的问题
2012-11-02 13:25 856http://www.hake.cc/a/biancheng/ ... -
ibatis缓存强制刷新与命中率
2012-10-19 19:06 1395缓存强制刷新: // spring注入 private Sq ... -
eclipse 的一些设置
2012-08-16 22:06 17631. 控制台信息太多,程序跑完后只能保留最后的一部分之前的 ... -
jdk1.5 System.arraycopy与jdk1.6 中Arrays.copyOf()&Arrays.copyOfRange()
2012-08-16 21:56 3291在JDK1.5的类System类中有方法 ... -
Eclipse报Java heap space错误的解决方案
2012-08-16 16:43 12074当运行大数量的数据时: (1) 如果是java 应用程 ... -
求两个字符串的最大公共字符串
2012-08-10 20:41 1066http://blog.csdn.net/wangcj625/ ... -
ffmpeg 截取视频 播放中的图片
2012-06-19 09:14 1318http://www.cnblogs.com/live365w ...
相关推荐
在处理多对一或者一对多关系时,如果没有合理利用批处理或者连接查询,很容易产生“n+1”问题。当查询一个主记录及其相关的子记录时,如果没有一次性获取所有数据,而是在主记录循环中每次单独查询子记录,就会有n次...
下面将详细介绍几种解决iBATIS中的N+1选择问题的方法。 1. **批处理(Batch)查询**: 批处理查询允许我们一次性发送多个SQL语句到数据库,减少数据库连接次数。在iBATIS中,可以通过设置动态SQL来实现。例如,...
这个问题通常出现在一对多或者多对多的关联查询中,导致了大量的数据库交互,严重影响了应用的响应速度。 首先,让我们理解什么是N+1问题。假设我们有一个主表(例如,用户表)和一个从表(例如,订单表),每个...
#### ibatis批量Update解决方案 ibatis提供了一套完善的批量更新机制,可以有效地解决上述问题。下面详细介绍如何利用ibatis实现高效的批量更新: 1. **准备工作**: - 首先确保你的ibatis版本支持批量更新功能。...
10. **最佳实践**:如何有效地设计Mapper接口和XML文件,避免N+1查询,以及如何利用iBATIS进行性能优化。 学习iBATIS不仅需要理解上述知识点,还需要通过实际项目实践来巩固和深化理解。通过分析提供的源码,我们...
6.2.3 避免N+1查询问题 105 6.3 继承 107 6.4 其他用途 109 6.4.1 使用语句类型和DDL 109 6.4.2 处理超大型数据集 109 6.5 小结 115 第7章 事务 116 7.1 事务是什么 116 7.1.1 一个简单的银行转账示例 116 7.1.2 ...
- **避免N+1 Select(1:1)**:优化一对多关系的数据加载,减少查询次数。 - **延迟加载VS联合查询(1:1)**:选择合适的加载策略,提高性能。 - **复杂类型集合的属性**:支持多对多关系的数据加载。 - **避免N+1 ...
在实际开发中,遵循最佳实践可以提高性能和可维护性,如合理使用缓存、避免N+1查询、优化关联加载等。同时,理解SessionFactory和Session的作用以及何时使用Transaction也是关键。 综上,这个培训材料涵盖了...
在使用Hibernate时,应遵循一些最佳实践,如合理设计实体关系,避免N+1查询问题,使用缓存提高性能,以及适当地处理事务。 总之,Hibernate培训的目标是让学员能够熟练掌握O/R Mapping的概念,灵活运用Hibernate...
- **避免N+1查询列表**: 优化多对多关系的查询性能。 - **复合键或多个复杂参数属性**: 支持多个复合键或复杂属性的映射。 ##### 3.6 支持的参数映射和结果映射类型 - **基本数据类型**: 如Int32、String等。 - **...
12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托...
12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托...
12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托...
12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中...
12、写Hibernate的一对多和多对一双向关联的orm配置? 134 9、hibernate的inverse属性的作用? 134 13、在DAO中如何体现DAO设计模式? 134 14、spring+Hibernate中委托方案怎么配置? 134 15、spring+Hibernate中委托...
12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托...
面试中可能会询问如何通过MyBatis进行SQL优化,包括使用合适的索引、避免N+1查询问题、合理使用缓存以及利用MyBatis提供的内置方法如foreach进行批量处理。 6. MyBatis与其他框架整合:MyBatis是一个轻量级的框架,...