Mybatis(2)

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对象对应关系

![Snipaste_2024-11-26_11-17-23](https://www.neet0316.com/wp-content/uploads/2025/12/Snipaste_2024-11-26_11-17-23.png

一对一情况下

java中 双方对象 都包含对方的对象 mybatis中使用 association 配置结果

![Snipaste_2024-11-26_11-24-34](https://www.neet0316.com/wp-content/uploads/2025/12/Snipaste_2024-11-26_11-24-34.png

一对多情况下

多方 包含一方的集合 collection配置

dept   ----&gt;  list
<emp>

class(班级)   -----> 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  ----&gt; 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>
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇