Mybatis中的查询操作

单表查询

单表查询在《初始Mybatis》中已经介绍过,这里就不在介绍了。咱们这里只说单表查询中的“like查询”。
like查询单独使用#{}报错

<select id="selectByKeyword" resultType="com.example.demo.entity.Userinfo">
	select * from userinfo where username like '%#{username}%'
</select>

转换成jdbc代码如下
image.png
正确的打开方式是配合concat函数使用

<select id="selectByKeyword" resultType="com.example.demo.entity.Userinfo">
	select * from userinfo where username like concat('%', #{username}, '%')
</select>

此时的转换成jdbc代码如下:
image.png

多表联查

resultType和resultMap

在咱们前面几篇文章中,在select标签中返回类型都是使用resultType,这是因为resultType使用简单,所以大部分查询场景都是使用resultType。
而resultMap用来返回字典映射,resultMap使用场景如下:

  • 数据库中的字段名和程序中的属性名不同时,可使用resultMap 配置映射
  • 在一对一和一对多中使用resultMap映射并查询数据
字段名和属性名不同的情况,使用resultMap解决

image.png
程序的属性:
image.png
通过id查询用户信息

<select id="selectById" resultType="com.example.demo.entity.Userinfo">
	select * from userinfo where id = #{id}
</select>

单元测试代码:

@Test
void selectById() {
	int id = 1;
	Userinfo userinfo = userMapper.selectById(id);
	System.out.println("用户名:" + userinfo.getName());
}

image.png
mybatis是ORM框架,将mysql查询结果放到程序实体类中,当数据库的字段名和属性名相同时就会赋值,由于在数据库中是username,而实体类中是name,无法对应起来,导致赋值失败。
此时可以通过resultMap解决

<resultMap id="baseMap" type="com.example.demo.entity.Userinfo">
	<id column="id" property="id"></id>
	<result column="username" property="name"></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>
</resultMap>

<select id="selectById" resultMap="baseMap">
	select * from userinfo where id = #{id}
</select>

image.png
此时再运行单元测试代码:
image.png

使用as别名解决
<select id="selectById2" resultType="com.example.demo.entity.Userinfo">
	select username as name, password, photo, createtime, updatetime, state from userinfo where id
</select>

image.png

多表查询

现在除了userinfo表,还有一个文章表articleinfo.
image.png
image.png
需求:在文章表中根据文章id查询文章作者和文章信息
在文章表中并没有username字段,所以需要将articleinfo表和userinfo表联查(因为要展示文章信息所以是left join),联查的条件是articleinfo.uid = userinfo.id.得到的结果既不是userinfo也不是articleinfo,所以我们需要继承articleinfo,创建一个articleinfoVO对象。(VO就是View Object视图对象)
image.png

@Mapper
public interface ArticleMapper {
    public ArticleinfoVO getById(@Param("id") Integer id);
}
<?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">
<mapper namespace="com.example.demo.mapper.ArticleMapper">
	<select id="getById" resultType="com.example.demo.entity.vo.ArticleinfoVO">
		select articleinfo.* , userinfo.username from articleinfo left join userinfo
		on userinfo.id = articleinfo.uid
		where articleinfo.id = #{id}
	</select>
</mapper>
@SpringBootTest
@Transactional
class ArticleMapperTest {
    @Autowired
    private ArticleMapper articleMapper;
    @Test
    void getById() {
        ArticleinfoVO articleinfoVO = articleMapper.getById(1);
        System.out.println(articleinfoVO.toString());
    }
}

image.png

总结:多表查询时使用连表查询(left join/inner join) + XXXVO解决

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[完美解决]Accelerate设置单卡训练报错,成功设置单卡训练

报错内容 ValueError: Less than two GPU ids were configured and tried to run on on multiple GPUs. Please ensure at least two are specified for --gpu_ids, or use --gpu_idsall. ValueError:配置了少于两个GPU id&#xff0c;并试图在多个GPU上运行。请确保为——gpu…

ubuntu22.04 显卡驱动最简单的安装方法

1.拉取可选择安装的显卡驱动版本 sudo apt-get purge nvidia* #apt 的 update 和 upgrade 的区别 #apt update 命令只会获得系统上所有包的最新信息&#xff0c;并不会下载或者安装任何一个包。 #apt upgrade 命令来把这些包下载和升级到最新版本。 2.sudo apt update 3.安装…

多线程(进阶二:CAS)

目录 一、CAS的简单介绍 CAS逻辑&#xff08;用伪代码来描述&#xff09; 二、CAS在多线程中简单的使用 三、原子类自增的代码分析 都看到这了&#xff0c;点个赞再走吧&#xff0c;谢谢谢谢谢 一、CAS的简单介绍 CAS的全称&#xff1a;“Compare And Swap”&#xff0c;字…

《PySpark大数据分析实战》图书上线啦

《PySpark大数据分析实战》图书上线啦 《PySpark大数据分析实战》图书上线啦特殊的日子关于创作关于数据关于Spark关于PySpark关于图书/专栏 《PySpark大数据分析实战》图书上线啦 特殊的日子 不知不觉一转眼入驻CSDN已经满一年了&#xff0c;这真是一个充满意义的特殊的日子&…

《python每天一小段》--12 数据可视化《1》

欢迎阅读《Python每天一小段》系列&#xff01;在本篇中&#xff0c;将使用Python Matplotlib实现数据可视化的简单图形。 文章目录 一、概念&#xff08;1&#xff09;安装matplotlib&#xff08;2&#xff09;数据可视化实现步骤 二、绘制简单的折线图&#xff08;1&#xff…

在无网络的VMware CentOS7上传并运行Swing Jar文件的方案

文章目录 前言1、配置VNC环境1.1、下载tigervnc-server1.2、下载xorg-x11-xauth1.4、安装1.4.1、安装tigerVNC1.4.2、安装xorg-x11-xauth 1.5、测试vncserver1.6、关闭防火墙 2、安装UltraVNC3、连接UltraVNC4、执行jar文件4.1、生成jar包4.2、运行jar包4.3、解决无法连接错误 …

Java线程概念详解

线程 概念 1.程序:未解决某种问题,使用计算机语言编写的一些列指令(代码)的集合 2.进程:正在运行的程序(被加载到内存中),是操作系统进行资源分配的最小单位 3.线程:进程可以进一步细化为线程(比进程更小)且线程是隶属于进程的,是操作系统执行的最小的执行单元 也是cpu进行任…

通过Nginx的log日志对站点进行数据统计

文章目录 前言统计独立ip访问数量查看访问最频繁的前100个IP查看访问100次以上的IP查询某个IP的详细访问情况,按访问频率排序统计所有的PV数统计当天的PV数查看访问最频的页面(TOP100)每分钟请求量统计每小时请求量统计可视化报表工具 前言 请自行确认nginx的日志是否开始且知…

HarmonyOS--ArkTS(0)--目录

官方API文档&#xff1a; HarmonyOS应用开发官网 - 华为HarmonyOS打造全场景新服务 华为开发者官方网站_创新从这里开始

deque容器

deque容器 文章目录 deque容器一、头文件二、deque容器基本概念三、deque构造函数四、deque赋值操作五、deque大小操作六、deque插入和删除七、deque数据存取八、deque排序 一、头文件 #include <deque>二、deque容器基本概念 功能: ●双端数组&#xff0c;可以对头端进…

【Python】简单的翻译软件

用translate包和tkinter写一个简单的桌面翻译软件。 1、窗口设置&引入包&#xff1a; from tkinter import * from tkinter.ttk import * from tkinter.messagebox import * import translatewinTk() win.title(翻译) win.geometry("600x400")win.mainloop() …

【PWN】学习笔记(一)【二进制基础】

目录 课程教学一次简单的Hack程序的编译与链接Linux下的可执行文件格式ELF进程虚拟地址空间程序的编译与链接程序的装载与进程的执行x86&amd64汇编简述 课程教学 课程链接&#xff1a;https://www.bilibili.com/video/BV1854y1y7Ro/?vd_source7b06bd7a9dd90c45c5c9c44d12…

C++ queue 和priority_queue

目录 1.什么是queue 2.模拟实现 3.仿函数 模板参数Compare 仿函数 4.什么是priority_queue 模拟实现 1.什么是queue 1.队列是一种容器适配器&#xff0c;专门用于在FIFO上下文(先进先出)中操作&#xff0c;其中从容器一端插入元素&#xff0c;另一端提取元素。 2.队列作为…

APP备案,最新获取安卓签名文件中MD5等信息方法

1.通过签名文件获取SHA1和SHA256 直接通过cmd执行命令 keytool -list -v -keystore xxxxx/xxx/xx/xxx.keystore输入后回车会提示输入密码库口令&#xff0c;直接输入Keystore密码&#xff08;输入过程中终端上不会显示&#xff0c;输完回车就行&#xff09; 2.获取md5 由于…

从线性回归到神经网络

一、线性回归关键思想 1、线性模型 2、基础优化算法 二、线性回归的从零开始实现 在了解线性回归的关键思想之后&#xff0c;我们可以开始通过代码来动手实现线性回归了。在这一节中&#xff0c;我们将从零开始实现整个方法&#xff0c;包括数据流水线、模型、损失函数和小批量…

js判断是否对象自身为空

文章目录 一、前言二、JSON.stringify三、for in 配合 hasOwnProperty四、Object.keys五、Object.getOwnPropertyNames六、Object.getOwnPropertyNames 结合 Object.getOwnPropertySymbols七、Reflect.ownKeys八、最后 一、前言 如何判断一个对象为空&#xff1f; 先上结论&a…

前端面试——CSS面经(持续更新)

1. CSS选择器及其优先级 !important > 行内样式 > id选择器 > 类/伪类/属性选择器 > 标签/伪元素选择器 > 子/后台选择器 > *通配符 2. 重排和重绘是什么&#xff1f;浏览器的渲染机制是什么&#xff1f; 重排(回流)&#xff1a;当增加或删除dom节点&…

深入理解Dubbo-3.高级功能剖析和原理解析

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理&#x1f525;如果感觉博主的文章还不错的话&#xff…

深入理解JavaScript的箭头函数

深入理解JavaScript的箭头函数 在ES6中&#xff0c;JavaScript引入了箭头函数的概念&#xff0c;它提供了一种更简洁的语法来定义匿名函数。虽然箭头函数看起来很简单&#xff0c;但它们在实际应用中有一些独特的特性和行为。让我们深入理解箭头函数并学习如何正确地使用它们。…

ES6之Map对象

ES6提供了 Map数据结构。它类似于对象&#xff0c;也是键值对的集合。但是“键”的范围不限于字符串&#xff0c;各种类型的值&#xff08;包括对象&#xff09;都可以当作键。 创建方法 let m new Map()console.log(m)Map的方法 1.set( ) 添加元素 接收两个参数&#xff0c…