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

news2024/11/25 22:48:48

文章目录

  • 一、什么是动态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 userinfo
        where
        <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 userinfo
        where 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 userinfo
        set
        <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.coloradmin.cn/o/1833947.html

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

相关文章

vue+element-plus完美实现跨境电商商城网站

目录 一、项目介绍 二、项目截图 1.项目结构图 2.首页 3.中英文样式切换 4.金钱类型切换 5.商品详情 6.购物车 7.登录 ​编辑 8.注册 9.个人中心 三、源码实现 1.项目依赖package.json 2.项目启动 3.购物车页面 四、总结 一、项目介绍 本项目在线预览&am…

Matlab基础篇:绘图与可视化

目录 前言 一、二维绘图 二、图形属性设置 三、多图绘制 四、三维绘图 五、绘图技巧 六、绘图的高级技巧 七、实例示范&#xff1a;绘制多功能图形 八、总结 前言 在数据分析和数学建模中&#xff0c;可视化是一个非常关键的步骤。Matlab 提供了丰富的绘图和可视化工…

自主可控数据库沙龙(北京站 |线下| 报名中)

**数据库沙龙**是一个致力于推动数据库技术创新和发展的高端交流平台&#xff0c;旨在增强国内数据库产业的自主可控性和高质量发展。这个平台汇集了学术界和产业界的顶尖专家、学者以及技术爱好者&#xff0c;通过专题演讲、案例分享和技术研讨等丰富多样的活动形式&#xff0…

6月17日(周一)美国股市行情总结:标普纳指齐新高,AI和芯片股尤为出色

标普500指数在六天里第五天上涨&#xff0c;纳指和纳指100均连续六日新高&#xff0c;道指止步四日连跌脱离近两周低位&#xff0c;罗素小盘股指止步两日连跌并脱离六周最低。微软收盘市值仍为美股第一、苹果为第二、英伟达第三&#xff0c;但早盘触及盘中新高的英伟达市值曾超…

你对SSH协议了解吗

SSH&#xff08;Secure Shell&#xff09;协议&#xff0c;作为网络通信领域的一项核心技术&#xff0c;以其卓越的安全性能和广泛的应用范围&#xff0c;成为保障网络通信安全的重要工具。本文将深入剖析SSH协议的工作原理、核心特性以及在现代网络通信中的关键作用&#xff0…

上海亚商投顾:沪指缩量调整 PCB概念股持续爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 大小指数昨日走势分化&#xff0c;沪指全天震荡调整&#xff0c;创业板指午后涨超1%。消费电子板块全天强势&a…

安卓多媒体(音频录播、传统摄制、增强摄制)

本章介绍App开发常用的一些多媒体处理技术&#xff0c;主要包括&#xff1a;如何录制和播放音频&#xff0c;如何使用传统相机拍照和录像&#xff0c;如何截取视频画面&#xff0c;如何使用增强相机拍照和录像。 音频录播 本节介绍Android对音频的录播操作&#xff0c;内容包…

基于GTX的64B66B编码IP生成(高速收发器二十)

点击进入高速收发器系列文章导航界面 1、配置GTX IP 相关参数 前文讲解了64B66B编码解码原理&#xff0c;以及GTX IP实现64B66B编解码的相关信号组成&#xff0c;本文生成64B66B编码的GTX IP。 首先如下图所示&#xff0c;需要对GTX共享逻辑进行设置&#xff0c;为了便于扩展&a…

Apple - Framework Programming Guide

本文翻译自&#xff1a;Framework Programming Guide&#xff08;更新日期&#xff1a;2013-09-17 https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPFrameworks/Frameworks.html#//apple_ref/doc/uid/10000183i 文章目录 一、框架编程指南简介…

文件操作(1)(C语言版)

前言&#xff1a; 为什么要学习文件操作&#xff1a; 1、如果大家写过一些代码&#xff0c;当运行结束的时候&#xff0c;这些运行结果将不复存在&#xff0c;除非&#xff0c;再次运行时这些结果才能展现在屏幕上面&#xff0c;就比如之前写过的通讯录。 现实中的通讯录可以保…

商超智能守护:AI监控技术在零售安全中的应用

结合思通数科大模型的图像处理、图像识别、目标检测和知识图谱技术&#xff0c;以下是详细的商超合规监测应用场景描述&#xff1a; 1. 员工仪容仪表监测&#xff1a; 利用图像识别技术&#xff0c;系统可以自动检测员工是否按照规范整理妆容、穿着工作服&#xff0c;以及是否…

Arm和高通的法律之争将扰乱人工智能驱动的PC浪潮

Arm和高通的法律之争将扰乱人工智能驱动的PC浪潮 科技行业高管和专家表示&#xff0c;两大科技巨头之间长达两年的法律大战可能会扰乱人工智能驱动的新一代个人电脑浪潮。 上周&#xff0c;来自微软(Microsoft)、华硕(Asus)、宏碁(Acer)、高通(Qualcomm)等公司的高管在台北举行…

Raylib的贪吃蛇

配置Raylib库 工具链主函数模板Draw: 绘制网格Snake: 初始化Draw&#xff1a;绘制蛇与果Input&#xff1a;移动Logic&#xff1a;游戏主要逻辑Draw: 游戏结束 工具链 mkdir snake cd snakeCMakeLists.txt cmake_minimum_required(VERSION 3.10) project(snake) set(CMAKE_EXP…

深度学习500问——Chapter11:迁移学习(3)

文章目录 11.3 迁移学习的常用方法 11.3.1 数据分布自适应 11.3.2 边缘分布自适应 11.3.3 条件分布自适应 11.3.4 联合分布自适应 11.3.5 概率分布自适应方法优劣性比较 11.3.6 特征选择 11.3.7 统计特征对齐方法 11.3 迁移学习的常用方法 11.3.1 数据分布自适应 数据分布自适…

libdrm 2.4.107 needed because amdgpu has the highest requirement

libdrm 2.4.107 needed because amdgpu has the highest requirement 1.问题分析解决 1.问题 Message: libdrm 2.4.107 needed because amdgpu has the highest requirement Run-time dependency libdrm_intel found: YES 2.4.107 Run-time dependency libdrm_amdgpu found: Y…

深度学习500问——Chapter11:迁移学习(4)

文章目录 11.3.8 流形学习方法 11.3.9 什么是finetune 11.3.10 finetune为什么有效 11.3.11 什么是网络自适应 11.3.12 GAN在迁移学习中的应用 参考文献 11.3.8 流形学习方法 什么是流行学习&#xff1f; 流行学习自从2000年在Science上被提出来以后&#xff0c;就成为了机器…

uniapp canvas生成海报

效果 封装组件&#xff0c;父组件 ref 调用 downImgUrl()函数&#xff0c;其他根据自己需求改 <template><view><view class"bgpart"><canvas class"canvas-wrap" canvas-id"canvasID" type"2d"></canvas…

41、基于深度学习的自适应线性预测(matlab)

1、原理及流程 自适应线性预测是一种基于递归最小二乘法&#xff08;Recursive Least Squares, RLS&#xff09;的线性预测方法&#xff0c;用于自适应地估计线性系统的参数。下面是自适应线性预测的原理和流程&#xff1a; 原理&#xff1a; 自适应线性预测的核心思想是通过…

Java | Leetcode Java题解之第162题寻找峰值

题目&#xff1a; 题解&#xff1a; class Solution {public int findPeakElement(int[] nums) {int n nums.length;int left 0, right n - 1, ans -1;while (left < right) {int mid (left right) / 2;if (compare(nums, mid - 1, mid) < 0 && compare(n…

转型AI产品经理(12):“希克定律”如何应用在Chatbot产品中

信息过载&#xff0c;这个对现代人来说是很常见的问题&#xff0c;信息获取变得越来越便捷的同时&#xff0c;也导致信息过载让我们无法及时做出有效决策&#xff0c;还可能演变成选择困难症。信息过载对用户体验的设计也有着显著的负面影响&#xff0c;如果我们的产品设计让人…