MyBatis学习:使用Like进行模糊查询,MyBatis怎么传参或者组装模糊条件

1、本篇博客的背景和目的

我本人正在学习MyBatis框架,在原先了解并且懵懵懂懂使用的基础上,开始系统正式的学习。阐述了MVC架构模式和三层架构,明晰了在Web项目中的普遍编码层次,回顾了JDBC连接数据库,建立了使用MyBatis和MySQL的Maven项目,解释了STDOUT_LOGGING日志和手动提交事务,记录了MyBatis中#占位符的使用方法,回顾了MyBatis执行SQL语句的过程和使用到的一些重要类和接口,记录了将固定化的代码整合到一个工具类MyBatisUtil中,以减少代码量。记录了dao层接口的实现以及为什么要实现它。记录了MyBatis动态代理和使用动态代理的要求以及使用了动态代理生成的实现类。记录了MyBatis框架下传参的五种方法,占位符#和$,如何自定义别名,resultType属性的使用方法,如何处理数据库中列名和JAVA对象属性名不一致的情况。本篇博客记录在MyBatis中如何组装传递模糊查询的条件(一共有两种方式)。

2、我的上一篇博文

我上一篇博文记录的是使用resultMap属性和标签或者给列名起别名的方式处理数据库中列名和JAVA对象属性名不一致的情况。感兴趣的读者可以移步查阅,链接如下所示:

MyBatis学习:使用resultMap或在SQL语句中给列起别名处理查询结果中列名和JAVA对象属性名不一致的问题_你是我的日月星河的博客-CSDN博客目前我本人正在学习MyBatis框架,在原先了解并且懵懵懂懂使用的基础上,开始系统正式的学习。阐述了MVC架构模式和三层架构,明晰了在Web项目中的普遍编码层次,回顾了JDBC连接数据库,建立了使用MyBatis和MySQL的Maven项目,解释了STDOUT_LOGGING日志和手动提交事务,记录了MyBatis中#占位符的使用方法,回顾了MyBatis执行SQL语句的过程和使用到的一些重要类和接口,记录了将固定化的代码整合到一个工具类MyBatisUtil中,以减少代码量。...https://blog.csdn.net/weixin_46281472/article/details/126550113

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

6、我的下一篇博文


版权声明:本文为weixin_46281472原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。