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标签,但要考虑单引号,不建议使用。

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

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

相关文章

IT资讯——全速推进“AI+鸿蒙”战略布局!

文章目录 每日一句正能量前言坚持长期研发投入全速推进“AI鸿蒙”战略 人才战略新章落地持续加码核心技术生态建设 后记 每日一句正能量 人总要咽下一些委屈,然后一字不提的擦干眼泪往前走,没有人能像白纸一样没有故事,成长的代价就是失去原来…

【Qt学习】QLineEdit 控件 属性与实例(登录界面,验证密码,正则表达式)

文章目录 1. 介绍2. 实例使用2.1 登录界面2.2 对比两次密码是否相同2.3 通过按钮显示当前输入的密码(并对2.2进行优化)2.4 结语 3. 正则表达式3.1 QRegExp3.2 验证输入内容 4. 资源代码 1. 介绍 关于 QLineEdit 的详细介绍,可以去查阅官方文…

第2.1章 StarRocks表设计——概述

注:本篇文章阐述的是StarRocks-3.2版本的表设计相关内容。 建表是使用StarRocks非常重要的一环,规范化的表设计在某些场景下能使查询性能有数倍的提升。StarRocks的表设计涉及到的知识点主要包括数据表类型、数据分布(分区分桶及排序键&#…

阿里云SSL免费证书到期自动申请部署程序

阿里云的免费证书只有3个月的有效期,不注意就过期了,还要手动申请然后部署,很是麻烦,于是写了这个小工具。上班期间抽空写的,没有仔细测试,可能存在一些问题,大家可以自己clone代码改改&#xf…

React基础-webpack+creact-react-app创建项目

学习视频:学习视频 2节:webpack工程化创建项目 2.1.webpack工程化工具:vite/rollup/turbopak; 实现组件的合并、压缩、打包等; 代码编译、兼容、校验等; 2.2.React工程化/组件开发 我们可以基于webpack自己去搭建…

短剧小程序开发,重塑视频观看体验的科技革命

随着科技的飞速发展,人们的娱乐方式也在不断变化。短剧小程序作为新兴的数字娱乐形式,以其独特的魅力和巨大的市场潜力,正逐渐成为科技与娱乐结合的代表。本文将探讨短剧小程序的发展背景、优势特点、开发流程以及未来展望。 一、短剧小程序…

一元函数积分学——刷题(4

目录 1.题目:2.解题思路和步骤:3.总结:小结: 1.题目: 2.解题思路和步骤: 把极限转化为积分,这里的1/n的n->∞极限就相当于dx,i/n就相当于x,从而合理推断:…

GitLab代码库提交量统计工具

1.说明 统计公司所有项目的提交情况,可指定分支和时间段,返回每个人的提交新增数、删除数和总数。 2.API 文档地址:http://公司gitlab域名/help/api/README.md 项目列表查询 返回示例: [{"id": 1, //项目ID"http…

【 buuctf-梅花香之苦寒来】

一张 图片,hex 看一下,发现一堆十六进制数,复制下来,转换成 ascii 可以去网站一步到位转换ASCII文本,十六进制,二进制,十进制,Base64转换器 也可以跑一个脚本,就是等着时…

跨越千年医学对话:用AI技术解锁中医古籍知识,构建能够精准问答的智能语言模型,成就专业级古籍解读助手(LLAMA)

跨越千年医学对话:用AI技术解锁中医古籍知识,构建能够精准问答的智能语言模型,成就专业级古籍解读助手(LLAMA) 介绍:首先在 Ziya-LLaMA-13B-V1基线模型的基础上加入中医教材、中医各类网站数据等语料库&am…

一文读懂:AWS 网络对等互连(VPC peering)实用操作指南

VPC peering connection-网络对等互连在您的 Atlas VPC 和云提供商的 VPC 之间建立私有连接。该连接将流量与公共网络隔离以提高安全性。本篇文章有VPC peering的操作指南以及价格等信息。如还有疑问请联系我们MongoDB的销售,客户成功经理或解决方案架构师。 1 使用…

【rust】8、连接数据库:sqlx

sqlx 是 rust 的数据库访问工具, 本身并不是 orm,但常见的 orm 都是基于它实现的。其有如下特点: 支持异步,适合高并发编译时检查:cargo build 时检查执行 sql,校验响应值支持多数据库:mysql、…