软件编程
位置:首页>> 软件编程>> java编程>> MyBatis实现模糊查询的几种方式

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

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

标签:MyBatis,模糊,查询

在学习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

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com