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

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

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

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

解决方法

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

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

查询结果如下图:

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

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

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

查询结果:

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

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

查询结果:

4.使用标签

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

查询结果:

5.在Java代码中拼接字符串
  这个方法没试过,就不贴代码和结果了。

————2017.07.03

MyBatis实现模糊查询的几种方式的更多相关文章

  1. Mybatis的select查询的三种方式

    1.首先建立一个测试的dao public interface IStudentDao { // 根据姓名查询 List<Student> selectStudentsByName(Str ...

  2. 五 Mybatis一对一关联查询的两种方式(基于resultType&基于resultMap)

    关联查询: 一个用户对应多个订单,一个订单只有一个用户 订单关联用户:两种方式 一:基于resultTYpe,一个与表关系一样的pojo实现 主表订单,从表用户 首先要有一个与关联查询表关系一样的po ...

  3. 【mysql模糊查询的几种方式】

    select * from activyty_code where acname like '%yj%' 1:%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分 ...

  4. JDBC模糊查询的4种方式

    1:%放在占位符中              parameters.add("%"+familyMemberQueryBean.getFullName()+"%" ...

  5. java之mybatis之模糊查询

    1.在 mybatis 中,模糊查询可以有以下方式 (1).第一种,直接将封装好的条件传给 sql 语句 <select id="findByName" parameterT ...

  6. MyBatis开发Dao层的两种方式(原始Dao层开发)

    本文将介绍使用框架mybatis开发原始Dao层来对一个对数据库进行增删改查的案例. Mapper动态代理开发Dao层请阅读我的下一篇博客:MyBatis开发Dao层的两种方式(Mapper动态代理方 ...

  7. MyBatis开发Dao层的两种方式(Mapper动态代理方式)

    MyBatis开发原始Dao层请阅读我的上一篇博客:MyBatis开发Dao层的两种方式(原始Dao层开发) 接上一篇博客继续介绍MyBatis开发Dao层的第二种方式:Mapper动态代理方式 Ma ...

  8. MyBatis中模糊查询

    接口 // 模糊查询 List<User> getUserLike(String value); Mapper.xml文件 <!-- 模糊查询 --> <select i ...

  9. mybatis中批量插入的两种方式(高效插入)

    MyBatis简介 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用 ...

随机推荐

  1. golang map输出排序

    由于GoLang Map 内部存储是无序的,当需要按顺序获得map存储的key -value值时,应该对遍历出来的结果进行重新排序: 在go 1.8版本后,提供的slice sort 功能使排序更简单 ...

  2. JAVA 面试知识点

    参考:https://www.cnblogs.com/java1024/p/8594784.html 反射: JAVA反射机制是在运行状态中, 对于任意一个类,都能够知道这个类的所有属性和方法: 对于 ...

  3. Java基础之基本数据类型

    前言:Java内功心法之基本数据类型,看完这篇你向Java大神的路上又迈出了一步(有什么问题或者需要资料可以联系我的扣扣:734999078) 变量就是申请内存来存储值.也就是说,当创建变量的时候,需 ...

  4. ECMAScript typeof用法

    typeof 返回变量的类型字符串值 .其中包括 “object”.“number”.“string”.“undefined”.“boolean”. 1.在变量只声明.却不初始化值   Or 在变量没 ...

  5. cocoapods使用-库托管到svn或者github

    下拉svn库(自定义库或者第三方库)到工程中:   1. 若未安装,请安装cocoapods:    http://www.cnblogs.com/sunjianfei/p/6089231.html ...

  6. API网关【gateway 】- 3

    最近在公司进行API网关重写,公司内采用serverMesh进行服务注册,调用,这里结合之前学习对API网关服务进行简单的总结与分析. 由于采用了大量的nginx相关的东西,所以在此记录一下: 在ng ...

  7. blfs(systemv版本)学习笔记-为桌面环境构建xorg服务

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! lfs准备使用桌面环境,首先需要构建xorg服务 xorg服务项目地址:http://www.linuxfromscratch. ...

  8. unity相机跟随Player常用方式

    固定跟随,无效果(意义不大) public class FollowPlayer : MonoBehaviour { public Transform Player; private Vector3 ...

  9. Fit项目图片上传和云存储的调通

    项目中关于动作的说明需要相应的配图,这样可以更直观的说明动作要点.本篇主要为项目中动作的新增和编辑做准备,确定适合场景的上传操作逻辑以及图片的存储和加载的方法. 一 上传方案 a) 本来所用的模板中是 ...

  10. Button's four click events

    第一种:内部类的方式 1 package com.example.phonedialer; 2 3 import com.example.click2.R; 4 5 import android.ne ...