1、本篇博客的背景和目的
我本人正在学习MyBatis框架,在原先了解并且懵懵懂懂使用的基础上,开始系统正式的学习。阐述了MVC架构模式和三层架构,明晰了在Web项目中的普遍编码层次,回顾了JDBC连接数据库,建立了使用MyBatis和MySQL的Maven项目,解释了STDOUT_LOGGING日志和手动提交事务,记录了MyBatis中#占位符的使用方法,回顾了MyBatis执行SQL语句的过程和使用到的一些重要类和接口,记录了将固定化的代码整合到一个工具类MyBatisUtil中,以减少代码量。记录了dao层接口的实现以及为什么要实现它。记录了MyBatis动态代理和使用动态代理的要求以及使用了动态代理生成的实现类。记录了MyBatis框架下传参的五种方法,占位符#和$,如何自定义别名,resultType属性的使用方法,如何处理数据库中列名和JAVA对象属性名不一致的情况。本篇博客记录在MyBatis中如何组装传递模糊查询的条件(一共有两种方式)。
2、我的上一篇博文
我上一篇博文记录的是使用resultMap属性和标签或者给列名起别名的方式处理数据库中列名和JAVA对象属性名不一致的情况。感兴趣的读者可以移步查阅,链接如下所示:
3、第一种方式:直接组装模糊查询条件,然后作为一个字符串参数传递进SQL语句
这种方式需要使用到 #{ } 占位符,本来#{ } 占位符会默认加上双引号,也是非常好的。推荐使用这种方式。
接下来举一个示例:要查询全部学生姓名中,带有某一个字的学生信息。
其实这样只需要一个很简单的SQL语句就可以了:select * from student where name like "%某一个字%";
但问题就是:某一个字,我们怎么传进SQL语句呢?其实可以将 %某一个字% 整体作为字符串参数,然后通过 #{ }占位符传递进去,#{ }占位符本来就会自动加上双引号。
下面我粘贴一下代码,某一个字 我通过控制台输入:
dao层接口方法代码,如下所示:
package com.dcy.dao;
import com.dcy.domain.Student;
import com.dcy.domain.Student2;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
public interface StudentDao {
List<Student> selectPart(@Param(value = "condition") String condition);
}
(其实上面方法中的@Param注解可以不要,不过使用了更加规范,就当做是练手了)
mapper.xml文件代码,如下所示:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dcy.dao.StudentDao">
<!--
select标签表示的是查询操作,里面是查询语句。
id属性的值是SQL语句的唯一标识,是一个自定义的字符串。
按照编码规范,这里统一推荐使用dao接口中对应的方法名称。
resultType属性是表示执行SQL语句后,结果对应那个类型的JAVA对象。resultType的值是某个实体类的全限定名称。
比如:com.dcy.domain.Student
-->
<!-- 详细介绍一下resultType:
1、属性值是 数据类型的全限定路径名称或者是 别名
表示MyBatis执行SQL语句后,得到的JAVA对象类型
规则:同名列 赋值给 同名属性,如果属性没有对应同名的列,那么这个属性就会是null,即使查出来的有结果。
-->
<select id="selectPart" resultType="com.dcy.domain.Student">
select * from student where name like #{condition}
</select>
</mapper>
在Main方法中进行必要的测试,代码如下所示:
package com.dcy;
import com.dcy.dao.StudentDao;
import com.dcy.domain.Student;
import com.dcy.domain.Student2;
import com.dcy.utils.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import java.util.List;
import java.util.Scanner;
public class Starter {
public static void main(String[] args) {
SqlSession sqlSession = MyBatisUtil.getSqlSession();
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
System.out.println("输入你要查询名字中包含的字:");
Scanner sc=new Scanner(System.in);
String s=sc.next();
String condition="%"+s+"%";//组装条件
List<Student> studentList = studentDao.selectPart(condition);//传参
System.out.println(studentList);
}
}
运行结果如下图所示:

在控制台输入 马 ,可以顺利得到名字中含有 马 的学生信息。
4、第二种方式: 在SQL语句中组装一部分模糊查询的条件语句,将最关键的所需要含有的字符通过#{ }占位符传递进来。
第二种方式其实就是第一种方式的一种特殊形式,利用的还是SQL语句的语法,就比如下面这条SQL语句也能查询出 name字段中包含 马 的学生信息:
SELECT * FROM student WHERE NAME LIKE "%" "马" "%";
注意:"%" 和 "马" 之间有一个空格。
只需要将 马 这个参数通过#{ }占位符传进来就可以了。也就是说,真正在mapper.xml文件中的SQL语句应该是下面的样子的:
SELECT * FROM student WHERE NAME LIKE "%" #{} "%"
这种方式不是很推荐,如果我们要查询 姓马的同学的信息,那么还需要修改mapper.xml文件中的代码,这样是很麻烦的。
推荐使用第一种方法。
这种方法这里我就不粘贴示例代码了,跟上面示例代码的代码差不多,只有SQL语句的编写不一样和传递的参数不一样而已。
5、本篇博客所使用的代码所在gitee仓库地址
感兴趣的读者,下面仓库地址中含有本篇博客使用的简单的代码,包含SQL脚本:
MyBatis20220828: 20220828介绍两种组装Like模糊查询条件的方法https://gitee.com/MissShe/MyBatis20220828.git