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日

相关文章

  • 详解MySQL的5种整数类型

    MySQL支持多种整数类型,每种类型的范围大小和存储空间不同。 下面是MySQL的整数类型及其说明: TINYINT类型 TINYINT类型从-128到127的有符号范围或0到255的无符号范围。大小为1字节。 使用实例: CREATE TABLE test_tinyint ( id INT PRIMARY KEY, t TINYINT SIGNED, u …

    MySQL 2023年3月9日
    00
  • 关于MyBatis中SqlSessionFactory和SqlSession简解

    当我们使用MyBatis框架时,SqlSessionFactory和SqlSession是其中两个非常重要的类,下面我来一一解释它们的作用和用法。 SqlSessionFactory SqlSessionFactory是MyBatis中用来创建SqlSession的工厂类。它的主要作用是提供一个数据库连接的配置信息和创建SqlSession的方式。在使用My…

    database 2023年5月21日
    00
  • Mysql占用CPU过高如何优化,如何解决 批量 kill mysql 中运行时间长的sql

    2017-02-28 15:13 331人阅读 评论(0) 举报   MySQL占用CPU过高如何优化   一次生产DB服务器的 超负荷运行问题解决: 1.查看生产DB服务器top列表, 执行 top 命令 查看Cpu(s) 参数一直处于 98% 状态 ,load average达到了 5  (4核服务器)   可见DB已经超负荷运行了   2.使用root…

    MySQL 2023年4月13日
    00
  • 解决MybatisPlus SqlServer OFFSET 分页问题

    下面就是关于“解决MybatisPlus SqlServer OFFSET 分页问题”的完整攻略: 问题描述 在使用 MybatisPlus 进行开发时,如果在 SqlServer 上使用 OFFSET 分页时,可能会遇到一些问题。问题的具体表现为在使用 OFFSET 分页时查询结果出现了多条重复的数据。 解决方法 针对上述问题,我们可以通过以下两种方式来解…

    database 2023年5月21日
    00
  • c#操作Redis的5种基本类型汇总(转载)

    前言 在我们的项目中,通常会把数据存储到关系型数据库中,比如Oracle,SQL Server,Mysql等,但是关系型数据库对于并发的支持并不是很强大,这样就会造成系统的性能不佳,而且存储的数据多为结构化数据,对于非结构数据(比如文本)和半结构化数据(比如JSon) 就显得不够灵活,而非关系型数据库则很好的弥补了这两点, 我们通常把读操作频繁的数据写入Re…

    Redis 2023年4月12日
    00
  • MYSQL大量写入问题优化详解

    MYSQL大量写入问题优化详解 在MYSQL中进行大量写入操作时,可能会遇到性能瓶颈和效率不高的问题。本文将针对大量写入问题进行优化详解。 问题分析 在MYSQL中,进行大量写入操作时,可能会出现以下问题: 数据库性能瓶颈。对数据库进行大量写入操作时,可能会导致数据库性能瓶颈,导致整个系统的性能下降。 数据丢失。对数据库进行大量写入操作时,可能出现数据丢失的…

    database 2023年5月19日
    00
  • linux下perl操作mysql数据库(需要安装DBI)

    下面是在Linux下使用perl操作mysql数据库的完整攻略。在操作mysql数据库之前,需要通过安装DBI模块来使perl能够连接到mysql数据库。 安装DBI 在Linux中,可以使用命令行进行安装: sudo apt-get install libdbd-mysql-perl 如果提示找不到该包,可以先更新一下apt-get: sudo apt-g…

    database 2023年5月22日
    00
  • Mysql数据库性能优化二

    下面我将为您详细讲解“Mysql数据库性能优化二”的完整攻略。 1. 确定性能瓶颈 在进行Mysql数据库性能优化时,首先需要确定性能瓶颈。通常有如下几个方面需要检查: 1.1. MySQL 配置参数 MySQL 的一些配置参数可以影响 MySQL 的性能,例如缓冲池的大小,最大连接数等等。这些参数可以通过修改 my.cnf 文件来实现。 1.2. SQL …

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