Mybatis --- 动态SQL 和数据库连接池

文章目录

  • 一、什么是动态SQL + 重要性
  • 二、动态SQL的编写 ---注解
  • 三、动态SQL的编写 ---xml
    • 3.1 增加场景 if标签
    • 3.2 处理代码块内容 --- trim 标签
    • 3.3 查询场景 where标签
    • 3.4 更新场景 set标签
    • 3.5 删除场景 <foreach> 循环标签
    • 3.6 include、sql标签 代码重复度问题
  • 四、数据库连接池

一、什么是动态SQL + 重要性

  1. 什么是动态SQL:根据需求(),去动态地拼接SQL
  2. 重要性
    在这里插入图片描述
  3. 编写方式的选择:根据个人喜好和企业中的其他人用什么来选择
    • 推荐:简单SQL用注解,动态SQL用xml
      • 动态SQL,语句会比较复杂,此时使用xml更易读,而且因为本身支持标签,书写还会有提示
      • 简单SQL,使用注解会更简单,xml还需要另外写文件(当然,也有例如MybatisGenerator之类的插件可以帮我们去生成)

二、动态SQL的编写 —注解

  1. 编写方法:可以在xml文件格式下写好后,复制上来
    • 使用script标签让标签生效:使用注解编写SQL,需要将 SQL 放到 script标签 下
      • 因为注解里如果使用 if之类的标签,字符串里就混杂了标签,为了让标签生效,需要加上 script标签
    • 单双引号问题
      • 因为注解整个是要用字符串,即要用双引号(java里单引号表示字符),所以 if标签里面的判断条件等内容需要用单引号来区分
      • 如果用了双引号,需要转义
  2. 原理:关于里面一些标签的使用,是和xml方式一样的
@Mapper
public interface UserInfoMapper {@Insert("<script>" +"insert into userinfo (username,password,age," +"<if test='gender!=null' >" +"gender,</if>" +"phone) " +"values(#{username},#{password},#{age}," +"<if test='gender!=null'>#{gender},</if>" +"#{phone})" +"</script>")Integer insert(UserInfo userInfo);
}
@Select("<script>+" +"select * from userinfo" +"        <where>" +"            <if test=\"username!=null\">" +"                username = #{username}" +"            </if>" +"            <if test=\"password!=null\">" +  //此处用了双引号,需要转义"                and password = #{password}" +"            </if>\n" +"            <if test=\"age!=null\">" +"                and age = #{age}" +"            </if>" +"        </where>"+"</script>")
List<UserInfo> select2(UserInfo userInfo);

三、动态SQL的编写 —xml

3.1 增加场景 if标签

  1. 示例场景:根据用户的输入情况,拼接SQL,实现动态插入
    • insert into userinfo (username, password, age) values(?,?,?)中,这个SQL语句是被写死的,用户必须要全部输入username、password、age这三个信息,才可以完成数据插入的操作。但有些场景下,我们是不需要把所有的信息都写完的
  2. 代码
    • 关于 script 标签:不需要加上,因为xml本身就是支持标签的,不需要该标签来让写的if等标签生效
    • 引号:判断条件里,单双引号都可以使用
  3. 关于标签:if、where这类标签,是MyBatis借助xml的方式去实现的。如if标签表示这里面是个if语句,where标签表示这里面是where语句。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserinfoMapper"><insert id="insert">  insert into userinfo(username, password,<if test="age!=null">  <!--对年龄作了判断,判断条件对应Java里的属性 -->age    <!-- 数据库的字段--></if>)values (#{username}, #{password},<if test="age!=null">#{age}</if>)</insert>
</mapper>

3.2 处理代码块内容 — trim 标签

  1. 问题描述
    在这里插入图片描述
  2. 解决后的代码
    • < trim suffixOverrides=“,” prefix=“(” suffix=“)”>
      • 去除trim标签代码块最后面的 “,” 字符
      • 在trim标签代码块最前面和最后面,分别加上 “(” 和 “)”。即我们没必要再自己写括号了
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserinfoMapper"><insert id="insert">insert into userinfo<trim suffixOverrides="," prefix="(" suffix=")"><if test="username!=null">username,</if><if test="password!=null">password,</if><if test="age!=null">age,</if><if test="gender!=null">gender</if></trim>values <trim suffixOverrides="," prefix="(" suffix=")"><if test="username!=null">#{username},</if><if test="password!=null">#{password},</if><if test="age!=null">#{age}</if><if test="gender!=null">#{gender}</if></trim></insert>
</mapper>

3.3 查询场景 where标签

  1. 方式一:使用trim标签
    • < trim prefixOverrides=“and”>:避免【当输入的值只有最后一个(此处指只查age)】,SQL语句前面会多一个and的情况
    • 问题
      • 一个参数都不给,就会多一个where
      • 如果把where放进trim标签里,那【删除最前面的and】的需求就无法实现
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserinfoMapper"><select id="select" resultType="com.example.demo.model.UserInfo">select * from userinfowhere<trim prefixOverrides="and"><if test="username!=null">username = #{username}</if><if test="password!=null">and password = #{password}</if><if test="age!=null">and age = #{age}</if></trim></select>
</mapper>
  1. 方式二:使用where 1=1
    • where 1=1:当搜寻条件一个都没有时,相当于【查询所有】
    • and username = #{username}:相比于方式一,第一个搜寻条件需要加上and
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserinfoMapper"><select id="select" resultType="com.example.demo.model.UserInfo">select * from userinfowhere 1=1<trim prefixOverrides="and"><if test="username!=null">and username = #{username}</if><if test="password!=null">and password = #{password}</if><if test="age!=null">and age = #{age}</if></trim></select>
</mapper>
  1. 方式三:使用where标签:该标签由Mybatis提供
    • where标签的作用
      • 当查询条件都为空时,where标签会自动去除where关键字
      • 当只查询最后一个条件时,可以帮我们去除最前面的 and字符
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserinfoMapper"><select id="select" resultType="com.example.demo.model.UserInfo">select * from userinfo<where><if test="username!=null">username = #{username}</if><if test="password!=null">and password = #{password}</if><if test="age!=null">and age = #{age}</if></where></select>
</mapper>

3.4 更新场景 set标签

  1. 写法一:set + trim
    • 直接用set + 用trim标签去除最后一个逗号
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserinfoMapper"><update id="update">update userinfoset<trim suffixOverrides=","><if test="username != null">username = #{username},</if><if test="age != null">age = #{age},</if><if test="gender != null">gender = #{gender}</if></trim>where age = 21</update>
</mapper>
  1. 方式二:使用set标签:相当于方式一
    • 如果一个要修改的值都没有:没有值时会把set去掉,但又因为如果要执行更新的SQL,必须要有set,所以这种情况会报错
    • 解决方法:无法解决,因为没有【你一方面要执行更新操作,另一方面什么都不修改】的需求
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserinfoMapper"><update id="update">update userinfo<set><if test="username != null">username = #{username},</if><if test="age != null">age = #{age},</if><if test="gender != null">gender = #{gender}</if></set>where username = 'zhangliu'</update>
</mapper>

3.5 删除场景 循环标签

  1. 示例场景:批量,如批量删除
    • 理解:delete from userInfo where id in(xx, xx, xx):我们需要一个集合,遍历该集合,把其中的每个数都输出来
      在这里插入图片描述

3.6 include、sql标签 代码重复度问题

  1. 示例场景:在执行查询操作时,我们一般不支持使用*,推荐把要查的列列出来,哪怕是全部。但此时,代码重复度就会很高
    • 解决方法:对重复的代码片段进行抽取,将其通过sql标签封装成一个SQL片段,然后再通过include标签进行引用
  2. 使用方法
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserinfoMapper"><sql id="selectTable">    <!--抽取共性,id与下面的refid对应-->select username, password, gender from userinfo</sql><!--引用--><select id="selectAll" resultType="com.example.sp20240607.model.UserInfo"><include refid="selectTable"></include>		<!--refid表示引用的id是什么-->where id = 1</select>
</mapper>

四、数据库连接池

  1. 池化的概念:把需要的东西放到池子里,后续如果需要,直接拿出来用,省略了自己常见的过程
    • 线程池也是这样,提前创建好很多线程,我们需要用线程的时候就直接去这个池子里拿
  2. 有无数据库连接池的情况
    在这里插入图片描述
  3. 常用的数据库连接池:C3P0、DBCP、Druid、Hikarl
    • 目前比较流行的是Druid和Hikarl,功能上前者更优,性能上Hikarl更好,我们需要根据需求进行选择。
  4. 数据库连接池的使用:Mybatis已经封装了数据库连接池
    在这里插入图片描述
  5. 更改数据库连接池:SpringBoot默认使用的数据库连接池是Hikarl,如果我们要使用其他的,直接引入需要的数据库连接池的依赖即可
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.21</version>
</dependency><!--如果是SpringBoot3.x以上的版本-->
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId><version>1.2.21</version>
</dependency>

在这里插入图片描述

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

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

相关文章

软考高级论文真题“论大数据lambda架构”

论文真题 大数据处理架构是专门用于处理和分析巨量复杂数据集的软件架构。它通常包括数据收集、存储、处理、分析和可视化等多个层面&#xff0c;旨在从海量、多样化的数据中提取有价值的信息。Lambda架构是大数据平台里最成熟、最稳定的架构&#xff0c;它是一种将批处理和流…

5G消息 x 金融 | 数字金融新形态

5G消息 x 金融 | 数字金融新形态 5G 消息基于终端原生入口&#xff0c;可为金融消费者提供轻便安全的服务入口&#xff0c;为金融机构开拓了低成本的客户触达渠道。 5G 消息 X 金融 —— 优势亮点 5G 消息凭借“RCS&#xfe62;Platform&#xfe62;Chatbot”方式构建了银行与客…

通过iDrac8.0安装Windows Server 2022

1:登录iDrac。 2&#xff1a;启动虚拟控制台。 3&#xff1a;点击虚拟机介质。 4&#xff1a;连接虚拟介质。 5&#xff1a;映射CD/DVD 6: 找到本地的安装镜像。映射设备。 7&#xff1a;在下次引导中选择虚拟CD/DVD/ISO引导。 8&#xff1a;可以在电源中选择重置设备启动&…

docker镜像拉取K8s的calico,Pod报错Init:ImagePullBackOff及kubekey生成离线包报错error: Pipeline[ArtifactExportpipe的解决

配置k8s集群出现问题 起初以为是版本问题&#xff0c;最后比对了一下发现没有问题。使用 kubectl describe calico-node-mg9xh -n kube-system命令查看发现docker pull 镜像失败&#xff0c;但是docker国内镜像源早就配置过了。 猜测Docker的缓存可能会导致拉取镜像失败。尝试…

个人云服务器已经被安全合规等卡脖子 建议不要买 买了必定后悔 安全是个大问题 没有能力维护

我的想法 自己买一个云服务器&#xff0c;先自己边做边学习&#xff0c;向往硅谷精神&#xff0c;财富与自由。如果能赚钱&#xff0c;就开个公司。这次到期就放弃了。 我前前后后6年花6000多元买云服务器。业余花了无数的精力&#xff0c;从2018到现在 &#xff0c;也没有折…

基于R-Tree的地理空间数据分析加速

几年前&#xff0c;我正在做一个业余项目。我想创建一个 Web 应用程序&#xff0c;推荐当地的特色景点&#xff0c;例如咖啡馆、书店或隐藏的酒吧。我的想法是在地图上显示用户触手可及的所有兴趣点。我的数据集中有数十万个点&#xff0c;我必须巧妙地过滤用户给定范围内的数据…

一键生成insert,update,delete,的mybatis sql 语句

由于最近写增删改查&#xff0c;对与开发来说&#xff0c;编写一个insert和update 语句是十分耗时耗力的&#xff0c;因为有大量的字段要复制粘贴。粘贴完还要去比对一下有没有漏粘的&#xff0c;很耗费精力&#xff0c;于是就想着写一个sql&#xff0c;通过手动指定哪张表&…

二、C#基本语法

C#是一种面向对象的编程语言。在面向对象的程序设计方法中&#xff0c;程序由各种相互交互的对象组成。相同种类的对象通常具有相同的类型&#xff0c;或者说&#xff0c;是相同的class中。 例如&#xff0c;以rectangle&#xff08;矩形&#xff09;对象为例。它具有length和…

STM32Cube配置STM32F072C8T6的CAN总线说明

目录 1. 引脚配置2. 时钟配置3. 代码添加 1. 引脚配置 2. 时钟配置 CAN配置 波特率计算&#xff1a;500K 48 / &#xff08;431&#xff09;*12 48 / 96 使能中断&#xff0c;很关键&#xff0c;否则CAN无法发送。 3. 代码添加 添加滤波器使能、接收中断使能、CAN使能&…

打造基于大模型的AI产品

我要飞往印度进行短暂旅行&#xff0c;因此花了一个小时的时间处理在线签证申请流程。完成后&#xff0c;由于我现在知道涉及的内容&#xff0c;我向 ChatGPT 4o 询问了相关问题。这些观点中的大多数都是部分或完全错误的。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - …

微信小程序开发系列(三十五)·自定义组件的属性properties

微信小程序开发系列&#xff08;三十四&#xff09;自定义组件的创建、注册以及使用&#xff08;数据和方法事件的使用&#xff09;_wx小程序组件开发-CSDN博客 目录 1. 组件的属性 2. 组件的使用 3. 细节描述 1. 组件的属性 Properties是指组件的对外属性&#xff0c;主…

Ms08067安全实验室成功实施多家业务系统渗透测试项目

点击星标&#xff0c;即时接收最新推文 近日&#xff0c;Ms08067安全实验室针对多家公司重要系统实施渗透测试项目。公司网络信息系统的业务应用和存储的重要信息资产均较多&#xff0c;存在网络系统结构的复杂性和庞杂等特点&#xff0c;使得公司网络信息系统面临一定风险。项…

顺安蜘蛛池四川官网下载

baidu搜索&#xff1a;如何联系八爪鱼SEO? baidu搜索&#xff1a;如何联系八爪鱼SEO? baidu搜索&#xff1a;如何联系八爪鱼SEO? 虽然影视泛目录很火,但超度站群版本自出现以来-直流量稳定,可惜这两年起站全靠域名。但话说回来,咱不能否认,只要用的域名好,做啥泛目录都有好…

【第11章】别人的工作流,如何使用和调试(上)?(2类必现报错/缺失节点/缺失模型/思路/实操/通用调试步骤)ComfyUI基础入门教程

经过前面章节的学习,相信大家对于工作流是什么?如何搭建?怎么使用基础的工作流?已经很清楚了。 那么,接下来的课程,我们会上一点难度, 并且更接近实战状态了。 这节课,我们就用一套从“文本 - 静帧 - 视频”的AI短片全流程工作流,讲一下,网络上下载的工作流,需要如…

树与图的深度优先遍历——AcWing.846树的重心

树与图的深度优先遍历 定义 从图的某个顶点出发&#xff0c;沿着一条路径尽可能深地访问图中顶点。 运用情况 图的连通性判断。寻找特定路径或回路。 注意事项 要标记已访问的节点&#xff0c;以避免重复访问导致死循环。对于有向图和无向图可能需要不同的处理。 解题思…

C++ Primer Plus第五版笔记(p201-250)

第六章 函数&#xff08;下&#xff09; 在含有return语句的循环后面应该也有一条return语句 不要返回局部对象的引用或指针&#xff0c;当函数结束时临时对象占用的空间也就随之释放掉了&#xff0c;所以两条return语句都指向了不再可用的内存空间。 如果函数返回指针、引用…

排序(2)【选择排序】【快速排序】

一.选择排序 选择排序就是选择一个数组的最大的数字或者最小的数字&#xff0c;放在一整个数组的最后或者开头的位置。 1.选择排序的实现 我们可以对选择排序进行一些加强&#xff0c;普通的选择排序是选择最小的数&#xff0c;然后进行交换。这个加强之后就是我们既要选择出…

从ES的JVM配置起步思考JVM常见参数优化

目录 一、真实查看参数 &#xff08;一&#xff09;-XX:PrintCommandLineFlags &#xff08;二&#xff09;-XX:PrintFlagsFinal 二、堆空间的配置 &#xff08;一&#xff09;默认配置 &#xff08;二&#xff09;配置Elasticsearch堆内存时&#xff0c;将初始大小设置为…

ElasticSearch + kibana:类型声明

当我们使用 kibana 创建索引时&#xff0c;如果不申明数据类型&#xff0c;默认字符串赋予 text类型&#xff0c;如下图所示 接下来我们继续创建多条数据如下&#xff1a; 下面我们来检索下&#xff1a; 通过以上两个案例我们发现&#xff0c;使用 match 模糊查询 li-3 明明…

别再问别人了,这是小白都能懂的拓扑图指南

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 上午好&#xff0c;我的网工朋友。 老杨的网工交流群里经常会有这种现象&#xff1a; 一群小伙伴在问各类型拓扑图的问题&#xff0c;怎么设计&…