学生表设计,下面是插入用于调试的数据
班级表设计,下面是插入用于调试的数据
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语句