1.resultMap标签
手动配置mybatis的对象装配表
数据库列 —-> java对象属性 对应关系
resultType 装配数据时 需要字段 与属性一一对应(包含驼峰)
resultMap (复杂数据结构时 更常用) 如果不指定 功能与resultType一直 自动对应
如果指定了 会根据手动指定的列与属性的对应关系装配数据
resultMap 可以替代 resultType
resultMap 中的标签和属性
如果是主键列 一般用id标签对应 propertyjava对象的属性 column 数据库中的列
( javaType实体类数据类型 jdbcType数据库列的数据类型 )
不需要配置
<id property="empno" column="empno" />
如果是普通列 一般用result对应 propertyjava对象的属性 column 数据库中的列
<result property="ename" column="ename" />
高级映射 (映射数据与对象的对应关系) 如果列不指定 不能自动对应
通常搭配继承一起使用 体现基础字段的对应
association 对应某个实体对象
Emp对象中 有部门信息 在java中 包含一个Dept对象
package com.javasm.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
import java.io.Serializable;
/**
* (Emp)实体类
*
* @author makejava
* @since 2024-11-26 09:40:43
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Emp implements Serializable {
private static final long serialVersionUID = -16018027389934188L;
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private String hiredate;
private Double sal;
private Double comm;
//关联部门信息
private Dept dept;
// private Integer deptno;
//
//
// private String dname;
//
// private String loc;
}
映射文件配置
<resultMap id="EmpMapBasMap" type="com.javasm.entity.Emp" >
<!-- 主键列用id -->
<!-- 实体类属性名 数据库列 ( javaType实体类数据类型 jdbcType数据库列的数据类型 ) 不需要配置 -->
<id property="empno" column="empno" />
<!-- 其他列用result -->
<result property="ename" column="ename" />
<result property="job" column="job" />
<result property="mgr" column="mgr" />
<result property="hiredate" column="hiredate" />
<result property="sal" column="sal" />
<result property="comm" column="comm" />
</resultMap>
<resultMap id="EmpMapWithDept" extends="EmpMapBasMap" type="com.javasm.entity.Emp" >
<!-- 实体类属性名 数据库列 -->
<!-- 高级映射(对象映射标签) 需要手动指定所有字段
association 解析resultSet数据时 可以创建多个对象
collection
配置关联的对象 -->
<association property="dept" javaType="com.javasm.entity.Dept">
<id property="deptno" column="deptno" />
<result property="dname" column="dname" />
<result property="loc" column="loc" />
</association>
</resultMap>
通过sql语句 把需要的数据查询出来
select * from emp e,dept d where e.deptno = d.deptno
collection 对应集合
每个部门有多个员工 部门对象中 包含Emp的集合
select * from emp e,dept d where e.deptno = d.deptno
每个Dept中都有多个Emp List
<Emp>
映射配置每个部门有多个员工 部门对象中 包含Emp的集合
package com.javasm.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author gfs
* @version 0.1
* @className Dept
* @descriptioin:
* @date 2024/11/26 10:32
* @since jdk11
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Dept {
private Integer deptno;
private String dname;
private String loc;
//多方的数据集合
private List
<Emp> emps;
}
映射配置
<!-- 基础字段映射 -->
<resultMap id="DeptBasMap" type="com.javasm.entity.Dept" >
<id property="deptno" column="deptno" />
<result property="dname" column="dname" />
<result property="loc" column="loc" />
</resultMap>
<resultMap id="DeptWithEmps" extends="DeptBasMap" type="com.javasm.entity.Dept">
<!-- 聚合 对应集合对象 -->
<collection property="emps" ofType="com.javasm.entity.Emp">
<id property="empno" column="empno" />
<result property="ename" column="ename" />
<result property="job" column="job" />
<result property="mgr" column="mgr" />
<result property="hiredate" column="hiredate" />
<result property="sal" column="sal" />
<result property="comm" column="comm" />
</collection>
</resultMap>
sql语句
select * from dept d left join emp e on d.deptno = e.deptno
order by d.deptno
2.数据库关联查询
表有数据关联时 需要做关联查询
— 连表查询
-- 简化语法 使用内连接
select * from emp e,dept d where e.deptno = d.deptno
-- 标准sql语法 内连接
select * from emp e INNER JOIN dept d on e.deptno = d.deptno
-- 外连接 left right 哪一方显示全集
select d.*,e.* from emp e right join dept d on e.deptno = d.deptno
order by d.deptno
select * from dept d left join emp e on d.deptno = e.deptno
order by d.deptno
— 如果是内连接 连表顺序无影响 — 如果做外联 连表顺序 有影响
多表关联时 全集方向保持一致
3.数据库对应关系 java对象对应关系
 -----> list
<student>
一方 关联多方的对象 association配置
emp —–> dept
student —> class(班级)
![Snipaste_2024-11-26_14-48-20](https://www.neet0316.com/wp-content/uploads/2025/12/Snipaste_2024-11-26_14-48-20.png
多对多情况下
双方都是对方的集合 collection配置
order ----> list
<productInfo>
productInfo -->list
<Order>
总结:
java中 对象之间的关系
对象中包含某个其他对象 association
对象中包含集合其他对象 collection
4.自连接
自连接 需要起别名 通过别名 让mybatis识别哪些是内层 哪些是外层
高级映射标签 association collection 可以多次 和嵌套使用
查省市对应关系数据
select ta2.*,ta1.code AS subcode ,ta1.name AS subname ,ta1.pcode AS subpcode
from tb_area ta1 inner join tb_area ta2 on ta1.pcode = ta2.code
where ta2.pcode = 0
映射文件
<resultMap id="TbAreaMap" type="com.javasm.entity.TbArea" >
<id property="code" column="code" jdbcType="INTEGER"/>
<result property="name" column="name" jdbcType="VARCHAR"/>
<result property="pcode" column="pcode" jdbcType="INTEGER"/>
<collection property="subArea" ofType="com.javasm.entity.TbArea">
<id property="code" column="subcode" jdbcType="INTEGER"/>
<result property="name" column="subname" jdbcType="VARCHAR"/>
<result property="pcode" column="subpcode" jdbcType="INTEGER"/>
</collection>
</resultMap>
查省市县对应关系数据
select ta3.*,ta2.code AS citycode ,ta2.name AS cityname ,ta2.pcode AS citypcode ,
ta1.code AS areacode ,ta1.name AS areaname ,ta1.pcode AS areapcode
from tb_area ta1 inner join tb_area ta2 on ta1.pcode = ta2.code
inner join tb_area ta3 on ta2.pcode = ta3.code
映射文件
<resultMap id="TbAreaMap2" type="com.javasm.entity.TbArea" >
<id property="code" column="code" jdbcType="INTEGER"/>
<result property="name" column="name" jdbcType="VARCHAR"/>
<result property="pcode" column="pcode" jdbcType="INTEGER"/>
<collection property="subArea" ofType="com.javasm.entity.TbArea">
<id property="code" column="citycode" jdbcType="INTEGER"/>
<result property="name" column="cityname" jdbcType="VARCHAR"/>
<result property="pcode" column="citypcode" jdbcType="INTEGER"/>
<collection property="subArea" ofType="com.javasm.entity.TbArea">
<id property="code" column="areacode" jdbcType="INTEGER"/>
<result property="name" column="areaname" jdbcType="VARCHAR"/>
<result property="pcode" column="areapcode" jdbcType="INTEGER"/>
</collection>
</collection>
</resultMap>