MyBatis中模糊查询使用CONCAT(‘%’,#{str},’%’)出错的解决

首先,MyBatis中模糊查询使用CONCAT('%',#{str},'%')是比较常见的一种方式,但是在实际应用中,如果不注意一些细节,就容易出现错误。

问题现象:当使用如下代码时,查询结果为空:

<select id="findByNameLike" parameterType="java.lang.String" 
         resultType="com.example.User">
    SELECT * FROM user WHERE username LIKE CONCAT('%',#{name},'%')
</select>

这种问题的原因是,MyBatis的占位符#{}将传入的参数当作一个字符串处理,如果传入的值为null,那么在进行模糊查询时,会报出语法错误,从而导致查询结果为空。

解决方案一:

为了解决该问题,可以将#{}占位符转化为${}占位符,如下所示:

<select id="findByNameLike" parameterType="java.lang.String"  
        resultType="com.example.User">
    SELECT * FROM user WHERE username LIKE CONCAT('%', '${name}', '%')
</select>

使用${}占位符,解析器会将传入的参数当作文本来处理,如果传入的值为null,则最终生成的sql语句中就不会出现该值,从而避免了语法错误。这种方式的缺点是存在sql注入的风险,应用时需要谨慎操作。

示例一:

假设我们要查询所有用户名中包含“admin”关键词的用户信息,可以使用以下代码:

<select id="findAdminUsers" parameterType="java.lang.String" resultType="com.example.User">
    SELECT * FROM user
    WHERE username LIKE CONCAT('%', '${name}', '%')
</select>

然后在Java中执行:

List<User> adminUsers = sqlSession.selectList("findAdminUsers", "admin");

解决方案二:

另一种方式是使用IF标签来判断传入的值是否为null,如下所示:

<select id="findByNameLike" parameterType="java.lang.String"  
         resultType="com.example.User">
    SELECT * FROM user 
    <if test="name != null">
        WHERE username LIKE CONCAT('%', #{name}, '%')
    </if>
</select>

如果传入的值为null,则不会执行if语句块中的代码,从而避免了语法错误,同时也不存在sql注入的风险。

示例二:

假设我们要查询用户名中包含关键词的用户信息,如果没有传入关键词,则返回所有用户信息,可以使用以下代码:

<select id="findUsers" parameterType="java.lang.String" resultType="com.example.User">
    SELECT * FROM user 
    <if test="name != null">
        WHERE username LIKE CONCAT('%', #{name}, '%')
    </if>
</select>

然后在Java中执行:

List<User> users = sqlSession.selectList("findUsers", null);
List<User> adminUsers = sqlSession.selectList("findUsers", "admin");

以上就是MyBatis中模糊查询使用CONCAT('%',#{str},'%')出错的解决攻略,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MyBatis中模糊查询使用CONCAT(‘%’,#{str},’%’)出错的解决 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • 数据库:socketserver模块、MySQL(一)

    一、socketserver实现并发 基于tcp的套接字,关键就是两个循环,一个链接循环,一个通信循环。 socketserver模块中分两大类:server类(解决链接问题)和request类(解决通信问题) server类: request类: 继承关系:   以下述代码为例,分析socketserver源码: ftpserver=socketserve…

    MySQL 2023年4月13日
    00
  • Centos7 安装 redis4.x

    一、安装redis 第一步:下载redis安装包 wget http://download.redis.io/releases/redis-4.0.6.tar.gz [root@iZwz991stxdwj560bfmadtZ local]# wget http://download.redis.io/releases/redis-4.0.6.tar.gz -…

    Redis 2023年4月11日
    00
  • MySQL InnoDB存储引擎的深入探秘

    MySQL InnoDB存储引擎的深入探秘 简介 MySQL是一款常用的关系型数据库管理系统,而InnoDB作为MySQL的默认存储引擎也是非常重要的一部分。InnoDB存储引擎是由Oracle公司开发的一款支持事务的存储引擎,它支持ACID(原子性、一致性、隔离性、持久性)事务特性,并具有高并发、高可靠性等优点,因此在许多Web应用程序中得到广泛应用。 本…

    database 2023年5月19日
    00
  • mysql查询的控制语句图文详解

    MySQL 是一种常用的关系型数据库管理系统,提供了多种查询数据的控制语句,查询控制语句是 MySQL 最常用的功能之一。本文将详细讲解 “MySQL 查询的控制语句图文详解”,以帮助读者更好地掌握 MySQL 数据库查询的技能。 1. 查找表数据 可以使用以下命令来查找表中数据: SELECT columns FROM table_name WHERE c…

    database 2023年5月21日
    00
  • .NetCore下基于FreeRedis实现的Redis6.0客户端缓存之缓存键条件优雅过滤

    前言 众所周知内存缓存(MemoryCache)数据是从内存中获取,性能表现上是最优的,但是内存缓存有一个缺点就是不支持分布式,数据在各个部署节点上各存一份,每份缓存的过期时间不一致,会导致幻读等各种问题,所以我们实现分布式缓存通常会用上Redis 但如果在高并发的情况下读取Redis的缓存,会进行频繁的网络I/O,假如有一些不经常变动的热点缓存,这不就会白…

    Redis 2023年4月11日
    00
  • Spring中的事务传播行为示例详解

    下面是对“Spring中的事务传播行为示例详解”的完整攻略: 简介 Spring框架提供了事务管理机制,使用该机制可以方便地实现事务控制,避免出现数据的脏读、不可重复读和幻读问题。在Spring事务管理机制中,事务传播行为是一个很重要的概念,它可以控制事务的触发范围,处理运行中的事务该如何被其他事务影响。 在这篇攻略中,我们将会详细讲解Spring中的事务传…

    database 2023年5月21日
    00
  • C# SQLite执行效率的优化教程

    C# SQLite执行效率的优化主要从以下几个方面入手: 1. 数据库设计优化 在数据库设计时,应遵循以下原则进行优化: 1.1 表字段设计 表字段设计时,应尽量避免使用BLOB(二进制类型)和TEXT类型,这类字段需要频繁的I/O操作和内存申请,对性能会造成不小的影响。如果确实需要使用这类字段,可以通过异步读写或者考虑分表进行优化。 1.2 索引优化 索引…

    database 2023年5月19日
    00
  • SQL Server连接失败错误及解决第3/5页

    SQL Server连接失败错误及解决攻略 引言 在使用SQL Server进行数据管理和操作时,有时会遇到连接失败的错误。这些错误可能是由于多种原因导致的,包括网络故障、服务器配置问题、安全设置等等。本篇文章将讲解一些可能的原因和解决方法,以帮助你快速解决连接失败的问题。 连接失败原因及解决方法 1. 网络故障 当你尝试连接到SQL Server时,可能会…

    database 2023年5月21日
    00
合作推广
合作推广
分享本页
返回顶部