JavaEE进阶----19.<Mybatis进阶(动态SQL)>

 详解动态SQL

<if>标签、<trim>标签、<where>标签、<set>标签、<foreach>标签、<include>标签 & <SQL>标签

MySQL(进阶)

一、动态SQL

也就是SQL语句中指定的属性,若我们不想输入进行查询,插入,修改

那么我们就忽略掉这个属性。就当做它不存在,怎么做到呢?这就是动态SQL。

(一)、XML方式

1.1<if>标签

在插入时,如果不想填写某些属性,那么我们用if标签来实现。

有一个属性test。填的是条件

假如gender为null,我们就不添加这个gender。它会自动使用默认值。

    <insert id="insert" useGeneratedKeys="true" keyProperty="id">
        insert into
        userinfo
        (username,password,age,
        <if test="gender!=null">
            gender,
        </if>
        phone)
        values
        (#{username},#{password},#{age},
        <if test="gender!=null">
            #{gender},
        </if>
         #{phone})
    </insert>

 我们进行测试, 当我们设置gender的值为1。

我们进行测试, 当我们不设置gender的值后gender默认为0了。

1.2 <trim>标签

如果有多个 if 标签。会存在,的拼接位置不对的badSQL问题。

有四个属性,

1.prefix=""给代码块最前面加字符串,

2.suffix=""给代码块最后面加字符串。

3.prefixOverrides=""去除代码块最前面指定的字符串,

4.suffixOverrides=""去除代码块最后面的指定字符串

比如用if标签除去的属性,若除去最后面的属性

那么此时代码就会多出一个逗号,导致SQL编译失败。此时就可以使用trim标签的suffixOverrides属性来去除掉它了。

我们分别用trim标签

去掉代码块最前面的逗号,和去掉最后面的逗号,

增加代码块最前面的左括号 ( 和增加代码块最后面的右括号 ) 

    <insert id="insert3" useGeneratedKeys="true" keyProperty="id">
        insert into
        userinfo
         <trim prefixOverrides="," 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>
             <if test="phone!=null">phone,</if>
         </trim>
        values
        <trim prefixOverrides="," 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>
            <if test="phone!=null">#{phone},</if>
        </trim>
    </insert>

此时我们就可以任意传入参数也不会报错了。 

1.3 <where>标签

我们在淘宝买东西,筛选的时候。系统会根据我们的筛选条件,动态组装where 条件

1.用于方便并列查询时,若不选其中一个属性SQL语句中的and多余问题。

<where>标签只会在子元素有内容的情况下才插入where子句,而且会自动去除子句的开头的AND或 OR

2.并且若查询条件为空,where标签自动会去掉SQL语句中的where语句。直接查询所有的信息

以上标签也可以使用 <trim prefix="where"  prefixOverrides="and"> 替换,但是此种 情况下,当子元素都没有内容时,where关键字也会保留。

    <select id="queryUserListByWhere" resultType="com.qiyangyang.mybatisdemo.model.UserInfo">
        select * from userinfo
        <where>
            <if test="userName != null">
                username = #{userName}
            </if>
            <if test="age!=null">
                and age = #{age}
            </if>
        </where>
    </select>

使用where标签,解决了and多余的问题。 

2.若查询条件为空,where标签自动会去掉SQL语句中的where语句。直接查询所有的信息 

1.4 <set>标签

用于更新操作时,解决出现多余逗号的问题。(用于update语句中)

去除整个代码块最后的逗号。

以上标签也可以使用<trim prefix="set"  prefixOverrides=","> 替换。

需求:根据传入的用户对象属性来更新用户数据,可以使用标签来指定动态内容.

接口定义:根据传入的用户 id 属性,修改其他不为 null 的属性

    <update id="update2">
        update userinfo
        <set>
            <if test="username!=null">username = #{username},</if>
            <if test="password!=null">password = #{password},</if>
            <if test="age!=null">age = #{age},</if>
        </set>
        where id=#{id}
    </update>

1.5 <foreach>标签

对集合进行遍历时可以使用该标签。标签有如下属性:

• collection:绑定方法参数中的集合,如List,Set,Map或数组对象

• item:遍历时的每一个对象

• open:语句块开头的字符串

• close:语句块结束的字符串

• separator:每次遍历之间间隔的字符串

需求:根据多个userid,删除用户数据 

接口方法:void deleteByIds(List ids);

是一个循环,用于批量操作,比如批量删除

SQL:

delete form userinfo where id in (14,15,16)

有如下属性

1.collection表示从哪里拿的数据,

2.separator表示用什么符号分割

3.open表示以什么符号开始,

4.close表示以什么符号结束

5.item表示每一个元素的名字

    <delete id="batchDelete">
        delete from userinfo where id in
        <foreach collection="ids" separator="," open="(" close=")" item="id">
            #{id}
        </foreach>
    </delete>

 

 

注:如果使用的是aliyun的依赖,那么collection="ids"会报错,需要写成collection="list" 

1.6 <include>标签 & <SQL>标签

用于解决代码重复的问题,可以理解为用SQL标签,定义了一个字符串

想用的时候,用<include>标签导入进去就可以了。

SQL标签:定义可重复SQL代码

<include>标签:通过属性refid,指定包含的SQL片段

eg:

    <sql id="cols">
        username,password,age,gender,phone,
    </sql>

    <select id="queryUserListL" resultType="com.qiyangyang.mybatisdemo.model.UserInfo">
        select <include refid="cols"></include>
               delete_flag as deleteFlag,
               create_time as createTime,
               update_time as updateTime from userinfo
    </select>

(二)、注解方式(暂不推荐)

与XML一样,只是将标签换成注解。注解的缺陷在于不会有任何报错提醒。

注解括号中我们使用

"<script>"标签

来代表这是动态SQL。

可能是某个引号错了,很难发现错误点在哪里。其实是item前面多了个单引号。

由于已经使用双引号拼接了,因此foreach标签中的属性使用单引号。

    @Delete("<script>"+
            "delete from userinfo where id in "+
            "<foreach collection='ids' separator=',' open='(' close=')' item='id'>" +
            "#{id} " +
            "</foreach>"+
            "</script>")
    void batchDelete(@Param("ids") List<Integer> ids);

 

 PS:

1.配置文件乱码问题

将这里的设置中的编码方式都改成 UTF-8 方式编码。

已经乱码的不能恢复了

改完之后新的码就不会乱码了

新建文件项目也改一下。

2.Mybatis-Plus

相当于Mybatis升级版,在原有基础上加了更多功能,让我们使用更加方便。

1.查询所有数据

2.根据主键查询...

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

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

相关文章

查缺补漏----分组交换所需时间计算

总结以及图片来源&#xff1a;b站湖科大真题计网讲解 对于报文交换&#xff0c;路由器完整接收整个报文后&#xff0c;才能对报文进行转发。对于分组交换&#xff0c;则是将报文划为更小的分组进行传送&#xff0c;路由器边接收分组边转发分组。 报文交换&#xff1a; 分组交换…

文件上传漏洞及安全

文件上传 文件上传安全指的是攻击者通过利用上传实现后门的写入连接后门进行权限控制的安全问题&#xff0c;对于如何确保这类安全问题&#xff0c;一般会从原生态功能中的文件内容&#xff0c;文件后缀&#xff0c;文件类型等方面判断&#xff0c;但是漏洞可能不仅在本身的代码…

Java的查找算法和排序算法

Java的查找算法和排序算法 一、查找算法1. 基本查找a. 示例 2. 二分查找a. 示例 3. 插值查找4. 斐波那契查找5. 分块查找a. 示例 二、排序算法1. 冒泡排序a. 示例 2. 选择排序a. 示例 3、插入排序a. 示例 4. 快速排序&#xff08;效率最高&#xff09;a. 示例 一、查找算法 1.…

期权懂|2024年期权最新止损策略有哪些?

本期让我懂 你就懂的期权懂带大家来了解&#xff0c;2024年期权最新止损策略有哪些&#xff1f;有兴趣的朋友可以看一下。期权小懂每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 2024年期权最新止损策略有哪些&#xff1f; 一、浮亏比例…

Pandas模块之垂直或水平交错条形图

目录 df.plot() 函数Pandas模块之垂直条形图Pandas模块之水平交错条形图 df.plot() 函数 df.plot() 是 Pandas 中的一个函数&#xff0c;用于绘制数据框中的数据。它是基于 Matplotlib 库构建的&#xff0c;可以轻松地创建各种类型的图表&#xff0c;包括折线图、柱状图、散点…

PCM5102A具有PLL和32位、384kHz PCM/I2S接口的2.1VRMS、112dB音频立体声DAC

PCM5102A外观和丝印 1 特性 1•超低带外噪声 •具有BCK基准的高性能集成音频锁相环(PLL)&#xff0c;可在内部生成SCK •直接线路电平2.1VRMS输出 •无需隔直电容 •线路电平输出支持低至1kΩ的负载 •智能静音系统&#xff1b;软斜升或斜降搭配模拟静音&#xff0c;实现120dB…

深度学习实战项目】基于OPenCV的人脸识别考勤系统软件开发【python源码+UI界面+功能源码详解】

背景及意义 人脸识别&#xff08;Face Recognition&#xff09;是基于人的脸部特征信息进行身份识别的一种生物识别技术&#xff0c;可以用来确认用户身份。本文详细介绍了人脸识别基本的实现原理&#xff0c;并且基于python与pyqt开发了人脸识别与信息管理软件&#xff0c;主要…

Go第三方框架--gorm框架(一)

前言 orm模型简介 orm模型全称是Object-Relational Mapping&#xff0c;即对象关系映射。其实就是在原生sql基础之上进行更高程度的封装。方便程序员采用面向对象的方式来操作数据库&#xff0c;将表映射成对象。 这种映射带来几个好处&#xff1a; 代码简洁&#xff1a;不用…

AVL树介绍与构建

目录 AVL树的概念 二叉树的构建 平衡因子的更新 旋转 左单旋 旋转过程 左单旋代码 右单旋 旋转过程 右单旋代码 左右双旋 发生情况 抽象图 具体图 平衡因子更新 左右双旋代码 右左双旋 右左双旋旋代码 验证测试AVL树 测试成员函数 测试代码 AVL树实现代码…

使用virtualenv导入ssl模块找不到指定的模块

最近在学习tensorflow&#xff0c;由于教程里面使用的是virtualenv&#xff0c;所以就按照教程开始安装了虚拟环境。但是在使用的时候&#xff0c;卡在了import ssl这一步&#xff0c;提示如下错误 >>> import ssl Traceback (most recent call last):File "<…

兼容Lodash的真正替代者

大家好&#xff0c;我是农村程序员&#xff0c;独立开发者&#xff0c;前端之虎陈随易。 这是我的个人网站&#xff1a;https://chensuiyi.me&#xff0c;欢迎一起交朋友~ 今天给大家分享一个前端工具库 Lodash 的替代品 es-toolkit。 仓库地址&#xff1a;https://github.com…

Android 自定义 Dialog 实现列表 单选,多选,搜索

前言 在Android开发中&#xff0c;通过对话框让用户选择&#xff0c;筛选信息是很方便也很常见的操作。本文详细介绍了如何使用自定义 Dialog、RecyclerView 以及自定义搜索框 来实现选中状态和用户交互&#xff0c;文中大本分代码都有明确注释&#xff0c;主打一个简单明了&a…

A survey of loss functions for semantic segmentation——论文笔记

摘要 图像分割一直是一个活跃的研究领域&#xff0c;因为它有着广泛的应用范围&#xff0c;从自动疾病检测到自动驾驶汽车。过去五年中&#xff0c;各种论文提出了用于不同场景&#xff08;如数据偏斜、稀疏分割等&#xff09;的目标损失函数。在本文中&#xff0c;我们总结了…

NVR监测软件/设备EasyNVR多个NVR同时管理构建智慧城市的大数据解决方案

在当今的数字化时代&#xff0c;安防视频监控已成为各行各业不可或缺的一部分&#xff0c;无论是在智慧工地、智慧工厂、智慧景区还是智慧水利等领域&#xff0c;都需要高效、可靠的监控系统来保障安全。 一、背景需求分析 随着科技的发展&#xff0c;智慧城市建设成为城市发展…

★ 算法OJ题 ★ 前缀和算法(上)

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;将和大家一起做几道前缀和算法题 ~ ❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️ 澄岚主页&#xff1a;椎名澄嵐-CSDN博客 算法专栏&#xff1a;★ 优选算法100天 ★_椎名澄嵐的博客-CSDN博客 ❄️❄️❄…

毕业设计选题:基于Django+Vue的物资配送管理系统的设计与实现

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录界面 管理员功能界面 申领者管理 后勤处管理 物资信息管理 入库信息管理 …

i春秋web题库——题目名称:SQLi

WEB——SQLi 写在之前&#xff1a;题目简介&#xff1a;题目分析&#xff1a; 写在之前&#xff1a; 本题在CSDN上或是其它博客上有过解答&#xff0c;只不过不知是什么原因&#xff0c;我没有找到解题过程比较完整的文章。于是我决定在CTF初学阶段写一篇这样的博客&#xff0…

ctfshow(78->81)--文件包含漏洞

Web78 源代码如下&#xff1a; if(isset($_GET[file])){$file $_GET[file];include($file); }else{highlight_file(__FILE__);代码审计&#xff1a; 使用 include() 进行文件包含&#xff0c;通过GET方法 传递参数file 获取被包含的文件。 思路&#xff1a; 利用 data://…

已解决:Uncaught SyntaxError: Unexpected token <

已解决&#xff1a;Uncaught SyntaxError: Unexpected token < 文章目录 写在前面问题描述报错原因分析 解决思路解决办法1. 使用开发者工具检查网络请求2. 验证脚本路径3. 检查服务器配置4. 处理跨域请求5. 检查打包工具配置6. 确认内容类型7. 使用原始文件进行测试8. 处理…

基于SpringBoot的电商网站源码(前台+后台)

主要功能流程&#xff1a; 前台购物&#xff1a;用户在前台进行商品浏览、选购及下单。个人中心查看&#xff1a;用户登录后可在个人中心查看订单状态、个人信息等。后台发货&#xff1a;管理员在后台系统处理订单&#xff0c;包括发货、退款等操作。 运行环境&#xff1a; …