8月6日Spring Boot学习笔记

MyBatis动态SQL

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

if标签

        <if test="判断条件">SQL语句</if>  当判断条件为 true 时,才会执行所包含的 SQL 语句。

choose、when和otherwise标签

<select id="getStaffBySalary" resultType="com.easy.bean.Staff">select * from staff <where><!-- 参数 salarytext --><choose><!-- 字符串要用""包裹,test内容用''包裹 --><when test='salarytext=="低" '><!-- 标签内使用大于小于会被认为是标签 -->salary &lt;= 5000</when><when test='salarytext=="中" '>salary &gt; 5000 and salary &lt;= 8000</when><otherwise>salary &gt; 8000</otherwise></choose></where></select>

where标签

        where 标签主要用来简化 SQL 语句中的条件判断,可以自动处理 AND/OR 条件。

set标签

        在 Mybatis 中,update 语句可以使用 set 标签动态更新列。set 标签可以为 SQL 语句动态的添加 set 关键字,剔除追加到条件末尾多余的逗号。

<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标签

        foreach 标签用于循环语句,它很好的支持了数组和 List、set 接口的集合,并对此提供遍历的功能。

1.item:表示集合中每一个元素进行迭代时的别名。

2.index:指定一个名字,表示在迭代过程中每次迭代到的位置。

3.open:表示该语句以什么开始(既然是 in 条件语句,所以必然以(开始)。

4.separator:表示在每次进行迭代之间以什么符号作为分隔符(既然是 in 条件语句,所以必然以,作为分隔符)。

5.close:表示该语句以什么结束(既然是 in 条件语句,所以必然以)开始)。

<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>

注意:使用 foreach 标签时,最关键、最容易出错的是 collection 属性,该属性是必选的,但在不同情况下该属性的值是不一样的,主要有以下 3 种情况:

        1.如果传入的是单参数且参数类型是一个 List,collection 属性值为 list。

        2.如果传入的是单参数且参数类型是一个 array 数组,collection 的属性值为 array。

        3.如果传入的参数是多个,需要把它们封装成一个 Map,当然单参数也可以封装成 Map。Map 的 key 是参数名,collection 属性值是传入的 List 或 array 对象在自己封装的 Map 中的 key。

bind标签

        自定义一个上下文变量。

<select id="getStaff" resultType="com.easy.bean.Staff">select * from staff<!-- 根据参数不同,应该组合出不同的sql语句    动态sql语句 标签 --><where><!-- 编写条件语句  如果where标签有内容会自动添加where关键字 --><if test="checktext !=null and checktext !=''"><!-- 定义临时变量参数 --><bind value="'%'+checktext+'%'" name="liketext"></bind>name like #{liketext}</if></where></select>

trim标签

        trim 一般用于去除 SQL 语句中多余的 AND 关键字、逗号,或者给 SQL 语句前拼接 where、set 等后缀,可用于选择性插入、更新、删除或者条件查询等操作。

resultMap元素

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

一对一关联查询

        通过 <resultMap> 元素的子元素 <association> 处理一对一级联关系

package com.easy.bean;import java.io.Serializable;
import java.math.BigDecimal;import org.apache.ibatis.annotations.Param;public class Staff implements Serializable{private int id;private int code;private String name;private BigDecimal salary;private String username;private String userpass;private Department dep;public Department getDep() {return dep;}public void setDep(Department dep) {this.dep = dep;}public int getId() {return id;}public void setId(int id) {this.id = id;}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getName() {return name;}public void setName(String name) {this.name = name;}public BigDecimal getSalary() {return salary;}public void setSalary(BigDecimal salary) {this.salary = salary;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getUserpass() {return userpass;}public void setUserpass(String userpass) {this.userpass = userpass;}}
<!-- 一对一或一对多查询要制定映射方式  resultMap -->
<select id="getStaffAndDep"  resultMap="staffanddep">select * from staff
</select><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>

<association> 元素中通常使用以下属性:

        1.property:指定映射到实体类的对象属性。

        2.column:指定表中对应的字段(即查询返回的列名)。

        3.javaType:指定映射到实体对象属性的类型。select里指定类型就没必要了。

        4.select:指定引入嵌套查询的子 SQL 语句,该属性用于关联映射中的嵌套查询。

一对多关联查询

        通过 <resultMap> 元素的子元素 <collection> 处理一对多级联关系,collection 可以将关联查询的多条记录映射到一个 list 集合属性中。

package com.easy.bean;import java.io.Serializable;
import java.util.List;public class Department implements Serializable{private List<Staff> stafflist;public List<Staff> getStafflist() {return stafflist;}public void setStafflist(List<Staff> stafflist) {this.stafflist = stafflist;}private int id;private String code;private String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getName() {return name;}public void setName(String name) {this.name = name;}}
<select id="getDep"  resultMap="depAndStaff">select * from department
</select>
<resultMap id="depAndStaff" type="com.easy.bean.Department"><!-- 将id作为查询条件,使用id为getDepStaff的查询语句,将结果设置到stafflist属性上 --><!-- 将id这一列通过getDepStaff语句映射到stafflist,id映射结束,对数据库下一列映射 --><!-- 所以如果之前不在指定映射id,那么类的属性id将不会被数据库id映射 --><result column="id" property="id"></result><collection column="id" select="getDepStaff" property="stafflist"></collection></resultMap><select id="getDepStaff" resultType="com.easy.bean.Staff">select * from staff where dep_id=#{id};</select>

<collection> 元素中通常使用属性与<association>一致。

一对一映射属性

        <!-- 一对一  列映射属性-->
        <!-- <id column="id" property="depid"></id> 必须是主键-->
        <!-- <result column="id" property="id"></result> -->

resultType和resultMap的区别

        MyBatis 的每一个查询映射的返回类型都是 resultMap,只是当我们提供的返回类型是 resultType 时,MyBatis 会自动把对应的值赋给 resultType 所指定对象的属性,而当我们提供的返回类型是 resultMap 时,MyBatis 会将数据库中的列数据复制到对象的相应属性上,可用于复制查询。

MyBatis缓存(一级缓存和二级缓存)

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

一级缓存

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

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

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

二级缓存

        二级缓存是全局缓存,作用域超出 SQLsession 范围之外,可以被所有 SqlSession 共享。手动开启,在会话关闭,数据更新(增删改)、应用重启、事务结束会清空。

属性说明:

使用一、二级缓存好处

        1.合理使用缓存可以显著提高应用程序的响应速度和处理能力。

        2.数据重用,减少MySQL负担

懒加载

        <!-- 懒加载:先不执行对一对一一对多对象的查询,等需要使用这些对象时候再一一查询,需要第一个查第一个,需要第二个再查第二个 -->
        <!-- 减少mysql负担,减轻程序运行压力 -->

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tomcat文件上传漏洞练习

1、靶场账号注册 vulfocus 注册后邮箱中点击激活 2、首页选择并开启靶场 复制映射的ip和端口 在浏览器输入ip和端口 改成put并把1.jsp中内容复制进去 3打开哥斯拉&#xff0c;连接上面的网址

【PyTorch】深度学习PyTorch环境配置及安装【详细清晰】

文章目录 概要步骤Anaconda安装管理环境 安装PyTorchPyTorch环境使用JupyterJupyter简介安装Jupyter及使用 我的部分版本 概要 搭建PyTorch环境用于深度学习 步骤 Anaconda安装 安装详情&#xff1a;https://blog.csdn.net/Q20011102/article/details/127831950 我安装的是…

书生大模型实战营-入门关卡-Python 基础知识

任务&#xff1a; https://github.com/InternLM/Tutorial/blob/camp3/docs/L0/Python/task.md 完成&#xff1a; 任务1&#xff1a;Python实现wordcount import re from collections import defaultdictdef wordcount(text):# 转换为小写并使用正则表达式分割单词words re.…

【简历】宜春某二本学院:Java简历指导,秋招简历通过率低

简历说明 这是一个25届的二本宜春某学院的这个Java简历&#xff0c;今天看了两个简历&#xff0c;包括前面个985的&#xff0c;也是12306&#xff0c;这个12306已经烂大街&#xff0c;是个人都知道这个项目了&#xff0c;所以不要放在简历上&#xff0c;你不管大厂中厂还是小公…

【Redis进阶】Redis的持久化RDB和AOF

目录 持久化 RDB持久化 概念 原理 RDB 持久化的详细工作流程 1触发持久化&#xff1a; 2创建子进程&#xff1a; 3数据写入 RDB 文件&#xff1a; 4替换旧文件&#xff1a; 5回收子进程&#xff1a; RDB持久化的触发方式 1.手动触发&#xff1a; 2.自动触发&#…

FFmpeg推流

目录 一. 环境准备 二. 安装FFmpeg 三. 给docker主机安装docker服务 四. 使用 FFmpeg 进行推流测试 FFmpeg是一个非常强大的多媒体处理工具&#xff0c;它可以用于视频和音频的录制、转换以及流处理。在流处理方面&#xff0c;FFmpeg可以用来推流&#xff0c;即将本地媒体…

【第17章】Spring Cloud之Gateway服务调用

文章目录 前言一、用户服务二、网关服务1. 负载均衡2. 服务调用3. 登录拦截器 三、单元测试1. 启动服务2. 用户不存在3. 正常登录 总结 前言 在上一章我们使用JWT简单完成了用户认证&#xff0c;【第16章】Spring Cloud之Gateway全局过滤器(安全认证)&#xff0c;上一章内容已…

端点区间影响

前言&#xff1a;这一题本来想就是直接来一个前缀和来写&#xff0c;直接左边加一&#xff0c;右边减一&#xff0c;但是细想好像有问题&#xff0c;我们平时做的题目左边端点造成的影响会对这一段区间造成影响&#xff0c;但是这一题的话超过了左边端点就不会有影响了 那这一题…

vue3-ts:husky + prettier / 代码格式化工具

一、Prettier简介 Prettier是一个流行的代码格式化工具&#xff0c;它的主要作用是帮助开发者自动规范化代码的格式&#xff0c;提高代码的可读性和一致性。Prettier通过解析代码并使用自己的规则重新打印它&#xff0c;以确保代码风格的一致性和符合预设的格式化标准。 二、…

WPF学习(8)- Button按钮

1. 用法解析 Button因为继承了ButtonBase&#xff0c;而ButtonBase又继承了ContentControl&#xff0c;所以&#xff0c;Button可以通过设置Content属性来设置要显示的内容。例如 <Button Content"确定"/>我们使用Button的时机&#xff0c;通常是鼠标点击事件…

【Dash】使用 dash_mantine_components 创建图表

一、Styling Your App The examples in the previous section used Dash HTML Components to build a simple app layout, but you can style your app to look more professional. This section will give a brief overview of the multiple tools that you can use to enhan…

树莓派5进行YOLOv8部署的4种不同部署方式检测速度对比:pytorch、onnx、ncnn、tflite

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

Python 异步编程:Asyncio 实现原理

常见的并发模型 多进程/多线程异步ActorPub/Sub Python 异步的基石&#xff1a;协程 协程简介 概念&#xff1a;协作式多任务的子程序&#xff0c;用户态线程或微线程&#xff08;Coroutine&#xff09;。 特点&#xff1a;子程序执行可以中断&#xff0c;恢复后不会丢失之…

生物反应器对Organoids培养有啥帮助?有几种?快来看看!

Bioreactor Technologies for Enhanced Organoid Culture是《INTERNATIONAL JOURNAL OF MOLECULAR SCIENCES》上的一篇文章&#xff0c;介绍了用于类器官培养的生物反应器&#xff0c;包括搅拌式、微流体、旋转壁容器和电刺激四类。搅拌式生物反应器通过改善氧合和实现适当的谱…

【iOS多线程(二)】GCD其他方法详解

GCD其他方法 dispatch_semaphore &#xff08;信号量&#xff09;什么是dispatch_semaphore(信号量)?dispatch_semaphore主要的三个方法dispatch_semaphore主要作用线程安全线程同步 dispatch_afterdispatch_time_t 两种形式 GCD 一次性代码&#xff08;只执行一次&#xff09…

面向 RAG 应用开发者的实用指南和建议

向量搜索并非轻而易举&#xff01; 向量搜索&#xff0c;也称为向量相似性搜索或最近邻搜索&#xff0c;是一种常见于 RAG 应用和信息检索系统中的数据检索技术&#xff0c;用于查找与给定查询向量相似或密切相关的数据。业内通常会宣传该技术在处理大型数据集时非常直观且简单…

【C语言】C语言期末突击/考研--结构体与C++引用

一、结构体--结构体对齐--结构体数组 1.1.结构体的定义、初始化、结构体数组 有时候需要将不同类型的数据组合为一一个整体&#xff0c;以便于引用。 例如&#xff0c;一名学生有学号、姓 名、性别、年龄、地址等属性&#xff0c;如果针对学生的学号、姓名、年龄等都单独定义一…

【MYSQL】表操作

目录 查看当前数据库含有表查看表结构创建表插入&#xff08;新增create&#xff09;查询&#xff08;retrieve&#xff09;全列查询指定列查询查询列是表达式别名查询(as)去重查询(distinct)排序查询(order by)条件查询(where)比较/逻辑运算符使用 分页查询(limit) 一条语句各…

【若依项目-RuoYi】掌握若依前端的基本流程

搞毕设项目&#xff0c;使用前后端分离技术&#xff0c;后端springBoot&#xff0c;前端vue3element plus。自己已经写好前端与后端代码&#xff0c;但想换一个前端界面所以使用到了若依&#xff0c;前前后后遇到许多坑&#xff0c;记录一下&#xff0c;方便之后能够快速回忆。…