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

yizhihongxing

首先,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日

相关文章

  • Redis缓存实例分步详解

    Redis缓存实例分步详解 Redis是一个高性能的非关系型数据库,也是一个常用的缓存技术。本文将详细讲解如何使用Redis实现缓存,包括以下步骤: 安装Redis 配置Redis 使用Redis实现缓存 1. 安装Redis Redis的安装有多种方式,可以通过源码编译、apt-get安装、docker安装等等。这里以通过apt-get方式安装为例。具体步…

    database 2023年5月22日
    00
  • SQL通用语法以及分类图文详解

    SQL通用语法及分类图文详解 SQL是结构化查询语言(Structured Query Language)的缩写,是一种用于管理关系数据库管理系统(RDBMS)中数据的标准语言。SQL可以用于创建数据库,读取数据,更新数据以及删除数据。本篇文章将详细讲解SQL的通用语法及分类,方便初学者快速掌握。 SQL通用语法 SQL通用语法由关键字、表达式、操作符等组成…

    database 2023年5月21日
    00
  • CentOS mysql安装系统方法

    以下是关于CentOS mysql安装系统方法的完整攻略: 准备工作 在开始安装mysql之前,我们需要先安装一些必要的软件依赖,以确保mysql能够正常运行。 $ sudo yum install wget $ sudo yum install curl $ sudo yum install gcc $ sudo yum install gcc-c++ $…

    database 2023年5月22日
    00
  • ADODB结合SMARTY使用~超级强

    ADODB是一款非常流行的PHP数据访问库,而Smarty则是一款模板引擎,将二者结合起来可以实现非常强大的Web应用程序。下面是ADODB结合Smarty使用的完整攻略。 步骤一:安装ADODB和Smarty 使用ADODB和Smarty必须先安装它们。可以通过Composer来安装这两个库。 composer require adodb/adodb-ph…

    database 2023年5月22日
    00
  • laravel实现按月或天或小时统计mysql数据的方法

    要实现按照月、日或小时统计MySQL数据,我们可以使用Laravel框架提供的Eloquent ORM来进行查询。 步骤一:准备数据模型 首先我们需要建立一个数据模型来与数据库中的表进行交互。假设我们有一个日志表,用来记录用户在我们网站上的行为。在Laravel中,我们可以使用以下命令来创建一个日志模型: php artisan make:model Log…

    database 2023年5月22日
    00
  • Mysql高性能优化技能总结

    Mysql高性能优化技能总结 背景 在高并发访问下,Mysql数据库的性能往往会成为瓶颈,影响应用服务的响应时间。因此,对Mysql进行性能优化是非常必要的。 总结 数据库基本优化 优化导入数据时的性能:使用LOAD DATA LOCAL INFILE代替INSERT,将数据集装载到表中,这种方法比insert快得多,与事务不同,每行被直接插入到表中,处理大…

    database 2023年5月22日
    00
  • 详解Node使用Puppeteer完成一次复杂的爬虫

    一、概述 在Node.js中,Puppeteer是一个高效的爬虫工具。因为它使用的是Chrome浏览器的Headless模式,可以对JavaScript动态生成的网页进行操作。同时,Puppeteer还提供了WebAPI,可以模拟用户的行为,如键盘鼠标操作、表单提交等。本攻略将详细讲解使用Puppeteer完成一次复杂的爬虫。 二、安装Puppeteer n…

    database 2023年5月21日
    00
  • MySql获取当前时间并转换成字符串的实现

    下面是MySQL获取当前时间并转换成字符串的实现攻略。 方法一:使用DATE_FORMAT函数 MySQL中可以使用DATE_FORMAT函数将日期时间类型转换成指定格式的字符串。以下是使用DATE_FORMAT函数获取当前时间并转换成字符串的语句: SELECT DATE_FORMAT(NOW(), ‘%Y-%m-%d %H:%i:%s’); 执行此语句,…

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