问题描述
我做了一个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(); 请问你把这查找用户和查找地址写在一段程序里面,是如何判断它有没有延迟加载的呢?是通过日志输出是否在“=========”前面来查看的吗?