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

作者:行癫 时间:2023-06-03 17:31:43 

在学习MyBatis过程中想实现模糊查询,可惜失败了。后来上百度上查了一下,算是解决了。记录一下MyBatis实现模糊查询的几种方式。

数据库表名为test_student,初始化了几条记录,如图:

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

起初我在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>

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

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

经百度得知,这么写经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>

查询结果如下图:

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

注:使用${…}不能有效防止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>

查询结果:

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

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>

查询结果:

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

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>

查询结果:

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

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


public static void main(String[] args) {
 try {
  int count = 500;

long begin = System.currentTimeMillis();
  testString(count);
  long end = System.currentTimeMillis();
  long time = end - begin;
  System.out.println("String 方法拼接"+count+"次消耗时间:" + time + "毫秒");

begin = System.currentTimeMillis();
  testStringBuilder(count);
  end = System.currentTimeMillis();
  time = end - begin;
  System.out.println("StringBuilder 方法拼接"+count+"次消耗时间:" + time + "毫秒");

} catch (Exception e) {
  e.printStackTrace();
 }

}

private static String testString(int count) {
 String result = "";

for (int i = 0; i < count; i++) {
  result += "hello ";
 }

return result;
}

private static String testStringBuilder(int count) {
 StringBuilder sb = new StringBuilder();

for (int i = 0; i < count; i++) {
  sb.append("hello");
 }

return sb.toString();
}

来源:https://blog.csdn.net/lonely_dog/article/details/74171314

标签:MyBatis,模糊,查询
0
投稿

猜你喜欢

  • Java 对HashMap进行排序的三种常见方法

    2022-11-04 19:02:10
  • C++形参与实参的区别实例解析

    2023-11-02 23:39:05
  • 浅谈Java三目运算

    2023-11-29 07:27:59
  • flutter实现底部不规则导航栏

    2023-03-03 04:33:08
  • Android入门之TabHost与TabWidget实例解析

    2022-12-07 23:03:42
  • Spring Boot 项目创建的详细步骤(图文)

    2023-03-23 20:11:55
  • Struts2 Result 参数详解

    2022-04-28 07:54:35
  • C#控制台输出进度和百分比的实例代码

    2021-10-01 23:49:43
  • C#几种截取字符串的方法小结

    2023-07-16 09:55:10
  • apache ant进行zip解压缩操作示例分享

    2021-11-08 09:16:03
  • 详细解读java同步之synchronized解析

    2022-08-01 15:27:05
  • Android WebView基础应用详解

    2023-09-30 07:36:46
  • 修改Android签名证书keystore的密码、别名alias以及别名密码

    2022-03-07 04:22:42
  • Android实例HandlerThread源码分析

    2022-03-05 13:35:33
  • Android毕业设计备忘录APP

    2023-12-25 02:28:17
  • SpringBoot集成easy-rules规则引擎流程详解

    2022-04-20 11:39:35
  • android开发环境遇到adt无法启动的问题分析及解决方法

    2023-12-11 13:13:23
  • Java实现的求解经典罗马数字和阿拉伯数字相互转换问题示例

    2023-10-15 23:17:36
  • elasticsearch集群发现zendiscovery的Ping机制分析

    2021-05-25 05:40:55
  • Java 程序员掌握 Spring Boot非常有必要

    2021-06-27 19:06:52
  • asp之家 软件编程 m.aspxhome.com