当前位置: 首页 > news >正文

MyBatis动态sql

文章目录

  • 一、MyBatis动态sql
    • 1.1 概述
    • 1.2 if元素
    • 1.3 foreach元素
  • 二、模糊查询
    • 2.1 使用#{字段名}
    • 2.2 使用${字段名}
    • 2.3 使用concat{'%',#{字段名},'%'}
    • 2.4 mybatis中#与$的区别
  • 三、MyBatis结果映射
    • 3.1 区别
    • 3.2 应用场景

一、MyBatis动态sql

1.1 概述

MyBatis是一个Java持久化框架,而动态SQL是MyBatis中的一个特性。动态SQL允许在SQL语句中根据不同的条件动态地生成不同的SQL片段。这样可以根据不同的情况来构建灵活的SQL查询语句,而不需要编写多个静态的SQL语句。动态SQL可以通过使用if语句、choose语句、foreach语句等来实现条件判断、循环等功能,从而根据不同的条件生成不同的SQL语句。这种灵活性使得MyBatis在处理复杂的查询需求时非常有用。

1.2 if元素

用于根据条件判断是否包含某个SQL片段。

<update id="updateByPrimaryKeySelective" parameterType="com.xqx.model.Book" >update t_mvc_book<set ><if test="bname != null" >bname = #{bname,jdbcType=VARCHAR},</if><if test="price != null" >price = #{price,jdbcType=REAL},</if></set>where bid = #{bid,jdbcType=INTEGER}</update>

在这个示例动态生成查询语句的条件部分中。id属性指定了映射的唯一标识,也是映射的方法名字。

1.3 foreach元素

用于遍历集合或数组,并生成对应的SQL语句。

 <select id="selectByIn" resultMap="com.xqx.model.Book" parameterType="java.util.List" >select<include refid="Base_Column_List" />from t_mvc_bookwhere bid in<foreach collection="bookIds" open="(" close=")" separator="," item="bid">#{bid}</foreach></select>

二、模糊查询

2.1 使用#{字段名}

这种方式是最常见且推荐的方式。
在SQL语句中使用#{字段名}会将字段值作为预编译参数进行处理,可以有效防止SQL注入攻击。MyBatis会自动为参数添加引号和转义特殊字符,确保查询的准确性和安全性。

 <select id="selectBooksLike1" resultType="com.xqx.model.Book" parameterType="java.lang.String">select * from t_mvc_book where bname like #{bname}
</select>

2.2 使用${字段名}

这种方式是直接将字段值替换到SQL语句中。
在SQL语句中使用${字段名}会将字段值直接拼接到SQL语句中,没有经过预编译处理。
使用这种方式更加灵活,可以完成一些复杂的字符串拼接操作.

  <select id="selectBooksLike2" resultType="com.xqx.model.Book" parameterType="java.lang.String">select * from t_mvc_book where bname like '${bname}'
</select>

2.3 使用concat{‘%’,#{字段名},‘%’}

这种方式使用concat函数将字段值与通配符’%'进行拼接。
类似于第一种方式,使用了预编译参数的方式,相对安全且可读性较好。这种方式适用于需要在查询条件中同时使用通配符前后匹配的情况。

 <select id="like3" resultType="com.xqx.model.Book" parameterType="java.lang.String">select<include refid="Base_Column_List" />from t_mvc_bookwhere bname like concat('%',#{bname},'%');</select>

2.4 mybatis中#与$的区别

  1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。
    如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by ‘111’,
    如果传入的值是id,则解析成的sql为order by “id”.

  2. $将传入的数据直接显示生成在sql中。
    如:order by u s e r i d user_id userid,如果传入的值是111,那么解析成sql时的值为order by 111,
    如果传入的值是id,则解析成的sql为order by id.

    <select id="executeSQL" >${executeSQL}
    </select>
    
  3. #方式能够很大程度防止sql注入。

  4. $方式无法防止Sql注入。

  5. $方式一般用于传入数据库对象,例如传入表名.

  6. 一般能用#的就别用$.

三、MyBatis结果映射

3.1 区别

"resultType"是指查询结果的类型。它指定了查询结果的数据类型,通常是一个Java类或基本数据类型。当查询结果只有一个字段时,可以使用"resultType"来指定该字段的数据类型。

"resultMap"是指查询结果的映射规则。它定义了如何将查询结果映射到Java对象或数据结构中。“resultMap"通常用于复杂的查询结果,其中涉及多个表或多个字段的组合。通过定义"resultMap”,可以指定每个字段如何映射到Java对象的属性或数据结构的元素。

简而言之,"resultType"用于简单的查询结果类型,而"resultMap"用于复杂的查询结果映射规则。

3.2 应用场景

在使用MyBatis中拥有多个场景,返回的结果是多样的

  1. 返回单表的对应的实体类,仅有一个查询结果,可以用resultType/resultMap。
  2. 返回单表的对应的实体类,有多个查询结果,可以用resultType/resultMap。
  3. 返回多表对应结果,仅有一个查询结果,通常用resultType也可以用resultMap。
  4. 返回多表对应结果,有多个查询结果,通常用resultType也可以用resultMap。
  5. 返回单个列段,仅有一个查询结果,就用resultType。
  6. 返回单个列段,有多个查询结果,就用resultType。

如果是单表的情况下,resultType与resultMap都可以使用。

  1. 使用resultMap返回映射关系,指的是实体类与数据库字段的关系
  2. 使用resultType返回List
  3. 使用resultType返回单个对象
  4. 使用resultType返回List【适用于多表查询返回结果集】
  5. 使用resultType返回Map<String,Object>【适用于多表查询返回单个结果集】

相关文章:

MyBatis动态sql

文章目录 一、MyBatis动态sql1.1 概述1.2 if元素1.3 foreach元素 二、模糊查询2.1 使用#{字段名}2.2 使用${字段名}2.3 使用concat{%,#{字段名},%}2.4 mybatis中#与$的区别 三、MyBatis结果映射3.1 区别3.2 应用场景 一、MyBatis动态sql 1.1 概述 MyBatis是一个Java持久化框架…...

L1-032 Left-pad 测试点全过

题目 根据新浪微博上的消息&#xff0c;有一位开发者不满NPM&#xff08;Node Package Manager&#xff09;的做法&#xff0c;收回了自己的开源代码&#xff0c;其中包括一个叫left-pad的模块&#xff0c;就是这个模块把javascript里面的React/Babel干瘫痪了。这是个什么样的…...

ssm+Vue.js在线购物系统源码和论文

ssmVue.js在线购物系统源码和论文049 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势…...

港联证券|指数或进入磨底阶段 短期关注环保、煤炭等板块

磨底历来都不是一天能达到的&#xff0c;比方2018年的政策底到商场底&#xff0c;半途也阅历两个多月时间。当下政策底出现之后至今也有近一个月时间&#xff0c;并且下跌量能不断缩短&#xff0c;心情面也降至冰点&#xff0c;种种迹象阐明离真正商场底的构成已经不远了。此时…...

pytorch 实现VGG

VGG全称是Visual Geometry Group&#xff0c;因为是由Oxford的Visual Geometry Group提出的。AlexNet问世之后&#xff0c;很多学者通过改进AlexNet的网络结构来提高自己的准确率&#xff0c;主要有两个方向&#xff1a;小卷积核和多尺度。而VGG的作者们则选择了另外一个方向&a…...

科技项目验收检测报告获取有哪些注意事项,作用都有哪些?

验收测试报告 软件从研发到结束是一个很长的周期&#xff0c;对于软件想要完成上市或者是交付到用户手中之前我们还需要进行一次全面检测&#xff0c;也就是科技项目验收测试&#xff0c;此测试有着严格的要求&#xff0c;需要第三方软件测评机构来完成&#xff0c;并出具科技…...

OceanBase:谁动了我得参数?

作者&#xff1a;郑增权 爱可生南区数据库工程师&#xff0c;爱可生 DBA 团队成员&#xff0c;负责数据库相关技术支持。爱好&#xff1a;桌球、羽毛球、咖啡、电影。 本文来源&#xff1a;原创投稿 爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转…...

Python快速入门体验

Python快速入门体验 一、环境信息1.1 硬件信息1.2 软件信息 二、Conda安装2.1 Conda介绍2.1.1 Conda简介2.1.2 Conda、Anaconda及Miniconda及的关系 2.2 Conda安装包下载2.2.1 Miniconda下载2.2.2 Anconda下载 2.3 Conda安装2.3.1 Miniconda安装2.3.2 Anconda安装 2.4 Conda初始…...

【从零学习python 】68. Python正则表达式中的贪婪和非贪婪模式

文章目录 贪婪和非贪婪模式进阶案例 贪婪和非贪婪模式 Python里数量词默认是贪婪的&#xff08;在少数语言里也可能是默认非贪婪&#xff09;&#xff0c;总是尝试匹配尽可能多的字符&#xff1b; 非贪婪则相反&#xff0c;总是尝试匹配尽可能少的字符。 在*、?、、{m,n}后面…...

MongoDB【CRUD练习-条件查询-文档关系】

练习1-CRUD // 进入test数据库 use test; // 查询文档内容 db.students.find(); // 显示当前数据库中所有集合 show collections; // 向数据库的user集合中插入一个文档 db.users.insertOne({username: "lyh"} ); // 查看当前数据库中所有的集合 发现users集合被创建…...

使用M2Mqtt 接受以及发布MQTT消息

在NuGet库里面直接查找M2Mqtt就可以安装库。 使用framework4.5.2 1.配置文件操作 public static class GModel{public static BassSetup MainSetup { get; set; }public static void GetThisAdd(){MainSetup new BassSetup();string IPAdd ConfigurationManager.AppSettings…...

【SA8295P 源码分析】33 - Android GVM USB 透传配置

【SA8295P 源码分析】33 - Android GVM USB 透传配置 1. QNX 侧配置 USB1 为 GVM 使用2. Android 端配置 dts:以配置 USB1 为例3. QNX 端配置 linux-la.config:以配置 USB1 为例4. 在Android shell 中配置USB0 / USB1 的 Host/device 模式切换系列文章汇总见:《【SA8295P 源…...

华为OD机试 - 过滤组合字符串 - 深度优先搜索dfs算法(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…...

【Unity自制手册】游戏基础API大全

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…...

【LVS】4、HAProxy搭建web集群

目前常见的Web集群调度器分为软件和硬件 软件通常使用开源的LVS、Haproxy、Nginx LVS性能最好&#xff08;基于内核转发&#xff09;&#xff0c;但是搭建相对复杂&#xff1b;Nginx的upstream模块支持群集功能&#xff0c;但是对群集节点健康检查功能不强&#xff0c;高并发性…...

【应用层】网络基础 -- HTTP协议

再谈协议HTTP协议认识URLurlencode和urldecodeHTTP协议格式HTTP的方法HTTP的状态码HTTP常见HeaderHTTP周边会话保持 再谈协议 协议是一种 “约定”. socket api的接口&#xff0c;在读写数据时&#xff0c;都是按 “字符串” 的方式来发送接收的(tcp是以字节流的方式发送的&am…...

【线性DP】模型总结(terse版)

【线性DP】模型总结 最长上升子序列 DP法 ​ dp[i]表示以i结尾的最长上升子序列的长度。 ​ 对于每个i&#xff0c;遍历j1~i-1,若a[j] < a[i], 则dp[i] max(dp[i], dp[j] 1); 二分法 ​ 可以优化时间复杂度。 ​ dp[]数组用来存储当前最长上升子序列。 ​ 若dp[]数…...

conda 常用命令

conda 常用命令 一、创建环境二、删除环境三、环境重命名四 、查看环境列表五、进入某个虚拟环境六、退出当前环境七、查看当前虚拟环境下的所有安装包八、安装或卸载包(进入虚拟环境之后&#xff09;九、分享虚拟环境十、源服务器管理十一、升级十二、卸载十三、卸载十四、pip…...

前端面试:【异步编程】Callback、Promise和Async/Await

嗨&#xff0c;亲爱的JavaScript探险家&#xff01;在JavaScript开发的旅程中&#xff0c;你会经常遇到异步编程的需求。为了处理异步操作&#xff0c;JavaScript提供了多种机制&#xff0c;包括Callbacks、Promises和Async/Await。本文将深入介绍这些机制&#xff0c;让你能够…...

大数据(四):Pandas的基础应用详解

专栏介绍 结合自身经验和内部资料总结的Python教程&#xff0c;每天3-5章&#xff0c;最短1个月就能全方位的完成Python的学习并进行实战开发&#xff0c;学完了定能成为大佬&#xff01;加油吧&#xff01;卷起来&#xff01; 全部文章请访问专栏&#xff1a;《Python全栈教…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...