MyBatis实现模糊查询的几种方式

原创 2018年04月15日 14:41:54

在学习MyBatis过程中想实现模糊查询,可惜失败了。后来上百度上查了一下,算是解决了。记录一下MyBatis实现模糊查询的几种方式。 
  数据库表名为test_student,初始化了几条记录,如图: 
  数据库表内容 
   
  起初我在MyBatis的mapper文件中是这样写的:

    <select id="searchStudents" resultType="com.example.entity.StudentEntity"
        parameterType="com.example.entity.StudentEntity">
        SELECT * FROM test_student
        <where>
            <if test="age != null and age != '' and compare != null and compare != ''">
                age
                ${compare}
                #{age}
            </if>
            <if test="name != null and name != ''">
                AND name LIKE '%#{name}%'
            </if>
            <if test="address != null and address != ''">
                AND address LIKE '%#{address}%'
            </if>
        </where>
        ORDER BY id
    </select>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

写完后自我感觉良好,很开心的就去跑程序了,结果当然是报错了: 
报错

  经百度得知,这么写经MyBatis转换后(‘%#{name}%’)会变为(‘%?%’),而(‘%?%’)会被看作是一个字符串,所以Java代码在执行找不到用于匹配参数的 ‘?’ ,然后就报错了。

解决方法

1.用${…}代替#{…}

   <select id="searchStudents" resultType="com.example.entity.StudentEntity"
        parameterType="com.example.entity.StudentEntity">
        SELECT * FROM test_student
        <where>
            <if test="age != null and age != '' and compare != null and compare != ''">
                age
                ${compare}
                #{age}
            </if>
            <if test="name != null and name != ''">
                AND name LIKE '%${name}%'
            </if>
            <if test="address != null and address != ''">
                AND address LIKE '%${address}%'
            </if>
        </where>
        ORDER BY id
    </select>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

查询结果如下图: 
查询结果

  注:使用${…}不能有效防止SQL注入,所以这种方式虽然简单但是不推荐使用!!!

2.把’%#{name}%’改为”%”#{name}”%”

   <select id="searchStudents" resultType="com.example.entity.StudentEntity"
        parameterType="com.example.entity.StudentEntity">
        SELECT * FROM test_student
        <where>
            <if test="age != null and age != '' and compare != null and compare != ''">
                age
                ${compare}
                #{age}
            </if>
            <if test="name != null and name != ''">
                AND name LIKE "%"#{name}"%"
            </if>
            <if test="address != null and address != ''">
                AND address LIKE "%"#{address}"%"
            </if>
        </where>
        ORDER BY id
    </select>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

查询结果: 
查询结果

3.使用sql中的字符串拼接函数

   <select id="searchStudents" resultType="com.example.entity.StudentEntity"
        parameterType="com.example.entity.StudentEntity">
        SELECT * FROM test_student
        <where>
            <if test="age != null and age != '' and compare != null and compare != ''">
                age
                ${compare}
                #{age}
            </if>
            <if test="name != null and name != ''">
                AND name LIKE CONCAT(CONCAT('%',#{name},'%'))
            </if>
            <if test="address != null and address != ''">
                AND address LIKE CONCAT(CONCAT('%',#{address},'%'))
            </if>
        </where>
        ORDER BY id
    </select>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

查询结果: 
查询结果

4.使用标签

   <select id="searchStudents" resultType="com.example.entity.StudentEntity"
        parameterType="com.example.entity.StudentEntity">
        <bind name="pattern1" value="'%' + _parameter.name + '%'" />
        <bind name="pattern2" value="'%' + _parameter.address + '%'" />
        SELECT * FROM test_student
        <where>
            <if test="age != null and age != '' and compare != null and compare != ''">
                age
                ${compare}
                #{age}
            </if>
            <if test="name != null and name != ''">
                AND name LIKE #{pattern1}
            </if>
            <if test="address != null and address != ''">
                AND address LIKE #{pattern2}
            </if>
        </where>
        ORDER BY id
    </select>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

查询结果: 
查询结果

5.在Java代码中拼接字符串 
 

mybatis中使用foreach构造多like查询及批量插入

使用foreach批量查询 SELECT * FROM goods_type WHERE 1>2 OR `NAME` LIKE CONCAT('%',#...
  • u012012240
  • u012012240
  • 2016-04-01 17:26:14
  • 4597

mybatis 动态sql

1 动态sql 什么是动态sql mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。 需求 用户信息综合查询列表和用户信息查询列表总数...
  • HELLO_Amour
  • HELLO_Amour
  • 2018-04-14 23:08:03
  • 2

Mybatis 示例之 foreach (上)

(由于csdn抽风,所以删除两篇重复内容重发) foreach一共有三种类型,分别为List,[](array),Map三种。 foreach的第一篇用来将List和数组(array)。 下面...
  • isea533
  • isea533
  • 2014-03-14 14:54:49
  • 75626

MyBatis的常用标签

1.where标签,重点!这里的if标签用来判断这些条件存不存在,存在就追加进sql语句进行查询,否则不追加 ...
  • jacksonary
  • jacksonary
  • 2017-05-22 13:26:47
  • 397

mybatis 几种实现模糊查询的方法简介

这篇文章主要介绍了mybatis 模糊查询的实现方法的相关资料,希望通过本文能帮助到大家,让大家掌握这部分内容,需要的朋友可以参考下mybatis的模糊查询功能使用的很广泛,以MySQL数据库为例常用...
  • Crystalqy
  • Crystalqy
  • 2018-03-02 09:16:27
  • 54

Mybatis模糊查询的两种实现方式

//模糊查询使用Map集合传参 public List findinfo(Mapmap); select id="findinfo" resultType="Book"> SELECT...
  • qq_36074180
  • qq_36074180
  • 2017-07-10 14:47:28
  • 101

Mybatis 中 模糊查询的几种方式

1.sql中字符串拼接  (本人用的是这种方式,不知为何,第二种方式查询时报参数 个数不匹配错误,没来得及细查)    SELECT *FROM tableName WHERE name LIK...
  • shukebai
  • shukebai
  • 2016-08-23 10:33:10
  • 2286

mybatis一对一的三种实现方式

mybatis一对一的三种实现方式。使用双引号直接设置属性、使用 association 的 resultMap 模式、使用 association 的 select 模式。...
  • wrp920227
  • wrp920227
  • 2017-01-04 12:43:35
  • 5469

Mybatis两种开发方式

MyBatis是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架,具有的特点,避免了JDBC对数据库进行频繁连接开启和关闭造成数据库资源浪费和硬编码现象的出现。 MyBatis开发dao具有...
  • u010927105
  • u010927105
  • 2016-12-31 08:44:07
  • 1117

mybatis学习之路----模糊查询实现

点滴记载,点滴进步,愿自己更上一层楼。
  • xu1916659422
  • xu1916659422
  • 2017-09-09 15:22:15
  • 176
收藏助手
不良信息举报
您举报文章:MyBatis实现模糊查询的几种方式
举报原因:
原因补充:

(最多只允许输入30个字)