Mybatis动态SQL和模糊查询

news2024/11/24 5:08:58

一. Mybatis动态SQL

动态 SQL 是 MyBatis 的强大特性之一。在 JDBC 或其它类似的框架中,开发人员通常需要手动拼接 SQL 语句。根据不同的条件拼接 SQL 语句是一件极其痛苦的工作。例如,拼接时要确保添加了必要的空格,还要注意去掉列表最后一个列名的逗号。而动态 SQL 恰好解决了这一问题,可以根据场景动态的构建查询。

1. 动态SQL的作用

Mybatis 动态 sql 可以让我们在 Xml 映射文件内,以标签的形式编写动态 sql,完成逻辑判断和动态拼接 sql 。

2. 动态SQL的执行原理

原理为:使用OGNL 从 sql 参数对象中计算表达式的值,根据表达式的值动态拼接 sql,以此来完成动态 sql 的功能。

OGNL (Object Graph Navigation Language) 是一个开源的表达式引擎。通过使用OGNL,我们能够通过表达式存取Java对象树中的任意属性和调用Java对象树的方法等。

3. 动态SQL的 if 标签和 foreach 标签

if 标签

MyBatis if 类似于 Java 中的 if 语句,是 MyBatis 中最常用的判断语句。使用 if 标签可以节省许多拼接 SQL 的工作,把精力集中在 XML 的维护上。

if 语句使用方法简单,常常与 test 属性联合使用。语法如下:

 <if test="判断条件">sql语句</if>
<update id="updateByPrimaryKeySelective" parameterType="com.xissl.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>

foreach 标签

foreach是用来对集合的遍历,这个和Java中的功能很类似。通常处理SQL中的in语句。

<select id="selectByBids" resultType="com.xissl.model.Book" parameterType="java.util.List" >
    select
    <include refid="Base_Column_List" />
    from t_mvc_book
    where bid in
    <foreach collection="bids" item="bid" open="(" close=")" separator=",">
      #{bid}
    </foreach>
  </select>

二. Mybatis中的模糊查询

这里用了三种方式来实现模糊查询,分别是#{},${}和concat拼接

<select id="selectLike01" resultType="com.xissl.model.Book" parameterType="java.util.List" >
    select
    <include refid="Base_Column_List" />
    from t_mvc_book
    where bname like #{bname}
  </select>

  <select id="selectLike02" resultType="com.xissl.model.Book" parameterType="java.util.List" >
    select
    <include refid="Base_Column_List" />
    from t_mvc_book
    where bname like '${bname}'
  </select>

  <select id="selectLike03" resultType="com.xissl.model.Book" parameterType="java.util.List" >
    select
    <include refid="Base_Column_List" />
    from t_mvc_book
    where bname like concat('%',#{bname},'%')
  </select>

#{}的运行结果为:
在这里插入图片描述

#符号表示一个预编译的参数占位符,它会将传入的参数值进行预处理,将其转义并安全地插入到SQL语句中。这种方式可以有效地防止SQL注入攻击。

${}的运行结果为:
在这里插入图片描述

$符号表示一个字符串替换的占位符,它会将传入的参数值直接替换到SQL语句中,不进行预处理。这种方式在某些情况下可以提供更大的灵活性,但也增加了潜在的安全风险。

concat拼接函数的运行结果为:
在这里插入图片描述

三. Mybatis的结果映射

在MyBatis中,结果映射是指将数据库查询结果映射到Java对象的过程。MyBatis提供了多种方式来进行结果映射,包括基于XML配置和注解配置两种方式。
在XML配置中,可以使用元素来定义结果映射规则。下面是一个简单的示例:

<resultMap id="userResultMap" type="User">
  <id property="id" column="user_id" />
  <result property="username" column="user_name" />
  <result property="email" column="user_email" />
</resultMap>

在上面的示例中,resultMap标签定义了一个名为userResultMap的结果映射,指定了Java对象类型为User。id元素用于指定主键字段的映射关系,result元素用于指定普通字段的映射关系。property属性表示Java对象的属性名,column属性表示数据库表的列名。

在MyBatis的XML配置中,resultType属性用于指定查询结果的类型。它可以直接指定一个Java类作为结果类型,MyBatis会自动将查询结果映射到该类的对象。
下面是一个示例:

<select id="getUserById" resultType="com.example.User">
  SELECT * FROM user WHERE id = #{id}
</select>

在上面的示例中,resultType属性指定了查询结果的类型为com.example.User,即User类。MyBatis会根据查询结果的列名和Java类的属性名进行自动映射,将查询结果映射到User对象。
需要注意的是,使用resultType属性时,要求查询结果的列名和Java类的属性名保持一致,或者使用别名来进行映射。如果查询结果的列名和Java类的属性名不一致,或者查询结果包含多个表的列,建议使用resultMap标签来定义更灵活的结果映射规则。
另外,resultType属性也可以指定为基本数据类型或其包装类,例如int、java.lang.Integer等。这样,MyBatis会将查询结果的第一列直接映射到指定的基本数据类型或包装类。
总之,resultType属性是一种简单的结果映射方式,适用于简单的查询场景。

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

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

相关文章

MySQL 8.0 启动和关闭流程

启动流程 mysql 服务端对启动命令进行了层层封装&#xff0c;目的是为了操作简便。同时也提供了原生的启动方式以便应对特殊情况。 建议: systemctl start起来的就使用systemctl stop停。 如果用mysqld stop&#xff0c; systemctl识别不到。 启停方式 systemd ---->/et…

Flink源码之Checkpoint执行流程

Checkpoint完整流程如上图所示&#xff1a; JobMaster的CheckpointCoordinator向所有SourceTask发送RPC触发一次CheckPointSourceTask向下游广播CheckpointBarrierSouceTask完成状态快照后向JobMaster发送快照结果非SouceTask在Barrier对齐后完成状态快照向JobMaster发送快照结…

python 声音录制、保存及播放

参考&#xff1a; https://huggingface.co/suno/bark 1、录制、保存 参考&#xff1a; https://blog.csdn.net/weixin_42357472/article/details/131269539&#xff08;ffmpeg也可以录制&#xff09; 下面使用的sounddevice包录制 import scipysampling_rate model.config…

云计算在IT领域的发展和应用

文章目录 云计算的发展历程云计算的核心概念云计算在IT领域的应用1. 基础设施即服务&#xff08;IaaS&#xff09;&#xff1a;2. 平台即服务&#xff08;PaaS&#xff09;&#xff1a;3. 软件即服务&#xff08;SaaS&#xff09;&#xff1a; 云计算的拓展应用结论 &#x1f3…

WPF 项目中 MVVM模式 的简单例子说明

一、概述 MVVM 是 Model view viewModel 的简写。MVVM模式有助于将应用程序的业务和表示逻辑与用户界面清晰分离。 几个概念的说明&#xff1a; model :数据&#xff0c;界面中需要的数据&#xff0c;最好不要加逻辑代码view : 视图就是用户看到的UI结构 xaml 文件viewModel …

百度商业AI 技术创新大赛赛道二:AIGC推理性能优化TOP10之经验分享

朋友们&#xff0c;AIGC性能优化大赛已经结束了&#xff0c;看新闻很多队员已经完成了答辩和领奖环节&#xff0c;我根据内幕人了解到&#xff0c;比赛的最终代码及结果是不会分享出来的&#xff0c;因为办比赛的目的就是吸引最优秀的代码然后给公司节省自己开发的成本&#xf…

DataLoader PyTorch 主要参数的含义

定义&#xff1a; DataLoader类是一个用于从数据集&#xff08;dataset&#xff09;中加载数据&#xff0c;并以迭代器&#xff08;iterator&#xff09;的形式返回数据样本&#xff08;data samples&#xff09;的工具。您给出的两个字典&#xff08;dictionary&#xff09;分…

2023河南萌新联赛第(六)场:河南理工大学 C - 旅游

2023河南萌新联赛第&#xff08;六&#xff09;场&#xff1a;河南理工大学 C - 旅游 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K Special Judge, 64bit IO Format: %lld 题目描述 小C喜欢旅游&#xf…

Global Mapper Pro24.1中文版安装教程

作为一款先进而全面的地理空间软件&#xff0c;Global Mapper Pro在地形分析、点云编辑、无人机收集的图像处理等方面表现出色。该程序的最新版本致力于扩展这一功能&#xff0c;包括Python编程语言集成、点云分割辅助手动分类以及地形绘制手动高程网格编辑。Global Mapper Pro…

Mybatis的核心配置

目录 一、environments环境配置 二、propertis资源配置 三、typeAliases类型别名 四、mappers映射 五、其他标签 一、environments环境配置 标签名描述<environments>用于配置多个环境的容器标签&#xff0c;可以包含多个 <environment> 子标签。<environm…

第6天----【位运算进阶之-----位与()】七夕特别版

今天我们来学习C语言的位与。 ❤️C语言的位与&#xff08;&&#xff09;操作是一种按位运算符&#xff0c;用于对两个操作数的每个对应位执行逻辑与操作。它的操作规则如下&#xff1a; 如果两个操作数的对应位都为1&#xff0c;则结果的对应位也为1。&#xff08;全1才…

vue vs react vue3 和 react区别

vue 简介&#xff1a;渐进式 JavaScript 框架 来源&#xff1a;最初由 Evan You &#xff08;尤雨溪&#xff09;于2014年开发。Evan You之前在Google研究过AngularJS&#xff0c;并提取了Angular的部分特性以提供一个更轻量级的框架 版本&#xff1a; vue 1x&#xff1a;2014…

如何使用Nmap进行端口扫描和服务识别?

今天将重点介绍如何使用Nmap进行端口扫描和服务识别。Nmap是一款强大的网络扫描工具&#xff0c;它可以帮助我们快速了解目标主机的开放端口和运行的服务。 1. 什么是Nmap&#xff1f; Nmap&#xff08;Network Mapper&#xff09;是一个开源的网络扫描工具&#xff0c;用于发…

xcode15 change

jump to define 由原先的 control command left click 改为command left click

安达发|APS生产排产软件的作用有哪些?

生产排产管理软件作用有哪些&#xff1f;很多生产型企业在生产计划排产环节&#xff0c;基本还靠手工方式在Excel中进行。而且还因参与制定和使用表格的人较多&#xff0c;表格制作水平参差不齐&#xff0c;极易造成生产计划及后续环节管理混乱。此时&#xff0c;就需借助专业的…

回归预测 | MATLAB实现GA-ELM遗传算法优化极限学习机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现GA-ELM遗传算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现GA-ELM遗传算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本介绍程序…

外包干了三年,技术退步明显...

先说一下自己的情况。大专生&#xff0c;19年通过校招进入湖南某软件公司&#xff0c;干了接近3年的测试&#xff0c;今年年上旬&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了三年&#xff0c…

【音视频】基于webrtc的聊天室的设计

目录 术语 webrtc建连流程 系统整体架构 信令服务器房间状态管理 用户加入房间流程 用户加入房间并推流&#xff1a; 其他用户订阅此用户流 用户加入房间并订阅房间其他所有用户 用户退出房间流程 平行集群模式​编辑 第一阶段demo 设计 参考文章 术语 sdp: 在webrt…

如何使用 HOOPS Exchange SDK 和 Polygonica Bridge

这里将讨论使用 HOOPS Exchange 和 Polygonica 以及它们之间的桥梁进行 CAD 访问和网格处理。--提供Crack HOOPS 全系列SDK HOOPS Exchange 基础知识 首先&#xff0c;让我们简单回顾一下 HOOPS Exchange。HOOPS Exchange 是一款具有 C 接口的数据访问 SDK&#xff0c;支持导入…

AMEYA360邀您参加越南NEPCON VIETNAM电子元器件材料及生产设备展览会

9月6日-8日&#xff0c;极具影响力的2023越南电子元器件展(Nepcon Vietnam)即将在越南河内展览中心(I.C.E) 隆重举办。 越南电子元器件材料及生产设备展览会是越南唯一的电子制造SMT、测试技术、设备和支持产业的展会&#xff0c;也是励展博览集团旗下知名展会品牌NEPCON系列展…