MyBatis【多表查询与动态SQL使用】

news2024/9/23 10:27:03

MyBatis【多表查询与动态SQL使用】

  • 🍎一.MyBatis多表查询
    • 🍒1.1 一对一查询
    • 🍒1.2 一对多查询
  • 🍎二.动态SQL使用
    • 🍒2.1 if 标签使用
    • 🍒2.2 trim 标签使用
    • 🍒2.3 where 标签使用
    • 🍒2.4 set 标签使用(增添)
    • 🍒2.5 foreach 标签使用(集合进行遍历)

🍎一.MyBatis多表查询

我们在进行多表查询的时候,我们需要在数据库创建两个表(作者表,文章表)

<作者表 userinfo>:
在这里插入图片描述
<文章表 articleinfo>:
在这里插入图片描述
在项目中创建的对象:
在这里插入图片描述

在这里插入图片描述

在userinfo配置文件mybatis.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">
<!-- namepace 要设置是实现接口所在的具体包加类名 -->
<mapper namespace="com.example.demo.mapper.UserMapper">
    <resultMap id="BaseMap" type="com.example.demo.model.UserInfo">
       <!-- 主键映射 -->
        <id column="id" property="id"></id>

        <!-- 普通属性映射映射 -->
        <result column="username" property="username"></result>
        <result column="username" property="username"></result>
        <result column="password" property="password"></result>
        <result column="photo" property="photo"></result>
        <result column="createtime" property="createtime"></result>
        <result column="updatetime" property="updatetime"></result>
        <result column="state" property="state"></result>

        <!-- collection 关联映射 适用于一对多 -->
        <collection
                property="artlist"
                resultMap="com.example.demo.mapper.ArticleMapper.BaseMap"
                columnPrefix="a_">
        </collection>

    </resultMap>
</mapper>

在aricleinfo配置文件mybatis.xml配置信息

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namepace 要设置是实现接口所在的具体包加类名 -->
<mapper namespace="com.example.demo.mapper.ArticleMapper">
    <resultMap id="BaseMap" type="com.example.demo.model.ArticleInfo">
        <!-- 主键映射 -->
        <id column="id" property="id"></id>

        <!-- 普通属性映射映射 -->
        <result column="title" property="title"></result>
        <result column="content" property="content"></result>
        <result column="createtime" property="createtime"></result>
        <result column="updatetime" property="updatetime"></result>
        <result column="uid" property="uid"></result>
        <result column="rcount" property="rcount"></result>
        <result column="state" property="state"></result>

        <!-- association 关联映射 适用于一对一 -->
        <association property="userInfo"
                     resultMap="com.example.demo.mapper.UserMapper.BaseMap"
                     columnPrefix="u_">
        </association>

    </resultMap>
</mapper>

🍒1.1 一对一查询

创建一个ArticleMapper接口方法:
在这里插入图片描述

创建一个ArticleMapper接口对应 aricleinfo 和 userinfo 在maybatis.xml配置文件

ArticleMapper.xml 配置信息:
在这里插入图片描述

UserMapper.xml 配置信息:
在这里插入图片描述
配置文件多表查询语句
这是我们在MySQL进行多表一对一查询执行语句

我们发现这两个表都有一个相同的id名称属性,这会使在查询时前面id的值会将后面id的值进行覆盖,
所有我们需要将对被联合查询表进行重命名
在这里插入图片描述


    <select id="getArticleById" resultMap="BaseMap">
        select a.*,
        u.id u_id,
        u.username u_username,
        u.password u_password
         from articleinfo a left join userinfo u on a.uid=u.id 
         where a.id=#{id}
    </select>

在进行单元测试代码:
在这里插入图片描述
测试结果:
在这里插入图片描述

在这里插入图片描述

🍒1.2 一对多查询

UserMapper接口代码:

   //查询用户及用户发表的所有文章,根据用户uid
    public UserInfo getUserAndArticleByUid(@Param("uid") Integer uid);

UserMapper.xml代码:

   <!-- 根据用户输入uid查询用户及用户发表的所有文章,根据用户uid-->
    <select id="getUserAndArticleByUid" resultMap="BaseMap">
       select u.*,
       a.id a_id,
       a.title a_title,
       a.content a_content,
       a.createtime a_createtime,
       a.updatetime a_updatetime 
       from userinfo u left join articleinfo a on u.id=a.uid 
       where u.id=#{uid}
    </select>

单元测试代码:

   @Test
    void getUserAndArticleByUid() {
        UserInfo userInfo = userMapper.getUserAndArticleByUid(1);
        log.info("用户文章详细"+userInfo);
    }

单元测试结果:
在这里插入图片描述

🍎二.动态SQL使用

动态 sql 是Mybatis的强⼤特性之⼀,能够完成不同条件下不同的 sql 拼接
可以参考官⽅⽂档:官⽅⽂档

🍒2.1 if 标签使用

在注册⽤户的时候,可能会有这样⼀个问题,就是有必选和非必选是,当我们使用传统的SQL语句就会很繁琐,需要大量代码来实现,这时我们就可以使用动态SQL来进行筛选用户所填的非必选信息

 <!-- 添加用户时 photo时非必传参数 -->
    <insert id="add2">
        insert into userinfo(username,password
        <if test="photo != null">
            ,photo
        </if>
        ) values(#{username},#{password}
        <if test="photo !=null">
            ,#{photo}
        </if>
        )
    </insert>

在这里插入图片描述
我们在单元测试中假设我们没有填写photo属性信息:
在这里插入图片描述
结果:
我们看到并没有实现photo属性信息填写,解决了非必要填写信息的选择语句繁琐的难题
在这里插入图片描述

当我们填写photo信息时:
在这里插入图片描述

在这里插入图片描述

🍒2.2 trim 标签使用

<trim>标签结合<if>标签,对多个字段都采取动态⽣成的⽅式
<trim>标签中有如下属性:
● prefix:表示整个语句块,以prefix的值作为前缀

● suffix:表示整个语句块,以suffix的值作为后缀

● prefixOverrides:表示整个语句块要去除掉的前缀

● suffixOverrides:表示整个语句块要去除掉的后缀

 <!-- 添加用户时 photo时非必传参数 -->
<insert id="add3">
        insert into userinfo
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="username != null">
                username,
            </if>
            <if test="password != null">
                password,
            </if>
            <if test="photo != null">
                photo
            </if>
        </trim>
        values
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="username != null">
                #{username},
            </if>
            <if test="password != null">
                #{password},
            </if>
            <if test="photo != null">
                #{photo}
            </if>
        </trim>
    </insert>

🍒2.3 where 标签使用

where属性没有输入就默认时全局查找了

传⼊的⽤户对象,根据属性做 where 条件查询,⽤户对象中属性不为 null 的,都为查询条件
如user.username 为 “a”,则查询条件为 where username=“a”:

  <!-- <where> 标签可以去除前面and标签 -->
    <select id="getUserById" resultMap="BaseMap">
           select * from userinfo
        <where>
            <if test="id != null">
                 and id=#{id}
            </if>
        </where>
    </select>

以上<where>标签也可以使⽤ <trim prefix="where" prefixOverrides="and"> 替换

🍒2.4 set 标签使用(增添)

根据传⼊的⽤户对象属性来更新⽤户数据,可以使⽤<set>标签来指定动态内容

 <!-- <set>可以去除 后面的 ,标签 -->
    <update id="update2">
          update userinfo
        <set>
            <if test="username != null">
                username=#{username},
            </if>
            <if test="password != null">
                password=#{password},
            </if>
            <if test="photo != null">
                photo=#{photo},
            </if>
        </set>
        where id=#{id}
    </update>

以上<set>标签也可以使⽤ <trim prefix="set" suffixOverrides=","> 替换

🍒2.5 foreach 标签使用(集合进行遍历)

 // 删除方法{根据id删除这一条数据
    public int del2(@Param("ids") List<Integer> ids);
  <!-- collection 是数组对象名
         item   是 数组对象的子对象
         separator是每次遍历之间间隔的字符串-->
    <delete id="del2">
        delete from userinfo where id in
        <foreach collection="ids" open="(" close=")" item="id" separator=",">
            #{id}
        </foreach>
    </delete>

测试单元代码:
在这里插入图片描述
测试单元结果:
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/141150.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ARX测试_绘制道路横断面

本文迁移自本人网易博客&#xff0c;写于2011年1月12日&#xff0c;ARX测试_绘制道路横断面 - lysygyy的日志 - 网易博客 (163.com)1、已提供道路的图形&#xff0c;获取用户输入的两点&#xff0c;并在两点间画一条虚线。计算这条直线与多少条直线相交&#xff0c;若数量不等于…

振弦采集模块多通道专用寄存器

振弦采集模块多通道专用寄存器 多通道频率、温度值寄存器 51~58&#xff08; 0x33~0x3A&#xff09; 位 符号 值 描述 默认值 bit15:0 频率/温度值 0 单通道模块时&#xff0c;寄存器 51 内为频率值&#xff0c;寄存器 55 内为温度值 4 通道模块时&#xff0c;寄存器 51~54 内…

如何去学习PMP考试的《PMBOK》

首先&#xff0c;是PMP考试的核心教材&#xff1a;《PMBOK指南》&#xff0c;目前已经出道第七版了&#xff0c;大家如果有备考的需要要赶紧买一本来学习。 其次&#xff0c;是《汪博士解读PMP》&#xff0c;目前出到第6版&#xff0c;这本书是对PMBOK中各领域知识点的深入浅出…

机械臂速成小指南(二十一):几何雅可比矩阵

&#x1f468;‍&#x1f3eb;&#x1f970;&#x1f973;需要机械臂相关资源的同学可以在评论区中留言哦&#x1f916;&#x1f63d;&#x1f984;指南目录&#x1f4d6;&#xff1a;&#x1f389;&#x1f389;机械臂速成小指南&#xff08;零点五&#xff09;&#xff1a;机…

煤矿皮带跑偏撕裂智能检测算法 opencv

煤矿皮带跑偏撕裂智能检测算法能够通过pythonopencv深度学习技术实时监测运输皮带的状况&#xff0c;当监测到皮带出现撕裂跑偏时&#xff0c;立刻抓拍告警并中止皮带的运输。OpenCV基于C实现&#xff0c;同时提供python, Ruby, Matlab等语言的接口。OpenCV-Python是OpenCV的Py…

动态博客系统

Halo 是我折腾过的众多博客系统里面&#xff0c;最好、最容易上手的动态博客系统之一&#xff08; solo 也是&#xff09;&#xff0c;轻快&#xff0c;简洁&#xff0c;功能强大。 正文 上周末正在募集团队一起写算法题&#xff0c;群里讨论需要一个网站来存放文章&#xff…

C++ 语法基础课 习题6 —— 函数

文章目录例题1. 804.n的阶乘2. 805.x和y的最大值3. 808.最大公约数4. 811.交换数值5. 812.打印数字6. 813.打印矩阵7. 819.递归求阶乘8. 820.递归求斐波那契数列例题 1. 804.n的阶乘 Acwing 804.n的阶乘 #include<iostream> using namespace std;int fact(int n) {if(…

MFC高级控件RichEdit2.0的使用

MFC高级控件RichEdit的使用MFC高级控件RichEdit的使用MFC控件设置焦点&#xff0c;实现回车后编辑框内容清空&#xff0c;焦点停留在该编辑框内MFC高级控件RichEdit的使用 RichEdit控件&#xff0c;可以设置编辑框内不同的行、不同的段落有不同的字体、颜色。 效果如下&#xf…

Python--文件基本操作

文件的存储方式 在计算机中&#xff0c;文件是以 二进制的方式保存在磁盘上的 文本文件和二进制文件 文本文件 可以使用文本编辑软件查看本质上还是二进制文件二进制文件 保存的内容 不是给人直接阅读的&#xff0c;而是提供给其它软件使用的二进制文件不能使用 文件编辑软件…

NTN(一) 基本架构

R17将NTN纳入了3GPP规范&#xff0c;NTN是 non-terrestrial networks非地面网络缩写&#xff0c;通过卫星或无人机平台实现NR通信&#xff0c;在地面网络设备无法普及的地方&#xff0c;采用NTN覆盖&#xff0c;进一步提升覆盖范围。例如在沙漠、海洋等极限区域&#xff0c;采用…

TCP协议

TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09; TCP-数据格式 数据偏移 占4位&#xff0c;取值范围是0x0101~0x1111乘以4就是首部长度&#xff08;Header Length&#xff09; 保留 占6位&#xff0c;目前全为0 有些资料中&#xff0c…

虚幻C++ 关于怎么打印日志

虚幻C 关于怎么打印日志 先打开日志窗口认识一下! 这个就是日志窗口了&#xff01; 可以对信息进行过滤&#xff01; 也可以只显示某种日志&#xff01; 认识完界面了&#xff01;开始写代码啦&#xff01; 老规矩&#xff0c;先给一个入口函数&#xff01; #include &qu…

社交电商红利期,怎么抓住这一波自带流量

自拼多多依靠社交电商模式跃升为行业前三时&#xff0c;社交电商模式就被众多学者以及电商人士研究&#xff0c;过去一年&#xff0c;亚马逊、Starday、TikTok等跨境电商服务平台纷纷推出“直播”功能&#xff0c;试图跟上社交电商发展红利期&#xff0c;为平台抓取更多流量。而…

原生app开发技巧——底部导航栏动画效果按钮制作方法之采用photoshop制作gif动画-过渡动画关键帧

我们要做的效果是如下&#xff0c;就像这个app一样底部的每个菜单点击是有动画的&#xff1a; 此问题来源于我们的一位ui设计师他无法制作Lottie动画无法输出.json格式给到我们的安卓工程师&#xff0c;因此还有一种方法就是做个gif图&#xff0c;而这个目前他也不会只有给大家…

Mysql 索引 以及 SQL 优化 (自用笔记)

(笔记来源 https://www.bilibili.com/video/BV1Kr4y1i7ru?p88&vd_source3cf72bb393b8cc11b96c6d4bfbcbd890) 3.索引 3.1索引的语法 3.1索引的性能分析 3.1.1查看SQL执行频率 增删改为主的SQL的一般不需要优化 查询居多的SQL则需要优化 3.1.2慢查询的日志 记录了超过…

蓝牙透传模块芯片的BLE和SPP有什么区别?如何理解

一、什么是蓝牙透传芯片 蓝牙透传芯片的BLE和SPP有什么区别&#xff1f;如何理解呢&#xff1f; 首先要明确几个关键词&#xff0c;蓝牙芯片&#xff0c;蓝牙透传&#xff0c;蓝牙BLE&#xff0c;以及蓝牙SPP 第一&#xff1a;蓝牙芯片的概念可以参见一下网上的说明&#xff…

内网渗透测试——内网渗透测试基础

1.内网基础知识 1.工作组 再局域网中将不同的计算机按照功能&#xff08;或部门&#xff09;分别列入不同的工作组。 加入创建工作组&#xff1a;点击桌面上的计算机图标&#xff0c;再弹出的快捷键菜单中选择属性&#xff0c;然后几次点击更改设置和更改按钮。再计算机名输…

计算机组成原理题目汇总

文章目录 计算机系统概述数据的表示和运算存储器系统指令系统中央处理器总线输入输出系统计算机系统概述 MIP CPI Tc Fc相关的各种运算。 计算机系统硬件组成有:运算器、控制器、存储器、输入设备、输出设备。 冯诺伊曼机的特点有: 包含…五个部分;以二进制代码表示程序和…

异步通信技术AJAX | AJAX实现搜索联想和自动补全

目录 一&#xff1a;AJAX实现搜索联想和自动补全 二&#xff1a;HTTP状态信息 一&#xff1a;AJAX实现搜索联想和自动补全 &#xff08;1&#xff09;实现的原理 &#xff08;1&#xff09;什么是搜索联想&#xff1f;自动补全&#xff1f; ①百度是一个很典型的代表。在百度…

易基因|DNA甲基化揭示肌痛性脑脊髓炎/慢性疲劳综合征在复发和恢复周期中的动态表观变化

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。2022年10月06日&#xff0c;《Int J Mol Sci》杂志发表题为“Dynamic Epigenetic Changes during a Relapse and Recovery Cycle in Myalgic Encephalomyelitis/Chronic Fatigue Syndrome”…