- 浏览: 331121 次
- 性别:
- 来自: 火星
文章分类
最新评论
-
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 1381官方网站: http://1978th.net/toky ... -
事务隔离初探
2010-05-04 14:31 3881==========以下文章摘自 http://www.blo ... -
Ibatis 再议动态查询语句
2009-09-21 22:18 3137一,ibatis 的<isNotNull>标签。 ... -
IBATIS Iterate用法 初探
2009-09-16 00:32 8260IBATIS里的iterate标签提供 ... -
IBATIS batch用法探究
2009-09-14 22:06 9451有的时候需要一次性执行大批量的SQL,而不是执行一条SQL ... -
ibatis nullvalue 探究
2009-09-13 17:36 4511在我们配置resultMap中有的时候需要配置 nullVal ... -
XML 学习,主要是DTD学习和IBATIS 的CDATA具体什么时候用
2009-09-08 23:45 3031dtd 学习这个够简短精辟了,我就不写了:http://www ... -
ibatis 缓存机制初探
2009-08-12 00:13 8791一,IBATIS 缓存机制使用 1,sqlMapC ... -
IBATIS typeHandler 探究
2009-08-11 00:34 3733我们可以在IBATIS中加入 ... -
IBATIS 动态查询 学习
2009-08-09 19:54 2481BATIS动态查询的实现主要是在iBATIS中使用安全的 ... -
jdbc 连接mysql
2009-08-09 13:40 1285JDBC 连接 MySQL 加载及注册 J ... -
回顾JDBC知识 之 jdbc使用
2009-08-08 14:17 1162JDK1.6中带的是 jdbc4.0版本的。据说有些新特性。 ...
相关推荐
Python基于yolo的健身姿势检测与姿态矫正建议系统源代码+使用说明 model:保存模型参数 config.yaml:配置文件 resource:输入文件夹,具有固定的目录结构(动作-视角-标准/错误点) output:输出文件夹,保持和resource相同的目录结构 main.py:实现resource2output方法,将resource中的资源全部提取数据并输出(csv格式)到output的相应位置 tasks:任务文件夹,对于不同的健身任务,分别实现标准性判别方法 keypoint.py:是对yolo模型返回的节点进行对象封装,其中的Keypoint对象封装了返回结果(是一个数组)中各关节位置对应数组中的位置,这样就不需要通过下标直接获取节点,而是通过例如get("l_elbow")的实例方法获取节点 pull_up.py:为具体健身任务实现标准性判别方法,这里是对引体向上的处理 task_processor.py由于main.py是在对resource文件夹中所有资源进行处理,不同的方法将对应不同的处理函数,task_processor.py中实现了TaskProces
精确的作物类型图对于监测种植模式、可持续利用现有自然资源和估算收成至关重要。人工数字化和标注--绘制作物类型图的常用方法--大多费时、费钱,甚至容易出现人为错误。近来,机器学习算法已发展成为利用卫星图像对作物品种进行分类的经济有效的替代方法。为应对最新进展,本研究将采用机器学习算法,利用哨兵-2 图像对孟加拉国西北部(拉杰沙希县戈达加里乡)的 6 种作物类型进行分类。将研究四种机器学习算法(随机森林、人工神经网络、KNN 和支持向量机),以准确绘制作物类型图。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
资源说明: 为提高弱纹理图像关键目标点的检测识别能力,提出基干深度学习的弱纹理图像关键目标点识别定位方法;构建低光照强度弱纹理图像关键目标点的拓扑特征分布模型,采用透射率作为检测系数,结合亮通道的先验知识,建立像素大数据分布集................................ pdf文件。请使用支持pdf阅读的工具打开.
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
Matlab领域上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
<项目介绍> 编译原理实战之表达式计算器 -------- 不懂运行,下载完可以私聊问,可远程教学 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
毕业设计&课设-用于 Spring Boot 的开源渗透框架及高危漏洞利用工具 1、该资源内项目代码都经过严格测试运行成功才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
Matlab代码
基于jquery的图表框架
基于matlab GUI界面的疲劳检测系统源码+文档说明(毕业设计和课程设计都适用),含有代码注释,新手也可看懂,个人手打98分项目,导师非常认可的高分项目,毕业设计、期末大作业和课程设计高分必看,下载下来,简单部署,就可以使用。该项目可以直接作为毕设、期末大作业使用,代码都在里面,系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值,项目都经过严格调试,确保可以运行! 基于matlab GUI界面的疲劳检测系统源码+文档说明(毕业设计和课程设计都适用)基于matlab GUI界面的疲劳检测系统源码+文档说明(毕业设计和课程设计都适用)基于matlab GUI界面的疲劳检测系统源码+文档说明(毕业设计和课程设计都适用)基于matlab GUI界面的疲劳检测系统源码+文档说明(毕业设计和课程设计都适用)基于matlab GUI界面的疲劳检测系统源码+文档说明(毕业设计和课程设计都适用)基于matlab GUI界面的疲劳检测系统源码+文档说明(毕业设计和课程设计都适用)基于matlab GUI界面的疲劳检测系统源码+文档说明(毕业设计和课程设计都适用)基于matl
计算机图形学之动画和模拟算法:Procedural Animation:碰撞检测与响应.docx
机器学习 Adversarial Examples and Adversarial Training Overview • What are adversarial examples? • Why do they happen? • How can they be used to compromise machine learning systems? • What are the defenses? • How to use adversarial examples to improve machine learning, even when there is no adversary
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
网络安全解读网络安全政策