Mybatis映射-7

一对一关联(接上篇笔记)

3.2 association嵌套映射【掌握】

1)实体对象

@Data

public class Card {

   private Integer cid;

   private String code;

}

@Data

public class Person {

   private Integer pid;

   private String name;

   private String sex;

   private Integer age;

   private Card card;

}

2)编写接口

public interface PersonMapper {

   public List<Person> selectAllPersons();

}

3)映射文件

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

       "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.woniuxy.dao.PersonMapper">

   <resultMap id="personMap" type="person">

       <id property="pid" column="pid"></id>

       <result property="name" column="name"></result>

       <result property="age" column="age"></result>

       <result property="sex" column="sex"></result>

       <!--

          association:用于处理一的一方设置,常用属性

            property:关联对象的属性名

            javaType:关联对象的类型(类全名,别名(必须要在配置文件中配置typeAliases))

       -->

      <association property="card" javaType="com.woniuxy.pojo.Card">

           <id property="cid" column="cid"></id>

           <result property="code" column="code"></result>

       </association>

   </resultMap>

   <select id="selectAllPersons" resultMap="personMap">

       SELECT *

       FROM tb_person p INNER JOIN tb_card c ON p.idcard=c.cid

   </select>

</mapper>

4)测试

public class AppTest

{

   private Logger logger=Logger.getLogger(AppTest.class);

   @Test

   public void test1()

   {

       SqlSession sqlSession= MyBatisUtil.crateSqlSession();

       PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);

       List<Person> all=personMapper.selectAllPersons();

       for(Person p:all){

           logger.info(p.getPid()+" "+p.getName()+" "+p.getSex()+" "+p.getAge()

                   +" "+p.getCard().getCid()+" "+p.getCard().getCode());

       }

       MyBatisUtil.closeSqlSession(sqlSession);

   }

}

3.4 association分步查询【重点掌握】

1)编写实体对象

@Data

public class Card {

   private Integer cid;

   private String code;

}

@Data

public class Person {

   private Integer pid;

   private String name;

   private String sex;

   private Integer age;

   private Card card;

}

2)编写接口

public interface PersonMapper {

   public List<Person> selectAllPersons();

}

public interface CardMapper {

   public Card selectCardByCidToStep(Integer cid);

}

3)映射文件

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

       "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.woniuxy.dao.PersonMapper">

   <resultMap id="personMap" type="person">

       <id property="pid" column="pid"></id>

       <result property="name" column="name"></result>

       <result property="sex" column="sex"></result>

       <result property="age" column="age"></result>

       <!--

           SELECT * FROM tb_person;

           SELECT * FROM tb_card WHERE cid=1

           association:一对一关联

              property:关联对象属性名

              select:分布查询的方法名

              column:外键

       -->

       <association property="card"

                    select="com.woniuxy.dao.CardMapper.selectCardByCidToStep"

                    column="idcard">

       </association>

   </resultMap>

   <select id="selectAllPersons" resultMap="personMap">

      SELECT * FROM tb_person

   </select>

</mapper>

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

       "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.woniuxy.dao.CardMapper">

   <select id="selectCardByCidToStep" resultType="card">

       SELECT * FROM tb_card WHERE cid=#{cid}

   </select>

</mapper>

注意:每次新建一个Mapper映射文件,都需要在mybatis-config.xml文件添加<mapper>节点

<mapper resource="mapper/CardMapper.xml"></mapper>

4)测试

package com.woniuxy;

import static org.junit.Assert.assertTrue;

import com.woniuxy.dao.PersonMapper;

import com.woniuxy.pojo.Person;

import com.woniuxy.util.MyBatisUtil;

import org.apache.ibatis.session.SqlSession;

import org.apache.log4j.Logger;

import org.junit.Test;

import java.util.List;

public class AppTest

{

   private Logger logger=Logger.getLogger(AppTest.class);

   @Test

   public void test1()

   {

       SqlSession sqlSession= MyBatisUtil.crateSqlSession();

       PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);

       List<Person> all=personMapper.selectAllPersons();

       for(Person p:all){

           logger.info(p.getPid()+" "+p.getName()+" "+p.getSex()+" "+p.getAge()

                   +" "+p.getCard().getCid()+" "+p.getCard().getCode());

       }

       MyBatisUtil.closeSqlSession(sqlSession);

   }

}

控制台的结果

3.3 association分步查询【重点掌握】

1)编写实体对象

@Data

public class Card {

   private Integer cid;

   private String code;

}

@Data

public class Person {

   private Integer pid;

   private String name;

   private String sex;

   private Integer age;

   private Card card;

}

2)编写接口

public interface PersonMapper {

   public List<Person> selectAllPersons();

}

public interface CardMapper {

   public Card selectCardByCidToStep(Integer cid);

}

3)映射文件

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

       "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.woniuxy.dao.PersonMapper">

   <resultMap id="personMap" type="person">

       <id property="pid" column="pid"></id>

       <result property="name" column="name"></result>

       <result property="sex" column="sex"></result>

       <result property="age" column="age"></result>

       <!--

           SELECT * FROM tb_person;

           SELECT * FROM tb_card WHERE cid=1

           association:一对一关联

              property:关联对象属性名

              select:分布查询的方法名

              column:外键

       -->

       <association property="card"

                    select="com.woniuxy.dao.CardMapper.selectCardByCidToStep"

                    column="idcard">

       </association>

   </resultMap>

   <select id="selectAllPersons" resultMap="personMap">

      SELECT * FROM tb_person

   </select>

</mapper>

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

       "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.woniuxy.dao.CardMapper">

   <select id="selectCardByCidToStep" resultType="card">

       SELECT * FROM tb_card WHERE cid=#{cid}

   </select>

</mapper>

注意:每次新建一个Mapper映射文件,都需要在mybatis-config.xml文件添加<mapper>节点

<mapper resource="mapper/CardMapper.xml"></mapper>

4)测试

package com.woniuxy;

import static org.junit.Assert.assertTrue;

import com.woniuxy.dao.PersonMapper;

import com.woniuxy.pojo.Person;

import com.woniuxy.util.MyBatisUtil;

import org.apache.ibatis.session.SqlSession;

import org.apache.log4j.Logger;

import org.junit.Test;

import java.util.List;

public class AppTest

{

   private Logger logger=Logger.getLogger(AppTest.class);

   @Test

   public void test1()

   {

       SqlSession sqlSession= MyBatisUtil.crateSqlSession();

       PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);

       List<Person> all=personMapper.selectAllPersons();

       for(Person p:all){

           logger.info(p.getPid()+" "+p.getName()+" "+p.getSex()+" "+p.getAge()

                   +" "+p.getCard().getCid()+" "+p.getCard().getCode());

       }

       MyBatisUtil.closeSqlSession(sqlSession);

   }

}

3.4 association分步查询的延迟加载问题【掌握】

什么是延迟加载:俗称懒加载(Lazy):需要的才去查询的这种情况。

为什么需要延迟加载:为了提高性能,把需要的信息不立即查出来,需要的时候再查。

如下操作虽然我只是需要人员本身信息,控制台也输出本身自己的信息,但是我们观察SQL语句,大家会发现,依然做的是立即加载

mybatis中如何设置延迟加载

第1种方式:在mybatis-config.xml中设置全局启用延迟加载

<settings>

   <!--lazyLoadingEnabled:设置全局延迟加载-->

   <setting name="lazyLoadingEnabled" value="true"></setting>

</settings>

测试代码

  @Test

   public void test1()

   {

       SqlSession sqlSession= MyBatisUtil.crateSqlSession();

       PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);

       List<Person> all=personMapper.selectAllPersons();

       for(Person p:all){

           logger.info(p.getPid()+"\t"+p.getName()+"\t"+p.getSex()+"\t"+p.getAge());

       }

       MyBatisUtil.closeSqlSession(sqlSession);

   }

此时测试代码中没有查询关联信息,只是查询Person本身的信息

在mybatis-config.xml文件中,设置属性不按需加载

<!--aggressiveLazyLoading:按不需加载属性信息-->

<setting name="aggressiveLazyLoading" value="true"></setting>

在mybatis-config.xml文件中,设置属性不按需加载

<!--aggressiveLazyLoading:按需加载属性信息-->

<setting name="aggressiveLazyLoading" value="false"></setting>

下面我们在测试代码中查询关联信息

@Test

public void test1()

{

   SqlSession sqlSession= MyBatisUtil.crateSqlSession();

   PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);

   List<Person> all=personMapper.selectAllPersons();

   for(Person p:all){

       logger.info(p.getPid()+"\t"+p.getName()+"\t"+p.getSex()+"\t"+p.getAge()+"\t"+p.getCard().getCode());

   }

   MyBatisUtil.closeSqlSession(sqlSession);

}

总结一下:

第一步:在mybatis-config.xml文件中设置如下配置

<settings>

   <!--lazyLoadingEnabled:设置全局延迟加载-->

   <setting name="lazyLoadingEnabled" value="true"></setting>

   <!--aggressiveLazyLoading:按需加载属性信息-->

   <setting name="aggressiveLazyLoading" value="false"></setting>

</settings>

第二步:在使用的时候一定要通过调用的方式来完成延迟加载

@Test

public void test1()

{

   SqlSession sqlSession= MyBatisUtil.crateSqlSession();

   PersonMapper personMapper=sqlSession.getMapper(PersonMapper.class);

   List<Person> all=personMapper.selectAllPersons();

   for(Person p:all){

       logger.info(p.getPid()+"\t"+p.getName()+"\t"+p.getSex()+"\t"+p.getAge()+"\t"+p.getCard().getCode());

   }

   MyBatisUtil.closeSqlSession(sqlSession);

}

第2种方式:通过在association中设置fetchType的值来设置延迟加载

<association property="card"

            select="com.woniuxy.dao.CardMapper.selectCardByCidToStep"

            column="idcard" fetchType="lazy">

</association>

总结:如果在association中通过fetchType设置延迟加载和通过在mybatis-config.xml文件通过setting节点设置延迟加载同时存在时,fetchType设置延迟加载的级别要高于setting中设置的级别

posted @ 2020-10-08 17:43  Mistory  阅读(70)  评论(0)    收藏  举报