关于mybatis延迟加载的问题

问题描述

我做了一个mybatis的demo里面有两个类:user address,user中存放着一个address,而在数据库中user表中有一个addressid的字段,用于关联address表。public class User {private int id;private String name;private String password;private int age;private Address address;//get set方法}public class Address {private int addid;private String addname;private int zipcode; //get set方法}mybatis配置文件<configuration><!-- 延迟加载设置 --><settings><setting name="lazyLoadingEnabled" value="true"/></settings> <!-- 别名 --><typeAliases><typeAlias type="com.qshun.model.User" alias="user"/><typeAlias type="com.qshun.model.Address" alias="address"/></typeAliases><!-- 环境参数(数据库连接) --><environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost/ibatis" /> <property name="username" value="root" /> <property name="password" value="root" /> </dataSource> </environment> </environments> <!-- 映射文件 --> <mappers> <mapper resource="com/qshun/model/AddressMapper.xml"/> <mapper resource="com/qshun/model/UserMapper.xml"/> </mappers> </configuration>usermapper的实体映射文件<mapper namespace="com.qshun.mapper.UserMapper"><resultMap type="user" id="UserResultMap"><result property="id" column="uid" /><result property="name" column="uname" /><result property="password" column="upassword" /><result property="age" column="uage" /><association property="address" column="addressid" select="getAddressById" resultMap="AddressResultMap"></association></resultMap><resultMap id="AddressResultMap" type="address"> <result property="addid" column="id"/><result property="addname" column="addressname"/><result property="zipcode" column="zipcode"/> </resultMap> <select id="getUserById" resultMap="UserResultMap" parameterType="int">select uid,uname,upassword,uage,addressid from user where uid=#{id}</select> <select id="getAddressById" resultMap="AddressResultMap">select addid, addname, zipcode from addr where addid =#{addressid}</select></mapper>测试类private static SqlSession session = null;private static SqlSessionFactory sqlSessionFactory = null;static {try {Reader reader = Resources.getResourceAsReader("MybatisConfig.xml");sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);session = sqlSessionFactory.openSession(true);reader.close();} catch (IOException e) {throw new RuntimeException("=========" + e, e);}}public static void main(String[] args) {UserMapper mapper=session.getMapper(UserMapper.class);User u=mapper.getUserById(1);//理论上讲在执行此操作的时候,不会将address对象查询出来System.out.println(u.getName());System.out.println("================");System.out.println(u.getAddress().getAddname());//此时address才会被执行查询//但是事实上在执行mapper.getUserById(1)的时候,就执行了address对象的查询,延迟加载没有起效session.close();}另附建表语句CREATE TABLE `ibatis`.`add` ( `addid` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, `addname` VARCHAR(45), `zipcode` VARCHAR(45), PRIMARY KEY (`addid`))ENGINE = InnoDB;CREATE TABLE `ibatis`.`user` ( `uid` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, `uname` VARCHAR(45), `upassword` VARCHAR(45), `uage` VARCHAR(45), `addressid` VARCHAR(45), PRIMARY KEY (`uid`))ENGINE = InnoDB;请各位牛人,帮忙解答一下,不胜感激 问题补充:输出日志如下: [DEBUG] 2011-10-18 14:48:40 :==> Executing: select uid,uname,upassword,uage,addressid from user where uid=? [DEBUG] 2011-10-18 14:48:40 :==> Parameters: 1(Integer) [DEBUG] 2011-10-18 14:48:40 :<== Columns: uid, uname, upassword, uage, addressid [DEBUG] 2011-10-18 14:48:40 :<== Row: 1, 张三, 123456789, 12, 1 [DEBUG] 2011-10-18 14:48:40 :==> Executing: select addid, addname, zipcode from addr where addid =? [DEBUG] 2011-10-18 14:48:40 :==> Parameters: 1(Integer) [DEBUG] 2011-10-18 14:48:40 :<== Columns: addid, addname, zipcode [DEBUG] 2011-10-18 14:48:40 :<== Row: 1, 西湖区, 310001 张三================西湖区[DEBUG] 2011-10-18 14:48:40xx Connection Closed [DEBUG] 2011-10-18 14:48:40 :Returned connection 15842168 to pool.理论上讲: [DEBUG] 2011-10-18 14:48:40 :==> Executing: select addid, addname, zipcode from addr where addid =? [DEBUG] 2011-10-18 14:48:40 :==> Parameters: 1(Integer) [DEBUG] 2011-10-18 14:48:40 :<== Columns: addid, addname, zipcode [DEBUG] 2011-10-18 14:48:40 :<== Row: 1, 西湖区, 310001这段代码应该是在:================才执行的,但是事实上不是如此。

解决方案

你的代码存在问题。1、setting文件这样配置<settings><setting name="lazyLoadingEnabled" value="true"/><setting name="aggressiveLazyLoading" value="false"/></settings> 只有这两个属性都配置了才能生效!2、下面的映射也有问题,我就不更正了,给你个例子参考<resultMap type="student" id="studentResultMap2"><result property="id" column="id" /><result property="name" column="name" /><association property="classes" column="classid" select="getClassesById" /></resultMap><select id="getStudentById" parameterType="int" resultMap="studentResultMap2">SELECT id,name,classid FROM student s WHERE s.id=#{id} </select><select id="getClassesById" parameterType="int" resultType="classes">SELECT id,name FROM classes c WHERE c.id=#{id} </select>3、我有空会把这个demo代码放到我的博客中,要是还是搞不定你再看看。
解决方案二:
为什么要用association标签?不是应该也用result的么?
解决方案三:
引用UserMapper mapper=session.getMapper(UserMapper.class); User u=mapper.getUserById(1);//理论上讲在执行此操作的时候,不会将address对象查询出来 System.out.println(u.getName()); System.out.println("================"); System.out.println(u.getAddress().getAddname());//此时address才会被执行查询 //但是事实上在执行mapper.getUserById(1)的时候,就执行了address对象的查询,延迟加载没有起效 session.close(); 请问你把这查找用户和查找地址写在一段程序里面,是如何判断它有没有延迟加载的呢?是通过日志输出是否在“=========”前面来查看的吗?

时间: 2024-08-17 18:26:39

关于mybatis延迟加载的问题的相关文章

MyBatis延迟加载及在spring中集成配置

 当你要使用one to one,many to one 就会碰到N+1的问题.很明显,对象之间关联很多有A关联B,B关联C,C关联A这样的关系,如果不是采用延迟加载,很容易一下在出现成千上万对象,造成N+1的问题.   而Mybatis 设置延迟加载主要2个属性配置: <?xml version="1.0" encoding="UTF-8"?>     <!DOCTYPE configuration        PUBLIC "-

MyBatis延迟加载

 1  PersonMapper.xml的配置内容如下(resultMap配置返回值,sql片段配置,select标签标签中的内容介绍,配置使用二级缓存,使用别名的数据类型,条件查询map传递参数,模糊查询,插入,更新,删除,where条件查询,动态修改,in查询foreach迭代,批量插入foreach,批量删除,一对多查询,extends:resultMap的继承,多对多查询,延迟加载): <?xml version="1.0" encoding="UTF-8&

MyBatis实践之动态SQL及关联查询_MsSql

序言 MyBatis,大家都知道,半自动的ORM框架,原来叫ibatis,后来好像是10年apache软件基金组织把它托管给了goole code,就重新命名了MyBatis,功能相对以前更强大了.它相对全自动的持久层框架Hibernate,更加灵活,更轻量级,这点我还是深有体会的. MyBatis的一个强大特性之一就是动态SQL能力了,能省去我们很多串联判断拼接SQL的痛苦,根据项目而定,在一定的场合下使用,能大大减少程序的代码量和复杂程度,不过还是不是过度太过复杂的使用,以免不利于后期的维护

MyBatis实践之动态SQL及关联查询

序言 MyBatis,大家都知道,半自动的ORM框架,原来叫ibatis,后来好像是10年apache软件基金组织把它托管给了goole code,就重新命名了MyBatis,功能相对以前更强大了.它相对全自动的持久层框架Hibernate,更加灵活,更轻量级,这点我还是深有体会的. MyBatis的一个强大特性之一就是动态SQL能力了,能省去我们很多串联判断拼接SQL的痛苦,根据项目而定,在一定的场合下使用,能大大减少程序的代码量和复杂程度,不过还是不是过度太过复杂的使用,以免不利于后期的维护

spring3整合mybatis,设置延迟加载

问题描述 spring3整合mybatis,设置延迟加载 Spring集成Mybatis时,不使用MapperScannerConfigurer,存在一个全局mybatis配置文件,在其中添加配置 即可实现延迟加载,然而使用Scanner方式时,配置如下 不需要全局配置文件了,又该如何来实现延迟加载?

【MyBatis框架】高级映射-延迟加载

延迟加载 1.什么是延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 需求: 如果查询订单并且关联查询用户信息.如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息.把对用户信息的按需去查询就是延迟加载. 延迟加载:先从单表查询.需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快. 2.使用associatio

【mybatis深度历险系列】延迟加载

在前面的博文中,小编主要简单的介绍了mybatis中的高级映射,小伙伴们可以把mybatis和hibernate的因素进行对比,更加有利于理解.今天这篇博文,小编主要来简单介绍一下mybatis中的延迟加载.首先,我们需要知道什么是延迟加载,延迟加载(lazy load)是(也称为懒加载)Hibernate3关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作. 延迟加载,可以简单理解为,只有在使用的时候,

Mybatis的ResultMap的使用

本篇文章通过一个实际工作中遇到的例子开始吧: 工程使用Spring+Mybatis+Mysql开发.具体的业务逻辑很重,对象之间一层一层的嵌套.和数据库表对应的是大量的model类,而和前端交互的是Vo类.现在需要做一个需求,有两种方式来实现: 使用现有的Service接口,或者自己在编写一些用到的接口,手动使用Java代码来分别调用Service接口来查出各个model,然后在业务层将model转换为vo,最后返回给前端json串.       为需求相关的页面定义自己的vo,在vo中只定义前

请教spring 3+mybatis整合出错问题

问题描述 请教spring 3+mybatis整合出错问题 spring 3+mybatis3+spring security整合,我的包和层次结构如下:采用的是按照模块分层, 每层有dao,sevrice,web三个目录,所有的实体类放在model文件夹中 security包中,有dao,service,web三个目录,其中 SecurityDao.java @MyBatisDao public interface SecurityDao extends BaseMapper { // 获得群