MyBatis进阶

目录

一、实现多表查询

二、#{}和${}

1、#{}和${}的使用

2、#{}和${}的区别

3、${}的使用场景

三、数据库连接池

1、数据库连接池概念

2、常见数据库连接池

3、修改连接池为Hikari

四、动态sql语句--xml

1、if标签

2、tirm标签

3、where标签

4、set标签

5、foreach标签

6、include标签

五、动态sql语句--注解


一、实现多表查询

1、准备两张表

userinfo表:

对应实体类:

articleinfo表:

对应实体类:

2、执行sql语句

若要查articleinfo表中id为1的书信息和用户信息,则需要进行多表查询。

多表查询的sql语句:select ta.id,ta.title,ta.content,ta.uid,tb.username,tb.age,tb.gender,tb.phone from articleinfo ta left join userinfo tb on ta.uid = tb.id where ta.id=1.

这时需要增加ArticleInfo类的属性,从而来接收多表查询的结果。

3、代码实现

4、测试

运行结果:

二、#{}和${}

#{}和${}都可以用于取参数值

1、#{}和${}的使用

(1)Integer类型的参数--根据id查询用户

#{}:

${}:

发现#{}是预编译sql,有?进行占位;${}是即时sql。

(2)String类型的参数--根据username查询用户

#{}:

${}:

当参数是字符串时,${}接收参数时,无法加引号,导致无法识别。

接收参数时将引号加上:

2、#{}和${}的区别

(1)#{}是预编译sql,性能更高;${}是即时sql。

即时sql的步骤:①解析语法和语义,检验sql语法是否正确;②优化sql语句,制定执行计划;③执行并返回结果。

预编译sql与即时sql的区别:一个sql语句若被反复执行或只是参数改变的,每一次执行若都需要经过以上步骤的话,则效率就会下降。此时预编译sql就会进行优化,编译一次sql语句后,就会将sql语句缓存起来,后面再执行这条语句时,不会再次编译,省去了解析优化等过程,直接执行,以此来提高效率。

(2)#{}更安全,${}有sql注入的风险。

sql注入:通过操作输入的参数,从而修改定义好的sql语句,已达到执行代码对服务器的攻击。

eg:根据username查询用户

正常输入username就会查询,但若进行sql注入的话:

'or 1='1一直为真,导致查询到所有结果。此时就是sql注入问题。

3、${}的使用场景

(1)排序功能

查询所有用户,并根据id升序

sql语句:select id,username,'password',age,gender,phone,delete_flag,create_time,update_time from userinfo order by id asc

#{}:

运行结果:

?处不应该有引号,所以不能使用#。

${}:

但需要考虑sql注入的问题,可以考虑升序和降序对应两个url,获取到url后由后台处理参数,客户端不输入参数。

(2)模糊匹配

查询姓名是‘l’开头的用户

sql语句:select id,username,'password',age,gender,phone,delete_flag,create_time,update_time from userinfo where username like '%l%';

#{}:

?处不应该有引号,所以不能使用#。

${}:

但需要考虑sql注入的问题,可以进行字符串拼接:

三、数据库连接池

1、数据库连接池概念

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。

没有使用数据库连接池:每次在执行sql语句时,都需要重新进行数据库连接,建立一个新的连接对象,然后执行sql语句,语句执行完成后,再关闭连接释放资源。再次执行语句时,重复操作。这种重复的创建连接、释放资源比较消耗资源。

使用数据库连接池:程序启动时,会在数据库连接池创建一定数量的连接对象。每次在执行sql语句时,从线程池中拿连接对象,然后执行sql语句,语句执行完成后,再将连接对象放回连接池。减少了资源利用。

2、常见数据库连接池

C3P0、DBCP、Druid、Hikari。

springboot默认使用连接池为Druid

3、修改连接池为Hikari

引入相关依赖即可:

四、动态sql语句--xml

1、if标签

对于有一些属性,有默认值,比如userInfo中的gender的默认值为0,若该属性为非必填字段,如何使得不填值时为默认值,而不是为空值,此时可以使用if标签

(1)不使用if标签,gender不填值效果:

运行结果:

(2)使用if标签,gender不填值效果:

运行结果:

(3)if标签存在的问题

eg:

增加一个phone为空的userInfo对象,运行结果:

既然这样不行,那将逗号移到前面:

增加一个username为空的userInfo对象,运行结果:

我们发现,将逗号移到后面时,当最后一个属性为空时会报错;将逗号移到前面时,当第一个属性为空时会报错。有没有什么方法可以使得第一个属性为空时前面不会多一个逗号,最后一个属性为空时后面不会多一个逗号。考虑trim标签

2、tirm标签

(1)4个属性

(2)使用tirm标签解决上述问题

使用prefixOverrides删除前面多余逗号,使用suffixOverrides删除后面多余逗号;

可以使用prefix加'(',使用suffix加')'。

此时就可以很好的解决逗号问题了。

3、where标签

(1)不使用where标签存在的问题

根据username和age查询用户:

根据姓名为空的userInfo对象进行查询:

和逗号一样的问题,前一个属性为空,导致多出一个and,可以使用where标签解决问题。为什么不使用trim标签解决and问题???因为当属性都为空时,where也需要删除,但trim标签只能规定删除and,不能删除where,而where标签可以做到。

(2)where标签解决问题

此时就可以解决上述问题了。

4、set标签

可以解决在进行update操作时,删除可能多出的逗号,当然trim标签也可以。

5、foreach标签

对集合进行遍历时可以使用该标签。

例如:当需要删除多个用户时,传入的用户id就是一个集合,就需要遍历集合,根据id找到信息,从而进行删除。

运行结果:

6、include标签

可以对重复的代码片段进行抽取,降低冗余性。通过sql标签封装到一个SQL片段,然后再通过include标签进行引用。

代码实现:

include标签使用:

五、动态sql语句--注解

注解方法不推荐使用,单引号问题比较繁琐,且注解和xml的做法大同小异,以delete举个例子就能明白如何写了。

主要是在xml基础上加script标签,但要考虑单引号,不建议使用。

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

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

相关文章

Docker复习笔记

Centos7安装Docker Docker官网:www.docker.com Docker官网仓库:hub.docker.com Docker文档是比较详细的 安装相关依赖 yum -y install gcc gcc-c yum install -y yum-utils 设置docker镜像仓库 yum-config-manager --add-repo https://download.docker.com/linux/centos/do…

云尚办公-0.0.1

1. 核心技术 基础框架:SpringBoot数据缓存:Redis数据库:MySQL权限控制:SpringSecurity工作流引擎:Activiti前端技术:vue-admin-template Node.js Npm Vue ElementUI Axios微信公众号:公众…

【FreeRTOS】任务创建

参考博客: ESP-IDF FreeRTOS 任务创建分析 - [Genius] - 博客园 (cnblogs.com) 1.什么是任务 1)独立的无法返回的函数称为任务 2)任务是无线循环 3)无返回数据 2.任务的实现过程 1.定义任务栈 裸机程序:统一分配到一…

centos7部署单机项目和自启动

centos7部署单机项目和服务器自启动 1.安装jdk和tomact1.1上传jdk、tomcat安装包1.2解压两个工具包1.3.配置并且测试jdk安装1.4.启动tomcat1.5.防火墙设置1.6配置tomcat自启动 2.安装mysql2.1卸载mariadb,否则安装MySql会出现冲突(先查看后删除再查看)2.2在线下载My…

2023年12月CCF-GESP编程能力等级认证C++编程七级真题解析

一、单选题(共15题,共30分) 第1题 定义变量 double x ,如果下面代码输入为 100 ,输出最接近( )。 A:0 B:-5 C:-8 D:8 答案:B 第2题 对于下面动态规划方法实现的函数,以下选项中最适合表达其状态转移函数的为( )。 A: B: C: D:

[LWC] Components Communication

目录 Overview ​Summary Sample Code 1. Parent -> Child - Public Setter / Property / Function a. Public Property b. Public getters and setters c. Public Methods 2. Child -> Parent - Custom Event 3. Unrelated Components - LMS (Lightning Message…

Vue packages version mismatch 报错解决

问题 npm run dev 运行项目的过程中,报错 Vue packages version mismatch 解决方法 根据报错不难看出是 vue 与 vue-template-compiler 版本产生了冲突,vue 与 vue-template-compiler 的版本是需要匹配的。所以解决的办法就是先修改其中一个的版本将 v…

[C++]宏定义

C/C宏的基本使用方法 宏是C/C所支持的一种语言特性,我对它最初的印象就是它可以替换代码中的符号,最常见的例子便是定义一个圆周率PI,之后在代码中使用 PI 来代替具体圆周率的值。 确实如此,宏提供了一种机制,能够使…

动力学约束下的运动规划算法——两点边界值最优控制问题 OBVP

OBVP 即 optimal bundary value problem,即最优的BVP, BVP 问题其实就是解决 state sampled lattice planning 的基本操作方法。 如果,我们期望无人机从一个状态移动到另一个状态,即给定初始状态和终点状态,求解两个状…

每日五道java面试题之spring篇(五)

目录: 第一题. 使用 Spring 有哪些方式?第二题. 什么是Spring IOC 容器?第三题. 控制反转(IoC)有什么作用?第四题. IOC的优点是什么?第五题. BeanFactory 和 ApplicationContext有什么区别? 第一题. 使用 Spring 有哪…

【Web】CTFSHOW 常用姿势刷题记录(全)

目录 web801 web802 web803 web804 web805 web806 web807 法一:反弹shell 法二:vps外带 web808 web809 web810 web811 web812 web813 web814 web815 web816 web817 web818 web819 web820 web821 web822 web823 web824 web825…

03|Order by与Group by优化

索引顺序依次是 : name,age,position 案例1 EXPLAIN SELECT * FROM employees WHERE name LiLei AND position dev ORDER BY age;分析: 联合索引中只是用到了name字段做等值查询[通过key_len 74可以看出因为name字段的len74],在这个基础上使用了age进…

Javaweb之SpringBootWeb案例之配置优先级的详细解析

1. 配置优先级 在我们前面的课程当中,我们已经讲解了SpringBoot项目当中支持的三类配置文件: application.properties application.yml application.yaml 在SpringBoot项目当中,我们要想配置一个属性,可以通过这三种方式当中…

什么是MapReduce

1.1 MapReduce到底是什么 Hadoop MapReduce是一个软件框架,基于该框架能够容易地编写应用程序,这些应用程序能够运行在由上千个商用机器组成的大集群上,并以一种可靠的,具有容错能力的方式并行地处理上TB级别的海量数据集。这个定…

docker build基本命令

背景 我们经常会构建属于我们应用自己的镜像,这种情况下编写dockerfile文件不可避免,本文就来看一下常用的dockerfile的指令 常用的dockerfile的指令 首先我们看一下docker build的执行过程 ENV指令: env指令用于设置shell的环境变量&am…

DBAPI如何使用数组类型参数

DBAPI如何使用数组类型参数 需求 根据多个id去查询学生信息 API创建 在基本信息标签&#xff0c;创建参数ids &#xff0c;参数类型选择 Array<bigint> 在执行器标签&#xff0c;填写sql&#xff0c;使用in查询 select * from student where id in <foreach ope…

《Docker 简易速速上手小册》第6章 Docker 网络与安全(2024 最新版)

文章目录 6.1 Docker 网络概念6.1.1 重点基础知识6.1.2 重点案例&#xff1a;基于 Flask 的微服务6.1.3 拓展案例 1&#xff1a;容器间的直接通信6.1.4 拓展案例 2&#xff1a;跨主机容器通信 6.2 配置与管理网络6.2.1 重点基础知识6.2.2 重点案例&#xff1a;配置 Flask 应用的…

设计模式学习笔记 - 面向对象 - 7.为什么要多用组合少用继承?如何决定该用组合还是继承?

前言 在面向对象编程中&#xff0c;有一条非常经典的设计原则&#xff1a;组合优于继承&#xff0c;多用组合少用继承。 为什么不推荐使用继承&#xff1f; 组合比继承有哪些优势&#xff1f; 如何判断该用组合还是继承&#xff1f; 为什么不推荐使用继承&#xff1f; 继承…

企业微信怎么变更企业名称?

企业微信变更主体有什么作用&#xff1f;现在很多公司都用企业微信来加客户&#xff0c;有时候辛辛苦苦积累了很多客户&#xff0c;但是公司却因为各种各样的原因需要注销&#xff0c;那么就需要通过企业微信变更主体的方法&#xff0c;把企业微信绑定的公司更改为最新的。企业…

内核解读之内存管理(8)什么是page cache

文章目录 0. 文件系统的层次结构1.什么是page cache2.感观认识page cache3. Page Cache的优缺点3.1 Page Cache 的优势3.2 Page Cache 的劣势 0. 文件系统的层次结构 在了解page cache之前&#xff0c;我们先看下文件系统的层次结构。 1 VFS 层 VFS &#xff08; Virtual Fi…