MyBatid动态语句且模糊查询

目录

什么是MyBtais动态语句???

MyBatis常用的动态标签和表达式

if标签

Choose标签

where标签

MyBatis模糊查询 

#与$的区别

​编辑

 MyBatis映射

resultType

resultMap


 

什么是MyBtais动态语句???

MyBatis动态语句是指在编写SQL语句时,使用MyBatis提供的动态标签和表达式,根据不同的条件生成不同的SQL语句片段。通过使用动态语句,我们可以根据不同的条件动态地拼接SQL语句,使其更灵活和可复用。

MyBatis常用的动态标签和表达式

if标签

   用于根据条件判断是否包含某个SQL语句片段。当条件成立时,会将<if>标签内部的SQL语句包含到最终生成的SQL语句中

示例代码:

<select id="getUser" parameterType="int" resultType="User">SELECT * FROM user WHERE 1=1<if test="id != null">AND id = #{id}</if><if test="username != null">AND username = #{username}</if>
</select>


上面属性解释,具体定义一个查询语句的标签,id属性指定了查询语句的唯一标识,parameterType属性指定了输入参数的类型,resultType属性指定了返回结果的类型

<if test="id != null">:动态语句的起始标签,用于判断条件是否成立

AND id = #{id}:            :SQL语句片段 将id!=null 成立sql条件包含到最终生成的SQL语句中

AND username = #{username}:SQL语句片段,当条件username != null成立时,将被包含到最终生成的SQL语句中

其中的 test属性用于指定一个表达式,用来判断条件是否成立。表达式可以是任意的合法表达式,通常使用参数的属性进行判断。#{}是MyBatis中的占位符,可以获取参数的值。

Choose标签

使用<choose>标签和<when>、<otherwise>标签来实现多条件选择,根据条件选择对应的SQL语句片段

示例代码:

<select id="getUser" parameterType="int" resultType="User">SELECT * FROM user WHERE 1=1<choose><when test="id != null">AND id = #{id}</when><when test="username != null">AND username = #{username}</when><otherwise>AND age > #{age}</otherwise></choose>
</select>


在上面的代码<otherwise>标签用于指定条件都不成立时执行的SQL语句片段。

where标签

使用<where>标签将条件拼接到WHERE子句中,如果条件不成立则不会生成WHERE关键字 

示例代码:

<select id="getUser" parameterType="int" resultType="User">SELECT * FROM user<where><if test="id != null">AND id = #{id}</if><if test="username != null">AND username = #{username}</if></where>
</select>

Set标签

  使用<set>标签将更新的字段拼接到SET子句中,如果条件不成立则不会生成SET关键字 

实例代码:

<update id="updateUser" parameterType="User">UPDATE user<set><if test="username != null">username = #{username},</if><if test="password != null">password = #{password},</if></set>WHERE id = #{id}

MyBatis模糊查询 

#与$的区别

  #(井号)
      用于预编译阶段,也称为安全的参数替换。当我们使用#来表示一个参数时,MyBatis会自动将传入的参数进行预编译处理,并且会对参数进行类型安全检查,然后将其转义后嵌入到SQL语句中。这样可以防止SQL注入攻击。因此,#通常在我们需要传递动态参数时使用。在SQL语句中使用#表示参数的位置

例如:

SELECT * FROM user WHERE id = #{userId}


    $(美元符号)
(美元符号)则是直接拼接参数值。当我们使用来表示一个参数时,MyBatis会把参数原封不动地拼接到SQL语句中,而不会进行任何转义或预编译处理。这样的参数替换是不安全的,容易受到SQL注入攻击。因此,通常在我们确保参数安全或需要传递动态的表名、列名等情况下使用。在SQL语句中使用表示参数的内容

例如:

SELECT * FROM ${tableName}


注意:使用$进行参数替换时,我们需要自己确保参数的值正确并且安全,以避免潜在的安全风险。而使用#进行参数替换时,MyBatis会帮助我们处理参数的类型安全和转义等问题,更加安全可靠。
 

代码展示

为了更好的体现出#跟$的区别,我们配置三种方式来测试,#和$及concat

 在我们前面一篇的Mybatis讲解中,生成增删改查的类中配置刚所写的xml中的模糊查询方法

 

package com.xiaoxu.mapper;import com.xiaoxu.model.Book;
import org.apache.ibatis.annotations.Param;import java.util.List;
import java.util.Map;public interface  BookMapper {int deleteByPrimaryKey(Integer bid);int insert(Book record);int insertSelective(Book record);Book selectByPrimaryKey(Integer bid);int updateByPrimaryKeySelective(Book record);int updateByPrimaryKey(Book record);List<Book> selectByBids(@Param("bids") List bids);List<Book> like1(@Param("bname")String bname);List<Book> like2(@Param("bname")String bname);List<Book> like3(@Param("bname")String bname);

在前端和后端进行相对应的dao方法

定义一个接口并实现

接口方法:

 List<Book> like1(@Param("bname") String bname);List<Book> like2(@Param("bname") String bname);List<Book> like3(@Param("bname") String bname);

实现类

package com.xiaoxu.biz.impl;import com.xiaoxu.biz.BookBiz;
import com.xiaoxu.mapper.BookMapper;
import com.xiaoxu.model.Book;import java.util.List;/*** @author小徐* @site www.veryedu.cn* @company xu集团* @create 2023-08-20 16:02*/
public class BookBizImpl implements BookBiz {private BookMapper bookMapper;public BookBizImpl() {}public BookMapper getBookMapper() {return bookMapper;}public void setBookMapper(BookMapper bookMapper) {this.bookMapper = bookMapper;}@Overridepublic int deleteByPrimaryKey(Integer bid) {return  bookMapper.deleteByPrimaryKey(bid);}@Overridepublic int insert(Book record) {return bookMapper.insert(record);}@Overridepublic int insertSelective(Book record) {return bookMapper.insertSelective(record);}@Overridepublic Book selectByPrimaryKey(Integer bid) {return bookMapper.selectByPrimaryKey(bid);}@Overridepublic int updateByPrimaryKeySelective(Book record) {return bookMapper.updateByPrimaryKeySelective(record);}@Overridepublic int updatByPrimaryKey(Book record) {return bookMapper.updatByPrimaryKey(record);}@Overridepublic List<Book> selectByBids(List bids) {return bookMapper.selectByBids(bids);}@Overridepublic List<Book> like1(String bname) {return bookMapper.mhcx1(bname);}@Overridepublic List<Book> like2(String bname) {return bookMapper.mhcx2(bname);}@Overridepublic List<Book> like3(String bname) {return bookMapper.mhcx3(bname);}}

接下来测试#号,记得调用#的方法

  @Testpublic void like1() {bookBiz.like1("%圣墟%").forEach(System.out::println);}

 运行结果:

 

#{bname}会将传入的bname值进行预编译转义处理,然后再拼接到SQL语句中

测试$号

  @Testpublic void mhcx2() {bookBiz.mhcx2("%圣墟%").forEach(System.out::println);}

运行会报错

 

 在测试一遍

 MyBatis映射

resultType

  是在 SQL 映射文件中指定查询结果的数据类型。它可以直接指定一个基本数据类型(如 String、Integer 等)或一个实体类的全限定名。当查询结果只包含单个简单数据类型时,通常使用 resultType

例如:

<select id="getUserAge" resultType="Integer">SELECT age FROM user WHERE id = #{userId}
</select>

resultMap

 是用于处理复杂的查询结果映射关系。它定义了数据库列和 Java 对象属性之间的映射规则。通过使用 resultMap,我们可以将查询结果映射到一个复杂的对象结构中,可以包含嵌套查询结果、联合查询等复杂情况。通常,在查询结果需要转换成复杂对象或者集合时使用 resultMap

<resultMap id="userMap" type="User"><id column="id" property="id"/><result column="name" property="name"/><result column="age" property="age"/><!-- 其他属性映射 -->
</resultMap><select id="getUsers" resultMap="userMap">SELECT * FROM user
</select>


其中 <resultMap> 标签定义了 User 类中各个属性与数据库表的列之间的映射规则,并设置了唯一标识符 userMap。在 <select> 标签中使用 resultMap 属性指定查询结果的映射关系。

总结来说,resultType 适用于简单的查询结果映射,而 resultMap 适用于复杂的查询结果映射。根据实际情况选择合适的方式可以提高 MyBatis 查询结果的灵活性和可读性。
 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2.IO控制器

第五章 I/O管理 2.I/O控制器 I/O控制器的组成&#xff1a; I/O控制器负责接收和识别从CPU发来的各种命令&#xff0c;同时需要翻译为具体的设备可以明白的命令&#xff0c;通过控制器与设备的接口发送给具体的设备&#xff0c;让设备执行相应的操作。 一个I/O控制器有可能会负…

vue页面转pdf后分页时文字被横向割裂

效果 预期效果 //避免分页被截断async outPutPdfFn (id, title) {const _t this;const A4_WIDTH 592.28;const A4_HEIGHT 841.89;// dom的id。let target document.getElementById(pdf);let pageHeight target.scrollWidth / A4_WIDTH * A4_HEIGHT;// 获取分割dom&#xf…

流媒体内容分发终极解决方案:当融合CDN与P2P视频交付结合

前言 随着互联网的发展&#xff0c;流媒体视频内容日趋增多&#xff0c;已经成为互联网信息的主要承载方式。相对传统的文字&#xff0c;图片等传统WEB应用&#xff0c;流媒体具有高数据量&#xff0c;高带宽、高访问量和高服务质量要求的特点&#xff0c;而现阶段互联网“尽力…

H.265视频无插件流媒体播放器EasyPlayer.js播放webrtc断流重连的异常修复

H5无插件流媒体播放器EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;可支持H.264与H.265编码格式&#xff0c;性能稳定、播放流畅&#xff0c;能支持WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#…

C语言之扫雷游戏实现篇

目录 主函数test.c 菜单函数 选择循环 扫雷游戏实现分析 整体思路 问题1 问题2 问题3 问题4 游戏函数&#xff08;函数调用&#xff09; 创建游戏盘数组mine 创建游戏盘数组show 初始化游戏盘数组InitBoard 展示游戏盘DisplayBoard 游戏盘置雷SetMine 游戏…

【RocketMQ】NameServer总结

NameServer是一个注册中心&#xff0c;提供服务注册和服务发现的功能。NameServer可以集群部署&#xff0c;集群中每个节点都是对等的关系&#xff08;没有像ZooKeeper那样在集群中选举出一个Master节点&#xff09;&#xff0c;节点之间互不通信。 服务注册 Broker启动的时候会…

【2023新教程】树莓派定时自动拍照并上传腾讯云对象存储COS

1 换源 仅适用于Release date: May 3rd 2023、Debian version: 11 (bullseye)这个树莓派OS版本&#xff0c;其他版本不保证有效。 首先使用如下命令&#xff0c;查看自己树莓派的架构。 uname -a结果如下&#xff1a; 如果红圈处显示为aarch64&#xff0c;使用命令sudo na…

JVM元空间溢出的排除思路

背景&#xff1a; java的应用我们为了防止元空间的无限扩展&#xff0c;一般都会设置MaxMetaSpace参数&#xff0c;一般来说只要这个值是512M或者1G左右就足够了&#xff0c;不过今天遇到一个meta空间溢出问题&#xff0c;简单记录下排除的思路 meta元空间溢出 最开始的现象…

【hive】简单介绍hive的几种join

文章目录 前言1. Common Join2. Map Join介绍&#xff1a;使用方法&#xff1a;限制&#xff1a; 3. Bucket Map Join介绍&#xff1a;好处&#xff1a;使用条件&#xff1a;使用方法&#xff1a; 4. Sort Merge Bucket Map Join介绍&#xff1a;如何使用&#xff1a; 5. Skew …

Keras三种主流模型构建方式:序列模型、函数模型、子类模型开发实践,以真实烟雾识别场景数据为例

Keras和PyTorch是两个常用的深度学习框架&#xff0c;它们都提供了用于构建和训练神经网络的高级API。 Keras: Keras是一个高级神经网络API&#xff0c;可以在多个底层深度学习框架上运行&#xff0c;如TensorFlow和CNTK。以下是Keras的特点和优点&#xff1a; 优点&#xf…

【Spring】Spring循环依赖

目录 什么是循环依赖问题 循环依赖具体是怎么解决的 具体的解决步骤&#xff1a; 通俗实例&#xff1a; 严谨的循环依赖解决图例 为什么使用的是三级缓存&#xff0c;二级缓存不够用吗&#xff1f; 什么是循环依赖问题 Spring的循环依赖是指在Bean之间存在相互依赖关…

[Linux]进程概念

[Linux]进程概念 文章目录 [Linux]进程概念进程的定义进程和程序的关系Linux下查看进程Linux下通过系统调用获取进程标示符Linux下通过系统调用创建进程-fork函数使用 进程的定义 进程是程序的一个执行实例&#xff0c;是担当分配系统资源&#xff08;CPU时间&#xff0c;内存…

解决Pandas KeyError: “None of [Index([...])] are in the [columns]“问题

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

c++都补了c语言哪些坑?

目录 1.命名空间 1.1 定义 1.2 使用 2.缺省参数 2.1 概念 2.2 分类 3.函数重载 4.引用 4.1 概念 4.2 特性 4.3 常引用 4.4 引用和指针的区别 5.内联函数 1.命名空间 在 C/C 中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称将…

windows下redis设置redis开机自启动方法(保姆级)

1.找到Redis所在的目录&#xff0c;在文件路径框中输入cmd: 2.进入到控制台下的Redis所在目录,输入下列命令: redis-server --service-install redis.windows-service.conf --loglevel verbose 3.找到redis.windows-service.conf文件,双击打开设置redis服务的密码: (不想设置密…

使用 Nacos 作为 Spring Boot 配置中心

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

【图像分类】基于卷积神经网络和主动学习的高光谱图像分类(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Ubuntu20.04搭建OpenGL环境(glfw+glad)

Ubuntu20.04搭建OpenGL环境(glfwglad) Linux环境搭建 本文在VMware安装Ubuntu20.04桌面版的环境下搭建OpenGL&#xff0c;按照本文搭建完成后可以执行LearnOpenGL网站上的demo。 关于VMware可自行到VMware Workstation Pro | CN下载 关于Ubuntu20.04桌面版可自行到官网或In…

k8s简介、虚拟机快速搭建k8s集群、集群管理方式及K8S工作原理和组件介绍

文章目录 1、k8s简介1.1、部署方式的变迁1.2、定义1.3、Kubernetes提供的功能 2、虚拟机快速搭建k8s集群2.1、虚拟机配置&#xff08;centos7 2G内存2个处理器&#xff09;2.2、基础环境准备2.3、docker安装&#xff08;易踩坑&#xff09;2.4、安装k8s组件2.5、master节点部署…

Python搭建http文件服务器实现手机电脑文件传输功能

第一种代码的界面如下&#xff1a;&#xff08;有缺点&#xff0c;中文乱码&#xff09; # !/usr/bin/env python3 # -*- coding:utf-8 _*-"""Simple HTTP Server With Upload. python -V3.6 This module builds on http.server by implementing the standard G…