mybatis之高级查询

2023-05-16

Mybatis中的高级查询主要通过关联查询,集合查询或鉴别器来完成。其核心就是之前提到的通过resultMap标记来完成
1. 关联查询
关联查询一般有三种方式:
a.联合查询
利用resultMap的map.xml中的配置如下(Pojo1和Pojo2对应的数据表分别为table1和table2)

<resultMap id="Pojo1Map" type="Pojo1">
    <id property="id" column="Pojo1.id" />
    <result property="realName" column="realName" />
    <result property="IDCard" column="IDCard" />
    <association property="Pojo2" column="userID"
        javaType="Pojo2">
        <id property="id" column="Pojo2.id" />
        <result property="userName" column="userName" />
        <result property="password" column="password" />
    </association>
</resultMap>

<select id="selectPojo1Join" resultMap="Pojo1Map">
    select * from table1 inner join table2 
        on table2.id=table1.userID
</select>

联合查询主要是通过association标记来实现两张表的连接

b.构造查询
构造查询首先需要构造需要使用的参数对应的构造函数,比如需要查询userName和password两个关键字数据,这时,需要在POJO类中建立新的构造函数:

public User(String userName,String password){
    super();
    this.userName=userName;
    this.password=password;
}

这里需要注意的事,Mybatis框架通过默认的构造函数找到相应的参数,所以,这里还需要补上默认的构造函数:

public User(String id,String userName,String password){
    super();
}

构造函数查询的resultMap与之前联合查询有少许不同,需要 使用< constructor>标签,如下:

<association property="User" column="userID"
javaType="User">
<constructor>
    <arg column="userName" javaType="String" />
    <arg column="password" javaType="String" />
</constructor>
</association>

其余地方与联合查询相同,使用构造函数进行查询的好处是,只需要获取对应的关键字数据段,减少了查询的数据量。
c.子查询
子查询的形式为:

select * from table1 where userID in(select id from table2)

子查询的步骤大致分为两步:第一步建立一个子查询

<select id="selectOne" parameterType="int" resultType="Pojo2">
select * from table2 where id=#{id}
</select>

建立子查询也就是通过一张表的某个查询条件找到相应的数据

第二步为建立查询

<resultMap id="Pojo1SubMap" type="Pojo1">
        ……
        <association property="Pojo2" column="userID"
        javaType="Pojo2" select="selectOne">
        </association>
</resultMap>

<select id="selectPojo1Sub" resultMap="Pojo1SubMap">
select * from table1 
</select>

需要将两张表进行联合,这里需要在< association>标记中加上select标记,赋值为子查询的id,selectOne,这样便可将两个查询进行关联起来。

使用子查询为N+1次查询,占用的资源可大可小,而联合查询为一次查询,占用的资源比较大,在Mybatis框架中,支持懒加载机制,也就是说,只有当函数执行时才会进行相应的sql语句,利用子查询刚好可以将查询分开,这样有利于提高程序的执行效率。Mybatis默认不支持懒加载机制,需在配置文件中进行如下设置:

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


这样便启动了懒加载应用,非常方便实用。

2.集合查询
集合查询主要是通过< collection>标记实现的,函数返回的是一个集合
这里首先需要在POJO类中定义一个新的函数:

private List<Pojo3> pojo3List;

<resultMap id="pojo3Map" type="Pojo2">
<collection property="pojo3List" javaType="ArrayList"
    column="Pojo3ID" ofType="Pojo3">
    <result property="Pojo3ID" column="Pojo3ID" />
    ...
</collection>
</resultMap>

resultMap中的类型是关联的数据类型,可以从原始sql语句看出:

select * from table2 inner join visit on table2.id=table3.userID

其中,table2和table3分别对应于Pojo2,Pojo3的数据表。、

property标记与之前一样,为定义的函数名,就javaType返回的是一个ArrayList类型的对象,column关联的数据库关键字,ofType为对应的数据类型,之后便可建立查询:

<select id="selectPojo3" resultMap="pojo3Map">
select * from table2 inner join visit on table2.id=table3.userID
</select>

这样便可完成一次集合查询操作,返回一个list

3.鉴别器
鉴别器主要是通过< discriminator>标记完成,举个简单的例子,比如有如下表:

IdGenderBoyGirl
主键性别男孩女孩
<discriminator javaType="int" column="gender"> 
       <case value="1" > 
         <result property="boy" column=“Boy" /> 
     </case> 
     <case value="2" > 
             <result property="girl" column="Girl" />
    </case>     
</discrimindator>

这就是一个简单的鉴别器,性别为1和2,当取到1时,就是Boy列,取到2时就是Girl列,鉴别器的作用就是有时候查询的结构会返回不同类型的集合,可以将其进行分别映射。比如上例中可能数据表中具有男孩和女孩特有的字段,这时便需要将查询的结果进行分别映射。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mybatis之高级查询 的相关文章

随机推荐

  • TCP/IP网络编程笔记--套接字和标准I/O

    一 定义 xff1a 标准I O是标准C库提供的对文件操作的函数接口 二 常见的标准I O函数 xff1a 1 fopen xff08 xff09 函数原型 xff1a FILE fopen xff08 const char path xf
  • C语言位运算符:与、或、异或、取反、左移和右移

    文章转载于 博客园 博主 夜真寒 链接地址 xff1a http www cnblogs com yezhenhan archive 2011 11 06 2238452 html 语言位运算符 xff1a 与 或 异或 取反 左移和右移
  • Linux系统之常用命令

    这几天在看教学视频 xff0c 里面在讲一些linux系统常用的命令 xff0c 虽然有一部分都很熟悉了 xff0c 但也有一些不太熟悉 xff0c 因此来总结一下 注 xff1a 本文并非介绍了linux下所有常用的命令 xff0c 而是
  • C++学习笔记--尽量以const,enum,inline替换#define

    本文内容整理自 Effective C 43 43 中文版 xff0c 主要讲述 C 43 43 中在一些场合使用 const enum inline 来替换 define 所带来的好处 1 const 当我们编写这样一条代码 xff1a
  • ROS分布式通信(可以查看话题但主机接受不到从机传输的消息)

    提示 xff1a 想要将nano上的传感器数据发回pc端从机进行计算 xff0c 但是pc端计算完后发布话题 xff0c nano上的主机可以查看到这个话题但却收不到消息 xff08 已经在主机配置好相应的消息类型 xff09 前言 提示
  • 用户身份认证

    0 背景 计算机本身无法判断坐在显示器前的使用者的身份 xff0c 也无法确认网络的另一端的是谁 为了明确是谁在访问服务器 xff0c 必须让客户端自报家门 通常核对一些登录者本人的信息 xff1a 密码 xff1a 只有本人知道的字符串信
  • 一款用过就舍不得换的播放器-potplayer(中文绿色版)/win64

    PotPlayer 是 KMPlayer 的原制作者姜龙喜先生 xff08 韩国 xff09 进入 Daum 公司后的新一代网络播放器 PotPlayer 的优势在于强大的内置解码器 xff1b 而 KMPlayer 的优势在于强大的定制能
  • (一) odroid-xu4交叉编译过程

    目录 文章目录 目录前言Toolchain安装过程总结 前言 现在转到ODROID xu4的平台 xff0c 需要安装ODROID xu4的交叉编译环境 xff0c 特此记录 xff01 本文参照ODROID Wiki Toolchain安
  • 使用OPENMV控制云台自动追踪Apriltag,测出与Apriltag距离并且通过串口发送给单片机。

    使用openmv控制云台自动跟踪Apriltag xff0c 并且将openmv与Apriltag距离通过串口发送到单片机 如果有openmv的同学直接将main py和pid py复制到flash中就可以了 注意 xff01 Aprilt
  • ubuntu 配置http

    1 去服务器上购买免费https服务并配置域名等 2 根据自己的网站服务器来选择下载不同的ssl证书 apache证书包括 1 root bundle crt 证书文件 2 xxx xxx xxx crt 证书文件 3 xxx xxx xx
  • C++中istringstream、ostringstream、stringstream详细介绍和使用

    C 43 43 中istringstream ostringstream stringstream介绍和使用 1 基于控制台的I O 注意 xff1a 提取符 34 gt gt 从流中提取数据时跳过输入流中的空格 tab键 换行符等空白字符
  • java httpClient Digest Auth 认证

    技术交流QQ群 933925017 java httpClient Digest Auth 认证 因为项目需要 请求海康摄像头 进行抓图以及云台控制等功能 海康有http协议 但是需要进行请求头认证 因为海康给的资料已经过时 所以找了很久
  • 锂电池充电过程及电路设计

    通常为了提高电池充电时的可靠性和稳定性 xff0c 我们会用电源管理芯片来控制电池充电的电压与电流 xff0c 但是在使用电源管理芯片设计充电电路时 xff0c 我们往往对充电电路每个时间段的工作状态及电路设计注意事项存在一些困惑 1 电池
  • 0Ω电阻到底能过多大电流

    0 电阻到底能过多大电流 xff1f 这个问题想必每位硬件工程师都查过 而与之相关的还有一个问题 xff0c 那就是0 电阻的阻值到底有多大 xff1f 这两个问题本来是很简单的 xff0c 答案应该也是很明确的 xff0c 但网上网友却给
  • linux进程控制函数--fork,exec,exit,wait,sleep

    1 fork 在linux系统中 xff0c 用户创建进程的唯一方法就是使用系统调用fork xff0c 大概要进行下面的操作 lt 1 gt 分配表项 xff0c 一个用户的进程项是有限的 xff1b lt 2 gt 创建子进程的进程标识
  • linux的用户模式和内核模式

    MS DOS等操作系统在单一的CPU模式下运行 xff0c 但是一些类Unix的操作系统则使用了双模式 xff0c 可以有效地实现时间共享 在Linux机器上 xff0c CPU要么处于受信任的内核模式 xff0c 要么处于受限制的用户模式
  • 阿里内推面试经历

    写在最前 其实主观上并不是很想写 xff0c 但坚持写完是希望能分享给准备进互联网实习或工作的同学或朋友一些经验和收获
  • 关于利用Openmp中使用的时间函数

    Openmp是一项并行化技术 xff0c 是可以提高串行化程序的运行效率的 xff0c 但需要使用正确的时间函数来进行衡量 首先 xff0c 先提出一个unix linux下的内核时间获取函数和一个omp h的一个库函数 1 clock 函
  • mybatis之映射文件

    mybatis框架如何实现java语句与数据库语句的分离 映射文件 通过在映射文件中写入动态sql语句 xff0c 完成增删改查操作 映射文件中的元素都包含在根节点 lt mapper gt lt mapper gt 下 xff0c map
  • mybatis之高级查询

    Mybatis中的高级查询主要通过关联查询 xff0c 集合查询或鉴别器来完成 其核心就是之前提到的通过resultMap标记来完成 1 关联查询 关联查询一般有三种方式 xff1a a 联合查询 利用resultMap的map xml中的