在常规的CRUD中,POJO大多数属性都是基本类型,但是稍微复杂一点的项目,便会出现引用类型,那么普通的SQL就不容易处理了,幸好Mybatis提供了一个非常强大的工具——resultMap
MyBatis映射文件中除了
本小节主要来记录
标签的作用:自定义映射关系。
MyBatis可以将数据库结果集封装到对象中,是因为结果集的列名和对象属性名相同:
当POJO属性名和数据库列名不一致时,MyBatis无法自动完成映射关系。如:
此时有两种解决方案:
①Sql语句的查询字段起与POJO属性相同的别名。
<select id="findAll" resultType="com.nucty.pojo.Teacher">
select tid as id,tname as teacherName from teacher;
select>
②自定义映射关系
<select id="findAll" resultMap="teacherMapper">
select * from teacher
select>
<resultMap id="teacherMapper" type="com.nucty.pojo.Teacher">
<id property="id" column="tid">id>
<result property="teacherName" column="tname">result>
resultMap>
查询班级时,将关联的一个老师对象查询出来,就是一对一关联查询。【虽然班级和老师是多对多的关系,但是数据库中一个班级对应的是一个老师去模拟一对一的关联查询】
创建持久层接口
@Mapper
public interface IClassDao {
public Classs getClass(Integer id);
}
创建映射文件
<select id="getClass" parameterType="Integer" resultMap="ClassResultMap">
select *
from class c,
teacher t
where c.teacher_id = t.t_id
and c.c_id = #{id}
select>
<resultMap id="ClassResultMap" type="nuc.ty._20231202myatis.pojo.Classs">
<id property="id" column="c_id">id>
<result property="name" column="c_name">result>
<association property="teacher" column="teacher_id" javaType="nuc.ty._20231202myatis.pojo.Teacher">
<id property="id" column="t_id"/>
<result property="name" column="t_name"/>
association>
resultMap>
现给出另外一种实现方式,观察区别
<select id="getClass2" parameterType="integer" resultMap="ClassResultMap2">
select *
from class
where c_id = #{id}
select>
<resultMap id="ClassResultMap2" type="nuc.ty._20231202myatis.pojo.Classs">
<id property="id" column="c_id"/>
<result property="name" column="c_name"/>
<association property="teacher" column="teacher_id" javaType="nuc.ty._20231202myatis.pojo.Teacher"
select="getTeacher">
association>
resultMap>
<select id="getTeacher" parameterType="Integer" resultType="nuc.ty._20231202myatis.pojo.Teacher">
select t_id id, t_name name
from teacher
where t_id = #{id}
select>
其区别在于嵌套查询和嵌套结果查询【着重关注一下sql语句的区别】
嵌套查询 是指通过执行另外一条 SQL 映射语句来返回预期的复杂类型;
嵌套结果 是使用嵌套结果映射来处理重复的联合结果的子集。
嵌套查询 | 嵌套结果 |
---|---|
嵌套查询是在查询 SQL 后再进行一个(子)查询 | 嵌套结果是一个多表查询的 SQL 语句 |
会执行多条 SQL 语句 | 只有一条复杂的 SQL 语句(多表连接) |
SQL语句编写较为简单 | SQL语句编写较为复杂 |
参考链接:Mybatis 的嵌套查询与嵌套结果的区别 - 东郊 - 博客园 (cnblogs.com)
查询一个部门下的员工信息【模拟一对多关联查询】
创建持久层接口
@Mapper
public interface IDeptDao {
public Dept findByDeptno(Integer deptno);
}
创建映射文件
<mapper namespace="nuc.ty._20231202myatis.dao.IDeptDao">
<select id="findByDeptno" parameterType="Integer" resultMap="deptMap">
select *
from dept
where deptno = #{deptno}
select>
<resultMap type="nuc.ty._20231202myatis.pojo.Dept" id="deptMap">
<id property="deptno" column="deptno"/>
<result property="dname" column="dname"/>
<result property="location" column="loc"/>
<collection property="emps" javaType="ArrayList"
ofType="nuc.ty._20231202myatis.pojo.Emp"
column="deptno"
select="nuc.ty._20231202myatis.dao.IEmpDao.findByDeptno">
collection>
resultMap>
mapper>
<mapper namespace="nuc.ty._20231202myatis.dao.IEmpDao">
<select id="findByDeptno" parameterType="Integer"
resultType="nuc.ty._20231202myatis.pojo.Emp">
select * from emp
where deptno=#{deptno}
select>
mapper>
举例说明:
在一对一关联查询中,javaType雀雀实实指的是对象的类型。
而在一对多关联查询中,ofType指的是实体对象中集合类属性所包含的元素类型即Emp,而javaType指的是集合类型,一般指ArrayList。