- 浏览: 536516 次
- 性别:
- 来自: 长沙
文章分类
最新评论
-
wocan23:
镜像是不是就是集群里面的从服务器啊
高并发处理方案 -
chenyi0834:
net.sf.ehcache.Cache ehCache=Ap ...
spring+ehCache简单整合使用示例 -
fsh430623:
是一个获取spring容器bean的工具类
spring+ehCache简单整合使用示例 -
hxc985815621:
ApplicationContextUtils是什么?
spring+ehCache简单整合使用示例 -
peixingchen:
你好,楼主,Action里面的CompanyApplyDTO类 ...
jquery+struts1.3.8的ajax上传文件
对于iBATIS一对多/多对多的问题,传统的办法是在一对多/多对多关联的属性上再做一次子查询,这个解决办法很简单易懂,但是有个缺点,会导致N+1 selects,导致查询的性能瓶颈,更好的解决办法是sql做一个表连接,然后主表的resultMap配置上加“groupBy='...'”属性,这样一次查询就搞定,避免了N+1问题,下面请看代码:
Xml代码
<?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如下:
Java代码
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;
}
}
测试类如下:
Java代码
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上测试通过,更老旧的版本可能不支持该解决方案!!
Xml代码
<?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如下:
Java代码
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;
}
}
测试类如下:
Java代码
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上测试通过,更老旧的版本可能不支持该解决方案!!
发表评论
-
springjdbc的对象映射与命名参数问题
2016-01-07 09:24 1699springjdbctemplate ... -
mappingDirectoryLocations/mappingJarLocations/mappingResources/mappingLocations的
2015-10-20 17:38 2442于spring对hibernate配置文件hibernate ... -
springmvc服务端数据验证的自定义验证与扩展使用
2014-02-20 11:37 1978... -
springmvc服务端验证
2014-02-20 11:26 4536... -
spring+ehCache简单整合使用示例
2013-11-08 10:31 19624下面介绍一下简单使用的配置过程:ehcache.jar及spr ... -
springmvc拦截器使用小结
2013-09-28 11:59 1592springmvc拦截器使用小结 想做个session拦截验 ... -
mybaits级联查询
2013-09-22 11:03 1004mybaits级联查询 1对1的级联或关联查询如下:用ass ... -
access is denied 可能的原因分析
2013-07-30 09:51 1689access is denied 可能的原因分析 用 ap ... -
spring3配置文件中的context:property-placeholder/元素
2013-07-29 15:42 1233spring3配置文件中的context:property-p ... -
mybatis批量添加数据与主键处理:
2013-07-22 09:38 20026mybatis批量添加数据处理: 主要在于xml文件中 ... -
MyBatis动态sql问题
2012-08-03 11:49 17900接使用JDBC一个非常普遍的问题就是动态SQL。使用参数值、参 ... -
hibernate如何执行本地sql
2012-02-10 13:30 1613因本人记性不好,所以在此做个记录,以便日后查找。呵呵 执行 ... -
spring quartz 整合示例
2011-11-29 16:33 1415很简单,导入jar包我就不说了,百度一下,多的是。 附件是另 ... -
spring aop简单应用示例
2011-11-01 17:46 1537spring的 aop功能强大,这里是一个简单示例: 监控对特 ... -
There is no ID/IDREF binding for IDREF
2011-07-21 15:10 2963<bean id="mySingProduct ... -
query specified join fetching, but the owner of the fetched association was not
2011-07-20 11:11 3422from TSignpartDTO Z left join f ... -
could not initialize proxy - no Session 问题处理
2011-07-15 18:59 1827在做关联查询后,在页面列表显示出现could not init ... -
hibernate子表数据关联修改
2011-07-13 15:07 1829String hql = "update TProj ... -
spring的JdbcDaoSupport的一些用法示例
2011-03-04 16:20 1426一些API的示例用法,希望有所帮助。看附件吧。大家 -
普通java bean中获取Spring的ApplicationContext
2010-11-06 10:57 5107很多情况下,我们需要在普通javabean中获取spring ...
相关推荐
ibatis n+1选择问题 的几种解决方案, 网上收集的。
iBATIS 级联iBATIS 级联iBATIS 级联
关于Spring.net + iBatis.net + asp.net MVC 整合的文档,值!
简单易入手,使用mysql数据库进行数据管理
NULL 博文链接:https://xiaoye4188.iteye.com/blog/871050
打包下载 ibatis驱动+Mysql驱动+SQL驱动
ibatis2+spring
struts2+spring+ibatis+mysql AOP日志管理,异常捕获 tomcat6.0+jdk1.6
使用ibatis+spring+struts2 做的开发例子 帮助大家一起学习ibatis的整合
IBatis源码+xsd+帮助,不错的一种OR Mapping框架!
struts2+spring+ibatis+oracle+分页搜索+上传附件实例!完整版!
开发环境说明 ...本示例完整地结合Struts2+Spring2+iBatis2+MySQL5,演示了一个用户表的增、删、改、查。 想完整学习Struts2+Spring+iBatis的同仁,可以在这个例子中学习或模仿最基本也是最核心的技术要点。
ibatis2.0+sqlserver2005环境搭建
velocity+ibatis+mysql+exlipse实例 velocity+ibatis+mysql+exlipse实例 velocity+ibatis+mysql+exlipse实例 velocity+ibatis+mysql+exlipse实例 velocity+ibatis+mysql+exlipse实例
最新版本 IBatis.net+Castal_DLL 整合集合,测试通过可用,基于IBatis.net框架+Castal容器的框架DLL Castle.Core.dll 2.5.2 核心DLL Castle.Facilities.AutoTx.dll 2.5.1自动事务 Castle.Services.Transaction.dll ...
compass+ibatis+spring+struts2整合开发compass+ibatis+spring+struts2整合开发compass+ibatis+spring+struts2整合开发compass+ibatis+spring+struts2整合开发
maven+springmvc+spring+ibatis+velocity+mysql
IBATIS 配置+简单案列 自己测试成功并做的做的文档
前言:本讲是在【第四讲:WEB项目-集成Flex3+BlazeDS3.2+Spring2.5.6+iBatis2.3.4】的基础上添加iBatis,此次集成其实质是Spring与Struts2的整合而已 目标:WEB项目-集成Flex3+BlazeDS3.2+Spring2.5.6+iBatis2.3.4+...
ibatis+Spring+struts2整合实例