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等标签生效
    • 引号:判断条件里,单双引号都可以使用
<?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.mfbz.cn/a/707506.html

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

相关文章

关于docker无法正常下载镜像的问题

文章目录 之前还可以正常下载镜像&#xff0c;但是一段时间之后就无法下载了&#xff0c;猜测可能是政治原因&#xff0c;无法连接到国外服务器&#xff0c;所以我设置了阿里云的镜像加速器。 配置方法如下&#xff1a; 前往阿里云&#xff08;https://help.aliyun.com/zh/acr/…

电力系统中臭氧传感器的应用

在电力系统中&#xff0c;设备的安全运行和环境的保护是两大核心任务。为了实现这一目标&#xff0c;各种传感器技术被广泛应用于电力系统的各个环节。其中&#xff0c;臭氧传感器以其独特的监测功能&#xff0c;在电力系统的绝缘状态监测、空气质量监测、环保监测以及预警与故…

蓝桥杯软件测试第十五届蓝桥杯模拟赛1期题目解析

PS 需要第十五界蓝桥杯模拟赛1期功能测试模板、单元测试被测代码、自动化测试被测代码请加&#x1f427;:1940787338 备注&#xff1a;15界蓝桥杯省赛软件测试模拟赛1期 题目1 功能测试用例1&#xff08;测试用例&#xff09;&#xff08;15分&#xff09; 【前期准备】 按步…

AI图书推荐:用ChatGPT按需DIY定制来赚钱

《用ChatGPT按需DIY定制来赚钱》ChatGPT Print Money Method &#xff0c;作者是Cindy Donovan 。 下面是图书概要&#xff1a; ### 第一章&#xff1a;什么是按需印刷以及ChatGPT如何使其变得简单易行&#xff1f; 本章介绍了按需印刷的商业模式&#xff0c;即仅在收到订单时…

Python私教张大鹏 Vue3整合AntDesignVue之Form 表单

何时使用 用于创建一个实体或收集信息。 需要对输入的数据类型进行校验时。 表单 我们为 form 提供了以下三种排列方式&#xff1a; 水平排列&#xff1a;标签和表单控件水平排列&#xff1b;&#xff08;默认&#xff09; 垂直排列&#xff1a;标签和表单控件上下垂直排列…

量化、剪枝、蒸馏,这些大模型黑话到底说了些啥?

扎克伯格说&#xff0c;Llama3-8B还是太大了&#xff0c;不适合放到手机中&#xff0c;有什么办法&#xff1f; 量化、剪枝、蒸馏&#xff0c;如果你经常关注大语言模型&#xff0c;一定会看到这几个词&#xff0c;单看这几个字&#xff0c;我们很难理解它们都干了些什么&…

笔记99:OSQP 求解器示例代码

注1&#xff1a;以下代码是 OSQP 的官方文档提供的示例&#xff0c;我加上了详细的注释&#xff1b; 注2&#xff1a;OSQP 库仅支持C语言&#xff0c;不支持C&#xff0c;所以下面的示例代码使用的是C语言&#xff1b;但是 OSQP 求解库提供了针对C的接口 OSQP-EIGEN&#xff1…

DockerCompose+Jenkins+Pipeline流水线打包Vue项目(解压安装配置Node)入门

场景 DockerComposeJenkinsPipeline流水线打包SpringBoot项目(解压安装配置JDK、Maven等)入门&#xff1a; DockerComposeJenkinsPipeline流水线打包SpringBoot项目(解压安装配置JDK、Maven等)入门-CSDN博客 以上使用流水线配置和打包springboot后台项目&#xff0c;如果要使…

redis未授权getshell整合利用

一、redis环境搭建 Redis下载地址&#xff1a;http://download.redis.io/releases/redis-4.0.2.tar.gz 1.靶机安装redis-centos7 第一步&#xff1a;下载wget yum -y install wget 第二步&#xff1a;下载redis wget http://download.redis.io/redis-stable.tar.gz 第三步&a…

Ajax的应用

1. Ajax Ajax是Asynchronous Javascript And XML&#xff08;异步JavaScript和XML&#xff09;的缩写。 Ajax技术描述了使用脚本操纵HTTP和Web服务器进行数据交换&#xff0c;在页面不刷新的情况下&#xff0c;实现页面的局部更新。 重点&#xff1a; Ajax 是一种在无需重新加…

界面组件DevExpress Office File API - 如何用OpenAI增强文档可访问性(二)

DevExpress Office File API是一个专为C#, VB.NET 和 ASP.NET等开发人员提供的非可视化.NET库。有了这个库&#xff0c;不用安装Microsoft Office&#xff0c;就可以完全自动处理Excel、Word等文档。开发人员使用一个非常易于操作的API就可以生成XLS, XLSx, DOC, DOCx, RTF, CS…

深度学习500问——Chapter10:迁移学习(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;就成为了机器…

webstorm yarn环境配置

1. 安装nodejs https://nodejs.cn/download/ 2. 安装npm npm i yarn -g3.下载并安装webstorm https://www.jetbrains.com/webstorm/ 4. 打开settings确认node和yarn的配置正确5. 打开项目更新包 yarn install

IntelliJ IDEA 用maven创建web项目

前言 已经安装并配置好Tomcat。具体步骤&#xff1a;Tomcat安装及环境变量配置(一看就会)-CSDN博客​编辑https://blog.csdn.net/longyongyyds/article/details/135825647 具体步骤 1.新建一个maven项目 2&#xff0c;配置好tomcat服务器 3.运行测试一下 maven教程&#xf…

Redisson原理解析

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

2024大交通场景空间策展洞察报告

来源&#xff1a;邻汇吧&万一商管 近期历史回顾&#xff1a; 2024国内工商业储能市场研究报告.pdf 2023幸福企业白皮书.pdf 2024年欧亚地区移动经济报告.pdf 内容供应链变革 2023人工智能与首席营销官&#xff08;CMO&#xff09; AI科技对PC产业的影响.pdf 金融业数据应用…

Vitis HLS 学习笔记--Vitis Accelerated Libraries介绍

1. 简介 Vitis Accelerated Libraries&#xff0c;包含很多现成的库&#xff0c;这些库都是开源的&#xff0c;也就是说代码是公开的&#xff0c;而且已经优化过&#xff0c;可以让程序运行得更快。你不需要改变太多你的代码&#xff0c;就能让你的程序速度提升。 这些库有很…

2024年GIS大赛奖金盘点,看看哪家最香?

之前盘点过2024年值得参加的GIS比赛&#xff0c;点这里回顾。 今天我们重点盘点一下不同比赛的奖项设置和奖金&#xff0c;排名不分先后。 全国高校GlS技能大赛 1. 比赛介绍&#xff1a; http://contest.gisera.com/view_191.html 2. 奖项/奖金设置&#xff1a; 获奖者颁…

ListView的使用

&#x1f4d6;ListView的使用 ✅1. 创建ListView✅2. 创建适配器Adapter✅3. 开始渲染数据 主要3步骤&#xff1a; 创建ListView 创建适配器Adapter&#xff0c;和Adapter对应的视图 开始渲染数据 效果图&#xff1a; ✅1. 创建ListView 例如现有DemoActivity页面&#xf…

自动控制:滑模控制(Sliding Mode Control, SMC)

自动控制&#xff1a;滑模控制(Sliding Mode Control, SMC) 滑模控制&#xff08;Sliding Mode Control, SMC&#xff09;是一种在处理非线性系统时非常有效的控制技术。它通过驱动系统状态达到并保持在特定的滑模面附近&#xff0c;来实现控制目标。本文将介绍滑模控制的基本…