MyBatid动态语句且模糊查询

这篇具有很好参考价值的文章主要介绍了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

MyBatid动态语句且模糊查询,java,数据库,开发语言

 在我们前面一篇的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);
    }

 运行结果:

MyBatid动态语句且模糊查询,java,数据库,开发语言

 

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

测试$号

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

运行会报错

MyBatid动态语句且模糊查询,java,数据库,开发语言

 MyBatid动态语句且模糊查询,java,数据库,开发语言

 在测试一遍

MyBatid动态语句且模糊查询,java,数据库,开发语言

 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 查询结果的灵活性和可读性。
 文章来源地址https://www.toymoban.com/news/detail-670576.html

到了这里,关于MyBatid动态语句且模糊查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL数据库查询语句之组函数,子查询语句

    以组为操作单位,一组数据得到一个结果。 在没有手动分组的前提下,整张表默认为一组数据 max(列名):获取最大值 min(列名):获取最小值 sum(列名):获取总和 avg(列名):获取平均值 count(列名):统计值的个数 所有组函数都会自动忽略null值 在某些情况下,我们需要根据需要

    2024年01月23日
    浏览(56)
  • 数据库作业-sql语句查询

    建表的插入数据的表 数据库作业-sql建表和插入数据_快乐的xiao何的博客-CSDN博客 create table supplier( supplierno char(6) primary key, suppliername nvarchar(10), address nvarchar(20), number char(11) )create table category( categoryno char(5) primary key, categoryname varchar(20), descriptions text... https://blog.csdn.net/m0_539670

    2023年04月23日
    浏览(54)
  • MySQL数据库高级查询语句

    基于这两个数据库表格来实现以下实验 concat(x,y)将提供的参数x和y拼接成一个字符串 trim()返回去除指定格式的值 GROUP BY 有一个原则,凡是在 GROUP BY 后面出现的字段,必须在 SELECT 后面出现; 凡是在 SELECT 后面出现的、且未在聚合函数中出现的字段,必须出现在 GROUP BY 后

    2024年02月11日
    浏览(63)
  • MySQL数据库——高级查询语句

    数据库是用来存储数据,更新,查询数据的工具,而查询数据是一个数据库最为核心的功能,数据库是用来承载信息,而信息是用来分析和查看的。所以掌握更为精细化的查询方式是很有必要的。本文将围绕数据的高级查询语句展开。 1.指定指字段进行查询——SELECT 语法:

    2024年02月11日
    浏览(88)
  • 数据库 实验四 select查询语句

    实验四 一、实验目的 (1) 掌握SELECT语句在多表查询中的应用。 (2) 掌握多表连接的几种连接方式及应用。 二、实验要求 1、学生提前准备好实验报告,预习并熟悉实验步骤; 2、遵守实验室纪律,在规定的时间内完成要求的内容; 3、1~2人为1小组,实验过程中独立操作、相互学

    2023年04月20日
    浏览(42)
  • 数据库 SQL高级查询语句:聚合查询,多表查询,连接查询

    创建Students和Courses表 直接查询 设置别名查询 设置条件查询 使用COUNT(*) 和 COUNT(StudentID)是一样的效果,因为StudentID是主键,每行记录的主键都不同。另外我们在聚合查询中还是能使用WHERE子句的,比如我们要 查找年龄大于20岁的学生数量 ,可使用以下SQL语句: 函数 说明 SUM

    2024年02月09日
    浏览(123)
  • 微信小程序 连接云数据库(不使用云函数)进行 登录、注册、查询(包括模糊查询)快速实现 亲测可用

    当连接MySQL的时候总是出现各种各样的小问题,可以选用微信小程序自带的云数据库 注:测试号不能建立云数据库 按图中步骤来 第4步中,有两种添加方式 第一种 第二种 注意: 如果你是粘贴复制的,他会报错 非数字字符\\\"无法使用外部字符串表示法位于第1行 。这时,在第

    2023年04月20日
    浏览(56)
  • WordPress必备数据库SQL查询语句整理

    最近明月给博客和主站都部署了SSL证书,彻彻底底的加入了HTTPS站点行列。这个期间也用到了SQL查询语句来批量的对内链的HTTP前缀做替换,就感觉掌握一些SQL方面的语句还是非常有必要的,这不在【俄语译客】博客上就发现了几条比较实用的,适合 WordPress 实用的SQL语句。于

    2024年02月01日
    浏览(100)
  • MySQL数据库——MySQL SELECT:数据表查询语句

    在 MySQL 中,可以使用 SELECT 语句来查询数据。查询数据是指从数据库中根据需求,使用不同的查询方式来获取不同的数据,是使用频率最高、最重要的操作。 SELECT 的语法格式如下: 其中,各条子句的含义如下: {*|字段列名} 包含星号通配符的字段列表,表示所要查询字段的

    2024年02月05日
    浏览(74)
  • 数据库的基础学习1:select语句的查询

    数据库的三个阶段:人工管理阶段、文件系统阶段、数据库系统阶段 数据库管理系统:DBMS 常见的关系型数据库:Oracle、DB2、mysql 常见的非关系型数据库:MongoDB、redies sql的四部分: DML(update、delete、insert) DDL(create、drop、alter、truncate) DQL(select查询语句) DCL(对数据进行变

    2024年02月08日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包