mybatis association 一对一关联查询

学生表设计学生表设计,下面是插入用于调试的数据
在这里插入图片描述
在这里插入图片描述
班级表设计,下面是插入用于调试的数据
在这里插入图片描述

1.一对一嵌套查询

student表实体类(省略get set )
	private Integer stuId;
	private String stuName;
	private Integer stuAge;
	private Class cla;     //班级属性
class表实体类(省略get set )
	private Integer claId;
	private String claName;
Junit测试(此处省略Before After)
/**
	 * 一对一嵌套查询
	 */
	@Test
	public void test11() {
		StudentMapper mapper = session.getMapper(StudentMapper.class);
		Student student = mapper.selectStudentById(1);
		System.out.println(student);
	}

studentMapper接口

public interface StudentMapper {

	Student selectStudentById(int id);

}

studentMapper.xml


<?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.mr.mapper.StudentMapper">
	<select id="selectStudentById" resultMap="resultStudentMap">
  				select * from t_student s,t_class c where stu_id = #{id} and s.cla_id = c.cla_id 
  	</select>
  	<resultMap type="com.mr.entity.Student" id="resultStudentMap">
  		<id column="stu_id" property="stuId"/>
  		<result column="stu_name"  property="stuName" />
  		<result column="stu_age" property="stuAge"/>
  		<!-- 
  		association 可以指定可以联合的javabean对象
  			property 指定联合的对象(实体类中的private 属性)
  			javatype 指定这个属性对象的类型
  		 -->
  		<association property="cla" javaType="com.mr.entity.Class">
  			<id column="cla_id" property="claId"/>
  			<result column="cla_name" property="claName"/>
  		</association>
  		
  	</resultMap>
  </mapper>
测试结果
Student [stuId=1, stuName=张三, stuAge=12, cla=Class [claId=1, claName=一班]]

========================================================================

一对一分步查询

首先查询class信息

ClassMapper接口文件

public interface ClassMapper {

	Class selectClassById(int id);

}

ClassMapper.xml文件

<?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.mr.mapper.ClassMapper">
  
  	<select id="selectClassById" resultType="com.mr.entity.Class">
  		select * from t_class where cla_id = #{id}
  	</select>	
  	
  </mapper>

根据class信息查询student信息

测试方法(还是之前的测试)
/**
	 * 一对一嵌套查询
	 */
	@Test
	public void test11() {
		StudentMapper mapper = session.getMapper(StudentMapper.class);
		Student student = mapper.selectStudentById(1);
		System.out.println(student);
	}
更改StudentMapper.xml里的配置
<select id="selectStudentById" resultMap="resultStuClaByIdMap">	
  		select * from t_student where stu_id = #{id}
</select>
  	<resultMap type="com.mr.entity.Student" id="resultStuClaByIdMap">
  		<id column="stu_id" property="stuId"/>
  		<result column="stu_name" property="stuName"/>
  		<result column="stu_age" property="stuAge"/>
  		<association property="cla" select="com.mr.mapper.ClassMapper.selectClassById" column="cla_id">
  			<id column="cla_id" property="claId"/>
  			<result column="cla_name" property="claName"/>
  		</association>
  	</resultMap> -->
查询结果
Student [stuId=1, stuName=张三, stuAge=12, cla=Class [claId=1, claName=一班]]

问题:关联查询可以自定义查询字段,分步查询每次都会将班级信息查询出来。

解决方案:在配置文件中配置 延迟加载(懒加载),

<setting name="lazyLoadingEnabled" value="true"/>    //默认false
<setting name="aggressiveLazyLoading" value="false"/>

这样分布查询只有在真正调用班级信息时才会打印sql语句

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值