Mybatis学习-day19

news2024/11/25 4:56:37

Mybatis学习-day19

1. resultMap

resultMap 是 MyBatis 中最复杂的元素,主要用于解决实体类属性名与数据库表中字段名不一致的情况,可以将查询结果映射成实体对象。

<resultMap id="staffAndDep" type="com.easy.bean.Staff">
        <association column="dep_id" select="getStaffDep" property="dep"></association>
</resultMap>
<select id="getStaffDep" resultType="com.easy.bean.Department">
    select * from department where id = #{dep_id};
</select>
<!--一对一或一对多查询需要指定映射方式   resultMap-->
<select id="getStaffAndDep" resultMap="staffAndDep">
    select * from staff
</select>

这段代码展示了在MyBatis中如何使用resultMap来处理一对一的关联查询。在这个例子中,Staff(员工)和Department(部门)之间存在一对一的关系,即每个员工属于一个部门。这里使用了resultMap<association>标签来定义这种关系,并通过一个嵌套的查询(即N+1查询问题的一个实例)来获取员工及其对应的部门信息。

  1. resultMap
    • id="staffAndDep": 这是resultMap的唯一标识符,用于在<select>标签中引用。
    • type="com.easy.bean.Staff": 指定了结果映射到的Java类型,这里是Staff类。
  2. association
    • column="dep_id": 指定了Staff表中用于连接Department表的列名,这里是dep_id,即员工的部门ID。
    • select="getStaffDep": 这是一个嵌套查询的引用,表示MyBatis将执行getStaffDep这个<select>查询来获取与dep_id对应的Department信息。
    • property="dep": 指定了Staff类中用于存放获取到的Department对象的属性名,这里是dep
  3. getStaffDep查询
    • resultType="com.easy.bean.Department": 指定了查询结果应该映射到的Java类型,这里是Department类。
    • 查询语句select * from department where id = #{dep_id};:这是一个简单的SQL查询,根据传入的dep_iddepartment表中检索对应的部门信息。
  4. getStaffAndDep查询
    • 使用resultMap="staffAndDep"指定了结果应该按照staffAndDep这个resultMap的规则来映射。
    • 查询语句select * from staff:从staff表中选择所有列,但需要注意的是,由于使用了resultMap和嵌套查询,MyBatis实际上会根据dep_id对每个员工执行额外的查询来获取其部门信息。

2. 动态SQL

动态 SQL 只有几个基本元素,与 JSTL 或 XML 文本处理器相似,十分简单明了,大量的判断都可以在 MyBatis 的映射 XML 文件里配置,以达到许多需要大量代码才能实现的功能。

动态 SQL 大大减少了编写代码的工作量,更体现了 MyBatis 的灵活性、高度可配置性和可维护性。

在这里插入图片描述

使用如下所示

MyBatis 中动态语句 choose-when-otherwise 类似于 Java 中的 switch-case-default 语句。由于 MyBatis 并没有为 if 提供对应的 else 标签,如果想要达到<if>…<else>…</else> </if> 的效果,可以借助 <choose>、<when>、<otherwise> 来实现。

<select id="getStaffBySalary" resultType="com.easy.bean.Staff">
    select * from staff
    <where>
        /*参数名  salarytext*/
        <choose>
            <when test='salarytext == "低"'>
                salary &lt;= 8000
            </when>
            <when test='salarytext == "中"'>
                salary &gt; 8000 and salary &lt;= 12000
            </when>
            <otherwise>
                salary &gt; 12000
            </otherwise>
        </choose>
    </where>
</select>

<update id="editStaffItem">
    update staff
    <set>
        <if test='name != null and name != ""'>
            name = #{name},
        </if>
        <if test='salary != null'>
            salary = #{salary},
        </if>
    </set>
    <where>
        id = #{id}
    </where>
</update>

foreach循环

<insert id="addList">
    insert into staff(code, name, salary, username, userpass)
    values
    <foreach collection="list" item="item" separator=",">
        (#{item.code}, #{item.name}, #{item.salary}, #{item.username}, #{item.userpass})
    </foreach>
</insert>

3. MyBatis缓存

3.1 一级缓存

MyBatis 提供了一级缓存和二级缓存的支持。默认情况下,MyBatis 只开启一级缓存

一级缓存是基于 PerpetualCache(MyBatis自带)的 HashMap 本地缓存,作用范围为 SQLession 域内。当 session flush(刷新)或者 close(关闭)之后,该 session 中所有的 cache(缓存)就会被清空。

在参数和 SQL 完全一样的情况下,我们使用同一个 SqlSession 对象调用同一个 mapper 的方法,往往只执行一次 SQL。因为使用 SqlSession 第一次查询后,MyBatis 会将其放在缓存中,再次查询时,如果没有刷新,并且缓存没有超时的情况下,SqlSession 会取出当前缓存的数据,而不会再次发送 SQL 到数据库。

由于 SqlSession 是相互隔离的,所以如果你使用不同的 SqlSession 对象,即使调用相同的 Mapper、参数和方法,MyBatis 还是会再次发送 SQL 到数据库执行,返回结果。

3.2 二级缓存

二级缓存是全局缓存,作用域超出 SQLsession 范围之外,可以被所有 SqlSession 共享。手动开启

<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true" />

在这里插入图片描述

4. 其他

4.1 标准的sql执行顺序

FROM —> ON —> (LEFT/RIGHT) JOIN —> WHERE (BETWEEN…AND…/IN) —> GROUP BY —> HAVING —> SELECT —> DISTINCT —> ORDER BY (ASC/DESC) —> LIMIT

4.2 JSP九大内置对象

request,response,session,application,page,pageContext,config,out,exception

1、request对象
request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。request对象的作用域为一次请求。

2、response对象
response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域,它只在JSP页面内有效。

3、session对象
session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。

4、application对象
application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象生命周期更长,类似于系统的“全局变量”。

5、out 对象
out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。

6、pageContext 对象
pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。

7、config 对象
config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时,容器把某些信息通过 config对象传递给这个 Servlet。 开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。

8、page 对象
page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针。

9、exception 对象
exception 对象的作用是显示异常信息,只有在包含 isErrorPage=“true” 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。excepation对象和Java的所有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。在Java程序中,可以使用try/catch关键字来处理异常情况; 如果在JSP页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。

4.3 delete与truncate的区别

1- 功能不同:delete用于删除表中的记录,truncate删除表再重建

2- 影响自增:delete自增不会重置,truncate会重置

3- 事务支持:delete可以回滚,truncate不能回滚

4- 效率:delete慢,truncate快

4.4 请求转发与重定向的区别

1- 发生位置:请求转发发生在服务器内部,是服务器行为;重定向是服务器指挥浏览器,发生在浏览器中。

2- 请求次数:请求转发只有一次请求;重定向要发送两次请求。

3- 浏览器地址:请求转发浏览器地址不变;重定向浏览器会指向重定向后的地址。

4- 请求对象:请求转发多页面共享一对request和response,可以使用request共享数据;重定向每次请求创建不同的request和response,不能使用request共享数据。

5- 范围:请求转发只能在当前项目内进行跳转;重定向可以跨站跳转

4.5 Get与Post请求的区别

1) Get请求参数会使用?和&拼接到url上。Post请求参数放在请求体的Form Data数据域中。

2) Get请求参数必须是字符串。Post请求参数除了可以传递字符串类型的,也可以传递二进制。

3) Get请求参数的长度会受到url长度的限制。Post请求参数长度不会受到客户端浏览器的限制,只要服务器允许。

Get与Post请求的区别

1) Get请求参数会使用?和&拼接到url上。Post请求参数放在请求体的Form Data数据域中。

2) Get请求参数必须是字符串。Post请求参数除了可以传递字符串类型的,也可以传递二进制。

3) Get请求参数的长度会受到url长度的限制。Post请求参数长度不会受到客户端浏览器的限制,只要服务器允许。

4) Get安全性低。Post相对安全。

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

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

相关文章

apache 漏洞

影响版本 Apache HTTP Server 2.4.49 某些Apache HTTPd 2.4.50也存在此漏洞 环境搭建 docker pull blueteamsteve/cve-2021-41773:no-cgid 漏洞复现 http://1.15.136.212:8080 1.使⽤poc curl http://1.15.136.212:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd

在没有硬盘的情况下进行电脑数据迁移

电脑数据迁移方式 在更换电脑的时候需要进行文件的传输&#xff0c;但是没有硬盘可以选择使用网线直连或者无线文件共享。通用配置 1.将旧电脑的文件夹或者磁盘设置文件共享 找到指定的文件夹右键属》属性&#xff0c;点击共享》点击高级共享 选择共享文件夹以及修改共享用户…

缓冲区和文件IO--linux系统调用

缓冲区&#xff1a; 缓冲区是一块内存区域&#xff0c;用于存储数据&#xff0c;直到数据被真正写入到文件或设备中&#xff0c;或从文件或设备中读取。这种机制使得程序可以一次处理较大的数据块&#xff0c;而不是频繁地进行较小的I/O操作。 缓冲模式&#xff1a; 全缓冲&…

学习LLM大模型,不容错过的《大语言模型:基础与前沿》(附PDF下载)

前言 就目前来看&#xff0c;大量工作正逐渐被大型语言模型&#xff08;LLM&#xff09;所替代&#xff0c;就比如文本自动生成、智能客服、数据分析和预测等多个领域。这暗示着LLM正逐步成为支撑社会运作的关键基础设施。未来&#xff0c;比Devin更为智能的LLM将会问世。我们…

ARMxy 智能控制器:工业自动化的创新解决方案

工业自动化对控制器的要求也越来越高。ARMxy 智能控制器集成了 PLC 控制和 4G 边缘计算网关&#xff0c;具有多合一的功能&#xff0c;为工业自动化提供了创新的解决方案。 ARMxy 智能控制器的 PLC 控制功能使其能够实现对工业生产过程的精确控制。它可以接收各种传感器的信号…

mapbox-gl 实现绘制图形吸附功能

文章目录 一、前言二、实现代码 一、前言 mapbox-gl 为地图前端框架&#xff0c;以优美的地图样式著称。mapbox-gl-draw 插件可以实现绘制图形&#xff0c;编辑图形的功能&#xff0c;但是编辑图形时无法吸附点位&#xff0c;导致相邻面无法相接。使用mapbox-gl-draw-snap-mod…

JS+CSS案例:用CSS+JS做漂亮的拟真时钟

JSCSS案例&#xff1a;用CSSJS做漂亮的拟真时钟 今天给大家分享一个挺酷的CSSjs模拟的时钟。 案例效果图&#xff1a; 案例分析 通过CSS画一个表的外观&#xff0c;通过JS获取当前时间&#xff0c;并控制表针做对应角度的旋转。 制作时钟外观 HTML结构 首先&#xff0c;我…

python实现小游戏随机猜数

1、脚本练习 import random# 初始化剩余的猜测次数 counts 3 # 生成一个1到10之间的随机整数 numb random.randint(1, 10)# 循环直到猜测次数用完 while counts > 0:tmp input("请输入小鱼手里的数字 (你还剩下 {} 次机会): ".format(counts))guess int(tmp)…

精通剪辑艺术,2024年度四大必备剪辑软件推荐!

在这个视觉为王的时代&#xff0c;视频内容的创作和编辑已经成为了一种艺术形式。无论是个人创作者还是专业团队&#xff0c;都在寻找能够提升工作效率和创作质量的工具。今天&#xff0c;就让我们一起探索几款市面上广受好评的视频剪辑工具&#xff0c;它们将帮助你将创意变为…

测试总结8/6

1.签到 判断其大小写是否与之相等 #include<bits/stdc.h> using namespace std; long long t,x,y; int ans,n,m,k0; const int N2e57; int s[N]; string sum; string num"CodeForces"; int main() {cin>>n;for(int i1; i<n; i) {cin>>sum;int …

细腻呵护静音生活缓冲器,家具中的隐形侍者

在忙碌的生活节奏中&#xff0c;家是我们寻找宁静与放松的避风港。而家具缓冲器&#xff0c;就像一位隐形的侍者&#xff0c;在不经意间为我们营造出温馨、宁静的居住环境。它们静静地工作&#xff0c;细腻地呵护着每一处细节&#xff0c;让家的每一次触碰成为一次尊享体验。 细…

当上领导,不可不懂的3大管人法则

当上领导&#xff0c;不可不懂的3大管人法则&#xff0c;精辟&#xff01; 法则一&#xff1a;软硬都要 在团队管理中&#xff0c;只硬不软或只软不硬都无法达到理想的效果。 只有软硬兼施&#xff0c;刚柔并济&#xff0c;才能四两拨千斤&#xff0c;根据不同的情况和员工&a…

深入解析数据仓库ADS层-从理论到实践的全面指南

在大数据时代,数据仓库已经成为企业进行数据分析和决策的核心系统。而在数据仓库的分层架构中,ADS(Application Data Store)层作为最上层的数据应用层,直接面向业务应用和分析需求,其重要性不言而喻。然而,很多数据从业者对ADS层的理解还停留在表面,不清楚如何构建高效的ADS层来…

2024年全国青少信息素养大赛python编程复赛集训第十一天编程题分享

整理资料解析答案非常不容易,感谢各位大佬给个点赞和分享吧,谢谢 今天题目较简单:适合小学组 大家如果不想阅读前边的比赛内容介绍,可以直接跳过:拉到底部看集训题目 (一)比赛内容: 【小学组】 1.了解输入与输出的概念,掌握使用基本输入输出和简单运算 为主的标准…

归并排序+堆,P1631 序列合并

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 序列合并 - 洛谷 二、解题报告 1、思路分析 不难想到 a[0] b[0] < a[0] b[1] < a[0] b[2] < ... < a[0] b[n - 1] a[1] b[0] < a[1] b[1] < a[1] b[2] < ... < a[1] b[n…

如何拯救LoRA初始化?LoRA-GA:性能显著提升+收敛速度更快!

文章链接&#xff1a;https://arxiv.org/pdf/2407.05000 亮点直击 提出了 LoRA-GA&#xff0c;一种新颖的 LoRA 初始化方法&#xff0c;通过近似低秩矩阵的梯度与全权重矩阵的梯度来加速收敛。确定了在非零初始化下的缩放因子&#xff0c;该因子确保适配器输出的方差不受适配器…

PCIe学习笔记(17)

延迟容忍报告(LTR)消息 LTR消息可选地用于报告有关其读/写服务延迟容忍度的设备行为。 &#xff08;通过 LTR&#xff0c;PCIe 设备可以告知系统它们能容忍的最大响应延迟是多少&#xff0c;只要系统在这个时间之内对 PCIe 设备提出的请求做出响应即可。&#xff09; LTR消息…

统信UOS微信常见问题

统信UOS微信常见问题 1. 家庭版如何激活&#xff1f; ①注册Union ID账号 ②绑定微信 ③登录Union ID激活系统 2. 应用商店微信qq下载失败&#xff0c;进行系统更新&#xff0c;提示依赖错误&#xff0c;检查更新失败怎么解决&#xff1f; 问题描述 安装应用商店内的应用无法…

【Linux操作系统】关于深度睡眠与浅度睡眠进程的理解

目录 一、可中断的睡眠状态&#xff08;S浅度睡眠状态&#xff09;二、不可中断的睡眠状态&#xff08;D深度睡眠状态&#xff09;三、关于S浅度睡眠状态与D深度睡眠状态的理解 一、可中断的睡眠状态&#xff08;S浅度睡眠状态&#xff09; S&#xff08;sleeping&#xff09;…

利用阿里云镜像仓库创建属于自己的私有镜像仓库

阿里云官网&#xff1a;https://www.aliyun.com/ 在阿里云官网注册账号&#xff0c;然后进入控制台 选择容器镜像服务 创建命名空间 创建镜像仓库 选择命名空间&#xff0c;仓库类型&#xff08;设为私有的话&#xff0c;镜像不能随意拉取&#xff09; 点管理 按以下步骤将…