8月6日Spring Boot学习笔记

news2024/12/27 11:59:10

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.coloradmin.cn/o/1987074.html

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

相关文章

我在杭州的Day30_进程间通信(IPC)——20240805

一、相关练习 1.使用有名管道实现&#xff0c;一个进程用于给另一个进程发消息&#xff0c;另一个进程收到消息后&#xff0c;展示到终端上&#xff0c;并且将消息保存到文件上一份 1.1> 01homework.c #include <myhead.h>int main(int argc, const char *argv[]) …

怎么实现外地分公司与总公司软件连接?

为了确保外地分公司能够顺利连接总公司的管理软件和财务软件&#xff0c;建立一个安全可靠的网络基础设施是必不可少的。首先&#xff0c;我们可以通过搭建虚拟专用网络来实现分公司与总公司内部网络的互联互通。虚拟专用网络不仅能够保障数据传输的安全性&#xff0c;还能提供…

SpringBoot简单项目(二维码扫描)

pom.xml中导入依赖 <!-- zxing --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.0</version></dependency><dependency><groupId>com.google.zxing</gro…

systemd-manage系统服务图形化管理工具使用教程

1. systemd-manage介绍 systemd-manage是一个开源的基于systemd服务管理的图形化工具&#xff0c;使用qt图形库进行开发&#xff0c;可以提供服务管理&#xff0c;用户会话&#xff0c;配置文件修改&#xff0c;日志查询&#xff0c;性能分析&#xff0c;进程管理等功能。图形…

【Pyautogui自动准备jupyter】附上报错合集,已解决

刚认识了pyautogui&#xff0c;浅浅写一段自动准备jupyter的程序 import pyautogui #import pyperclip import timedef open_jupyter():print(Opening jupyter...)time.sleep(1)try:location pyautogui.locateOnScreen(r"D:\STEFANOS\python\tools\auto\icons\jupyter…

SpringCloud入门简介

1. SpringCloud是什么 SpringCloud是微服务治理方案之一&#xff1b; SpringCloud与SSM框架和SpringBoot没什么关联 SSM&#xff1a;web应用的开发框架&#xff0c;包含视图层&#xff08;模型model视图view控制器controller&#xff09;&#xff0c;业务层&#xff0c;持久…

unity草体渲染方案 GPU Instaning

有一天看项目里的FrameDebug发现在森林系的场景里草体的drawcall差不多有100多 主要是因为灯光贴图&#xff0c;位置等不一样导致的打断合批&#xff0c;导致一个批次只能渲染10个左右的草体 之前有了解过unity有接口&#xff08;Graphics.DrawMeshInstanced&#xff09;可以把…

SpringBoot 框架学习笔记(七):Thymeleaf、拦截器 和 文件上传实现(解决了文件重名 和 按日期分目录存放问题)

1 Thymeleaf 1.1 基本介绍 &#xff08;1&#xff09;官方文档&#xff1a;Tutorial: Using Thymeleaf &#xff08;2&#xff09;Thymeleaf 是什么 Thymeleaf 是一个跟 Velocity、FreeMarker 类似的模板引擎&#xff0c;可完全替代 JSPThymeleaf 是一个 java 类库&#xf…

AnyGo(虚拟定位软件) for MacOS苹果电脑安装下载 支持最高系统 兼容M芯片

AnyGo for Mac是一款专为Mac用户设计的虚拟定位软件。它允许用户在Mac设备上模拟GPS位置&#xff0c;从而改变设备在各种基于位置的应用和服务中的显示位置。AnyGo提供了简单直观的操作界面&#xff0c;用户可以轻松地在地图上选择任意地点作为模拟位置&#xff0c;或者通过输入…

【平衡二叉树】数据结构—平衡二叉树

平衡二叉树&#xff08;Balanced Binary Tree&#xff09;是一种特殊的二叉树&#xff0c;它的左右子树的高度差不超过1&#xff0c;这样可以保证树的高度相对较低&#xff0c;从而使得查找、插入和删除操作的时间复杂度保持在 。 平衡二叉树的基本概念 1. 二叉树&#xff1a…

LeetCode 热题 HOT 100 (020/100)【宇宙最简单版】[创作中]

【链表】No. 0142 环形链表 II【中等】&#x1f449;力扣对应题目指路 希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&#…

C++ 简单学习

C简单编译 auto关键字 auto 关键字用于自动类型推导。它允许编译器自动推断变量的类型&#xff0c;使得代码更加简洁和易于编写&#xff0c;尤其是在处理复杂类型或模板编程时。使用 auto 可以避免编写冗长的类型声明&#xff0c;同时减少由于类型不匹配导致的编译错误 auto x…

学习vue3 三,组件基础,父子组件传值

组件基础 每一个.vue 文件都可以充当组件来使用 每一个组件都可以复用 父组件引入之后可以直接当标签使用 案例&#xff1a; App.vue <script setup lang"ts"> import BaseRefAndReactive from "./components/BaseRefAndReactive.vue";</sc…

Docker部署Node+Koa+TS+Mongo项目

Docker 简介 简而言之&#xff0c;Docker 容器轻量级、启动快、可移植&#xff0c;适合微服务架构。主要组件包括 Docker Engine、Docker 镜像、Docker 容器和 Docker Hub&#xff0c;它通过容器打包应用程序及其依赖项&#xff0c;使得应用在任何环境中都能一致运行。 这里不…

Selenium中send_keys上传图片方法以及可能失败的原因

Python Selenium是一个用于自动化浏览器操作的工具&#xff0c;可以用于模拟用户在浏览器中的各种操作。在使用Python Selenium进行自动化测试时&#xff0c;有时需要上传图片。下面是在这种情况下如何上传图片的步骤&#xff1a; 今天是主要说的是input标签&#xff0c;这种可…

基于R语言绘制GGE双标图3

参考资料&#xff1a; https://cran.r-project.org/web/packages/GGEBiplots/GGEBiplots.pdf GGE叠图法一分析品种环境互作模式的理想方法【作物学报】 GGE 双标图如何看&#xff1f;-CSDN博客 1、品种间两两比较 GGE 双标图可用于直接比较两个品种在各个试验点的表现&…

白银市场暴跌的技术分析与投资策略

一、白银市场暴跌与技术分析 周一&#xff08;8月5日&#xff09;&#xff0c;现货白银暴跌逾4.5%&#xff0c;并跌破关键的100日移动均线。FXStreet分析师Christian Borjon Valencia对银价技术走势进行了分析&#xff0c;指出银价前景转为看跌&#xff0c;技术面显示白银将进一…

探索Python并发的秘境:Greenlet库的奇幻之旅

文章目录 探索Python并发的秘境&#xff1a;Greenlet库的奇幻之旅背景&#xff1a;为何选择Greenlet&#xff1f;绿野仙踪&#xff1a;Greenlet是什么&#xff1f;安装&#xff1a;如何将Greenlet纳入囊中&#xff1f;功能探索&#xff1a;Greenlet的五大法宝场景应用&#xff…

【系统分析师】-综合知识-软件工程与项目管理

1、按照成本性态分类&#xff0c;可以分为固定成本、变动成本和混合成本。 &#xff08;1&#xff09;固定成本。管理人员的工资、办公费、固定资产折旧费、员工培训费、广告费、员工培训费、技术开发经费、办公场地及机器设备的折旧费、房屋及设备租金、管理人员的工资等。 …

提示工程:CO-STAR框架

在人工智能领域&#xff0c;尤其是大型语言模型&#xff08;LLM&#xff09;的应用中&#xff0c;提示工程已成为一项至关重要的技能。它不仅需要对技术有深刻的理解&#xff0c;还需要创造力和战略思维的结合。本文将探讨提示工程的重要性&#xff0c;详细介绍CO-STAR框架的使…