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中设置的级别

浙公网安备 33010602011771号