- 浏览: 327255 次
- 性别:
- 来自: 火星
文章分类
最新评论
-
zhanggang807:
这个ibatis 还真是不好用啊。楼主解决了我看文档也没解决的 ...
IBATIS Iterate用法 初探 -
lijunwyf41:
不错 SqlMapClientTemplate sqlMa ...
IBATIS batch用法探究 -
huyuancai1010:
.
struts2 常量配置详解 -
jd2bs:
2楼肯定是people.xsd格式错了
spring schema 扩展 -
xiaokang1582830:
遇到同样的问题,请教如何解决的java.io.NotSeria ...
ibatis 延迟加载 探究
ibatis延迟加载的含义(可能我讲不太清楚,具体看下面代码就明白什么含义了):
在牵涉到1:N关系,或 N:N关系的时候查询,那么会需要查询多张表,但并不是所有情况都会需要查询另一张相关的表。
采用延迟加载可以在真正使用的时候去查询另一张相关表。提高性能。
我用的是maven构建我的测试代码,其中pom文件配置如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.yajun</groupId> <artifactId>IbatisDemo</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>IbatisDemo</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.apache.ibatis</groupId> <artifactId>ibatis-sqlmap</artifactId> <version>2.3.4.726</version> <scope>compile</scope> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.4</version> <scope>provide</scope> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>1.0</version> <scope>complie</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.9</version> <scope>provide</scope> </dependency> </dependencies> </project>
先把我遇到的问题抛下出来,大家在用的时候也注意下吧,不知道是不是我个人的问题:
第一个问题:
网上搜罗了一圈找到这个:http://issues.apache.org/jira/browse/IBATIS-529
是否是个BUG?
cacheModelsEnabled="true" 与 lazyLoadingEnabled="true" 相冲突?
如果启用延迟加载,并且启用 cacheModelsEnabled="true",那么会报如下错误
Caused by: java.io.NotSerializableException: com.ibatis.sqlmap.engine.mapping.result.loader.LazyResultLoader
第二个问题:
lazyLoadingEnabled="true"
enhancementEnabled="true" 这二项在<settings/>中默认为true,如果没有在config.xml中没有出现<settings/>,就当做false来处理。
enhancementEnabled="true"时要在项目中 导入cglib的jar。
如果enhancementEnabled="false",lazyLoadingEnabled="true",延迟加载只对某个属性为集合生效。
如果属性是个类,则不会延迟加载。
ibatis的其它功能还须其它jar,继续摸索中。
========================================================================
下面开始我的测试。
第一步,构建我的测试代码
建立DO类 BabyDO和AddressDO,其中 baby 的id 和address 的id是相关联的:
package com.yajun.dataobject; import java.io.Serializable; import java.util.Date; import java.util.List; import org.apache.commons.lang.time.DateFormatUtils; import com.yajun.enumdemo.SexEnum; /** * Baby DO类 * * @author yajun * */ public class BabyDO implements Serializable { private static final long serialVersionUID = -579987226803641422L; private int id; private String name; // 姓名 private SexEnum sex; // 性别 private Date birthday; // 生日 private String hobby; // 喜好 private int age; // 年龄 注意这里是原生类型 private List<AddressDO> address; // 地址复杂类型 // 一堆get set 方法 public List<AddressDO> getAddress() { return address; } public void setAddress(List<AddressDO> address) { this.address = address; } @Override public String toString() { String s = "id :" + id + "\t" + "name :" + name + "\t" + "\t" + "birthday:" + DateFormatUtils.format(birthday, "yyyy-MM-dd") + "\t" + "hobby:" + hobby; if (address != null) { s = address.toString(); } return s; } }
package com.yajun.dataobject; import java.io.Serializable; /** * 地址类 * * @author yajun * */ public class AddressDO implements Serializable { private static final long serialVersionUID = -7544474673567062502L; private Integer id; // id 与 baby的id关联 private String address; // 地址 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
第二步,配置文件
baby.xml中重要配置
<resultMap id="baby-Result" class="baby"> <result property="id" column="id" jdbcType="Integer" javaType="integer" /> <result property="name" column="name" jdbcType="VARCHAR" javaType="string" /> <result property="sex" column="sex" jdbcType="VARCHAR" javaType="com.yajun.enumdemo.SexEnum" typeHandler="com.yajun.typehandler.SexEnumTypeHandlerCallBack" /> <result property="birthday" column="birthday" jdbcType="DATE" javaType="date" /> <result property="hobby" column="hobby" jdbcType="VARCHAR" javaType="string" /> <result property="age" column="age" jdbcType="INTEGER" javaType="int" nullValue="0" /> <result property="address" select="getAddressById" column="id" /> </resultMap> <select id="getBabyByParams" resultMap="baby-Result" cacheModel="baby-cache"> select * from Baby <dynamic prepend="where"> <isPropertyAvailable property="name" prepend="and"> name = #name# </isPropertyAvailable> <isPropertyAvailable property="sex" prepend="and"> sex = #sex,jdbcType=VARCHAR,javaType=com.yajun.enumdemo.SexEnum# </isPropertyAvailable> <isPropertyAvailable property="BirthdayBondStart" prepend="and"> <![CDATA[ birthday >= cast(#BirthdayBondStart# as datetime) ]]> </isPropertyAvailable> <isPropertyAvailable property="BirthdayBondEnd" prepend="and"> <![CDATA[ birthday <= cast(#BirthdayBondEnd# as datetime) ]]> </isPropertyAvailable> <isPropertyAvailable property="hobby" prepend="and"> hobby like #hobby#||'%' </isPropertyAvailable> </dynamic> </select>
address.xml中重要配置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd"> <sqlMap namespace="babyStore"> <typeAlias alias="address" type="com.yajun.dataobject.AddressDO" /> <resultMap id="address-Result" class="address"> <result property="id" column="id" jdbcType="INTEGER" javaType="integer"/> <result property="address" column="address" jdbcType="VARCHAR" javaType="string" /> </resultMap> <select id="getAddressById" resultMap="address-Result"> select * from address where id = #id# </select> </sqlMap>
sqlMapConfig.xml中重要配置
<settings lazyLoadingEnabled="true" cacheModelsEnabled="true"></settings>
第三步,建立测试类:
package com.yajun; import java.sql.SQLException; import java.util.HashMap; import java.util.List; import java.util.Map; import com.yajun.dataobject.BabyDO; import com.yajun.impl.BabyDAOImpl; /** * 专门测试延迟加载的 * * @author yajun * */ public class LazyLoadTest { private BabyDAOImpl babyDAO = new BabyDAOImpl(); public static void main(String[] args) throws SQLException { LazyLoadTest test = new LazyLoadTest(); // System.out.println(test.addressDAO.query(9)); Map<String, Object> params = new HashMap<String, Object>(); params.put("name", "吴亚军"); List<BabyDO> list = test.babyDAO.testBabyLazyLoad(params); BabyDO baby = list.get(0); System.out.println(baby.getId()); System.out.println(baby.getHobby()); System.out.println(baby.getAge()); System.out.println(baby.getAddress()); } }
BabyDAOImpl 中重要代码
/** * 测试延迟加载的 * * @param params * @return * @throws SQLException */ public List<BabyDO> testBabyLazyLoad(Map params) throws SQLException { return client.queryForList("getBabyByParams", params); }
第四步,调试可得当执行到
System.out.println(baby.getAddress);
这句话的时候并没有地址,地址那个属性是个被代理过的类,当真正去取address的时候才把这个类查出来。
那么延迟加载和连接查询,到底选用哪一个就要看使用者平衡了:
延迟加载 |
Join |
如果要加载大量的数据,它们不会马上用到,延迟加载会比较合适。 |
数据量较小或者数据马上就会用到, Join方法比较合适。 |
我觉得还有一条很重要的原则,那就是永远只加载必需的数据 。
评论
发表评论
-
Tokyo Tyrant 安装
2010-07-30 14:55 1334官方网站: http://1978th.net/toky ... -
事务隔离初探
2010-05-04 14:31 3844==========以下文章摘自 http://www.blo ... -
Ibatis 再议动态查询语句
2009-09-21 22:18 3099一,ibatis 的<isNotNull>标签。 ... -
IBATIS Iterate用法 初探
2009-09-16 00:32 8210IBATIS里的iterate标签提供 ... -
IBATIS batch用法探究
2009-09-14 22:06 9404有的时候需要一次性执行大批量的SQL,而不是执行一条SQL ... -
ibatis nullvalue 探究
2009-09-13 17:36 4455在我们配置resultMap中有的时候需要配置 nullVal ... -
XML 学习,主要是DTD学习和IBATIS 的CDATA具体什么时候用
2009-09-08 23:45 2983dtd 学习这个够简短精辟了,我就不写了:http://www ... -
ibatis 缓存机制初探
2009-08-12 00:13 8748一,IBATIS 缓存机制使用 1,sqlMapC ... -
IBATIS typeHandler 探究
2009-08-11 00:34 3689我们可以在IBATIS中加入 ... -
IBATIS 动态查询 学习
2009-08-09 19:54 2438BATIS动态查询的实现主要是在iBATIS中使用安全的 ... -
jdbc 连接mysql
2009-08-09 13:40 1251JDBC 连接 MySQL 加载及注册 J ... -
回顾JDBC知识 之 jdbc使用
2009-08-08 14:17 1121JDK1.6中带的是 jdbc4.0版本的。据说有些新特性。 ...
相关推荐
实现ibatis手动控制加载sqlmap文件,终于不用重启应用了
将代码更新到src目录下;即可!对应的ibatis的版本是2.3.4;建议使用同版本测试。 如有改动,请sqlmap的xml文件格式化后保存,这样以便组件发现修改时间不同而重新加载。
ibatis学习 ibatis总结 ibatis ibatis ibatis
iBATIS SQLMap
ibatis资料ibatis资料ibatis资料ibatis资料ibatis资料ibatis资料ibatis资料ibatis资料ibatis资料
ibatis demo,ibatis例子,ibatis示例
iBATIS 级联iBATIS 级联iBATIS 级联
ibatis的原码 ibatis源码 ibatis源码 ibatis源码
ibatis
Ibatis3,手册,Ibatis3手册,Ibatis3使用手册,Ibatis3参考手册
ibatis代码自动生成,ibatis代码自动生成,ibatis代码自动生成,ibatis代码自动生成
ibatis api,ibatis文档,ibatis说明文档
ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南ibatis2指南
ibatis教程,ibatis帮助文档,ibatis学习入门
简单的Ibatis入门例子,让你踏入Ibatis大门
Spring与iBATIS的集成 iBATIS似乎已远离众说纷纭的OR框架之列,通常人们对非常流行的Hibernate情有独钟。但正如Spring A Developer's Notebook作者Bruce Tate 和Justin Gehtland所说的那样,与其他的OR框架相比...
ibatis 乱码解决 ibatis乱码 gbk iso_8859_1 乱码
iBatis文档\ibatis.doc
《iBATIS实战》是讲述iBATIS框架的权威著作。书中既详实地介绍了iBATIS的设计理念和基础知识,也讨论了动态SQL、高速缓存、DAD框架等高级主题,还讲解了iBATIS在实际开发中的应用。《iBATIS实战》的最后给出了一个...
ibatis入门与ibatis迭代的用法