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;
    }
 
    @Override
    public int deleteByPrimaryKey(Integer bid) {
       return  bookMapper.deleteByPrimaryKey(bid);
    }
 
    @Override
    public int insert(Book record) {
        return bookMapper.insert(record);
    }
 
    @Override
    public int insertSelective(Book record) {
        return bookMapper.insertSelective(record);
    }
 
    @Override
    public Book selectByPrimaryKey(Integer bid) {
        return bookMapper.selectByPrimaryKey(bid);
    }
 
    @Override
    public int updateByPrimaryKeySelective(Book record) {
        return bookMapper.updateByPrimaryKeySelective(record);
    }
 
    @Override
    public int updatByPrimaryKey(Book record) {
        return bookMapper.updatByPrimaryKey(record);
    }
 
    @Override
    public List<Book> selectByBids(List bids) {
         return bookMapper.selectByBids(bids);
    }
 
    @Override
    public List<Book> like1(String bname) {
        return bookMapper.mhcx1(bname);
    }
 
    @Override
    public List<Book> like2(String bname) {
        return bookMapper.mhcx2(bname);
    }
 
    @Override
    public List<Book> like3(String bname) {
        return bookMapper.mhcx3(bname);
    }
 
}

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

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

 运行结果:

 

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

测试$号

  @Test
    public 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 查询结果的灵活性和可读性。
 

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

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

相关文章

云LIS云实验室信息管理系统源码,支持IIS独立部署,Docker部署

云LIS技术架构&#xff1a;Asp.NET CORE 3.1 MVC SQLserver Redis等。 云LIS系统是医院信息管理的重要组成部分之一&#xff0c;它是一个基于B/S架构开发的实验室信息管理系统。整个系统的运行基于WEB层面&#xff0c;只需要在对应的工作台安装一个浏览器软件&#xff0c;有外…

Codeforces Round #894 (Div.3)

文章目录 前言A. Gift Carpet题目&#xff1a;输入&#xff1a;输出&#xff1a;思路&#xff1a;代码&#xff1a; B. Sequence Game题目&#xff1a;输入&#xff1a;输出&#xff1a;思路&#xff1a;代码&#xff1a; C. Flower City Fence题目&#xff1a;输入&#xff1a…

如何开发智慧农牧软件

【引言】随着科技的不断进步&#xff0c;智慧农牧软件在农业和畜牧业领域发挥着重要作用&#xff0c;帮助农牧业提高生产效率、降低成本、提升农产品质量。本文将深入探讨智慧农牧软件的开发&#xff0c;结合专业性和创新之处&#xff0c;为读者提供一份全面的开发方案。 【…

微服务 Nacos配置热部署

在nacos中添加配置文件 在配置列表中添加配置&#xff0c; 注意&#xff1a;项目的核心配置&#xff0c;需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。 从微服务拉取配置 微服务要拉取nacos中管理的配置&#xff0c;并且与…

Android项目如何上传Gitee仓库

前言 最近Android项目比较多&#xff0c;我都是把Android项目上传到Gitee中去&#xff0c;GitHub的话我用的少&#xff0c;可能我还是更喜欢Gitee吧&#xff0c;毕竟Gitee仓库用起来更加方便 一. 创建Gitee仓库 1. 先创建一个Gitee账号&#xff0c;然后登录上去 2. 创建Androi…

使用 Amazon Redshift Serverless 和 Toucan 构建数据故事应用程序

这是由 Toucan 的解决方案工程师 Django Bouchez与亚马逊云科技共同撰写的特约文章。 带有控制面板、报告和分析的商业智能&#xff08;BI&#xff0c;Business Intelligence&#xff09;仍是最受欢迎的数据和分析使用场景之一。它为业务分析师和经理提供企业的过去状态和当前状…

opencv-全景图像拼接

运行环境 python3.6 opencv 3.4.1.15 stitcher.py import numpy as np import cv2class Stitcher:#拼接函数def stitch(self, images, ratio0.75, reprojThresh4.0,showMatchesFalse):#获取输入图片(imageB, imageA) images#检测A、B图片的SIFT关键特征点&#xff0c;并计算…

vue 简单实验 自定义组件 独立模块

1.概要 2.代码 2.1 const Counter {data() {return {counter: 0}},template:<div>Counter: {{ counter }}</div> }export default Counter 2.2 import Counter from ./t2.jsconst app Vue.createApp({components: {component-a: Counter} })app.mount(#count…

Docker 的数据管理与镜像

Docker 的数据管理与镜像 一、Docker 的数据管理1.数据卷2.数据卷容器3.端口映射4.容器互联&#xff08;使用centos镜像&#xff09; 二、Docker 镜像的创建1.基于现有镜像创建2.基于本地模板创建3.基于Dockerfile 创建 三、Dockerfile 操作常用的指令&#xff1a;1.FROM 镜像2…

科技资讯|三星再申请智能戒指商标,智能穿戴进入更小型化发展

三星正在积极扩展可穿戴设备生态&#xff0c;近日向英国知识产权局提交了名为“Samsung Curio”的新商标&#xff0c;其分类为“Class 9”&#xff0c;可能会用于未来的智能戒指。 智能戒指&#xff1a; 可穿戴计算机本质上的智能手环、智能项链、智能眼镜和智能戒指&#xff1…

【实操干货】如何开始用Qt Widgets编程?(三)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 在本文中&#xff0…

三维重建_体素重建_空间雕刻法/体素着色法

目录 1. 三角化和体素重建的区别 2. 空间雕刻法 空间雕刻法的一致性定义 空间雕刻法具体实现 基于八叉树的空间雕刻法具体实现​编辑 空间雕刻法效果展示 3. 体素着色法 体素着色法的缺点&#xff1a;不唯一性​编辑 体素着色法不唯一性解决措施​编辑 体素着色发实验环境与…

基于 SVG 的图形交互方案实践

不知道从什么时候起&#xff0c;人们开始喜欢上数字大屏这种“花里胡哨”的东西&#xff0c;仿佛只要用上“科技蓝”这样神奇的色调&#xff0c;就可以让一家公司焕然一新&#xff0c;瞬间变得科技感满满。不管数字大屏的实际意义&#xff0c;是用来帮助企业监控和决策&#xf…

PyTorch DataLoader 报错 “DataLoader worker exited unexpectedly“ 的解决方案

注意&#xff1a;博主没有重写d2l的源代码文件&#xff0c;而是创建了一个新的python文件&#xff0c;并重写了该方法。 一、代码运行日志 C:\Users\Administrator\anaconda3\envs\limu\python.exe G:/PyCharmProjects/limu-d2l/ch03/softmax_regression.py Traceback (most r…

solidity0.8.0的应用案例12:通用可升级合约UUPS

代理合约中选择器冲突(Selector Clash)的另一个解决办法:通用可升级代理(UUPS,universal upgradeable proxy standard)。代码由OpenZeppelin的UUPSUpgradeable简化而成,不应用于生产。 UUPS 作为透明代理的替代方案,UUPS也能解决"选择器冲突"(Selector Cl…

CSDN编程题-每日一练(2023-08-25)

CSDN编程题-每日一练&#xff08;2023-08-25&#xff09; 一、题目名称&#xff1a;影分身二、题目名称&#xff1a;小鱼的航程(改进版)三、题目名称&#xff1a;排查网络故障 一、题目名称&#xff1a;影分身 时间限制&#xff1a;1000ms内存限制&#xff1a;256M 题目描述&am…

pnpm无法加载文件 (解决方法 )

现在要运行一个TS的项目&#xff0c;我的电脑上没有安装pnpm&#xff0c;导致我的vscode一直报错无法加载。 pnpm安装&#xff1a; npm install -g pnpm pnpm : 无法加载文件 pnpm : 无法加载文件 C:\Users\HP\AppData\Roaming\npm\pnpm.ps1&#xff0c;因为在此系统上禁止运…

adb shell setprop 、开发者选项

App性能调试详解 Android App性能监控工具 更多系统属性参考 一、开启 GPU Render 的profiling bar&#xff1a; Gpu渲染速度 adb shell setprop debug.hwui.profile true adb shell setprop debug.hwui.profile visual_bars adb shell setprop debug.hwui.profile visual…

GO-vscode远程开发和调试

本文内容主要包括&#xff1a; 概述&#xff1a; 主要就是把代码放到服务器上然后远程去开发和调试 工具&#xff1a; vscode 远程端&#xff1a; linux 一.安装远程插件 vscode安装Remote - SSH&#xff0c;Remote Explorer&#xff0c;Remote Development&#xff0c…

pdf编辑文字怎么编辑?这几种简单编辑方法看一看

pdf编辑文字怎么编辑&#xff1f;PDF文件是一种普遍的文档格式&#xff0c;但是在编辑时却比较困难。幸运的是&#xff0c;有许多PDF编辑器可以帮助我们轻松地编辑PDF文件。本文将介绍一些简单的PDF编辑方法&#xff0c;跟着我一起来看看吧&#xff01; 第一种方法&#xff1a;…