我本人正在学习MyBatis框架,在原先了解并且懵懵懂懂使用的基础上,开始系统正式的学习。阐述了MVC架构模式和三层架构,明晰了在Web项目中的普遍编码层次,回顾了JDBC连接数据库,建立了使用MyBatis和MySQL的Maven项目,解释了STDOUT_LOGGING日志和手动提交事务,记录了MyBatis中#占位符的使用方法,回顾了MyBatis执行SQL语句的过程和使用到的一些重要类和接口,记录了将固定化的代码整合到一个工具类MyBatisUtil中,以减少代码量。记录了dao层接口的实现以及为什么要实现它。记录了MyBatis动态代理和使用动态代理的要求以及使用了动态代理生成的实现类。记录了MyBatis框架下传参的五种方法,占位符#和$,如何自定义别名,resultType属性的使用方法,如何处理数据库中列名和JAVA对象属性名不一致的情况。本篇博客记录在MyBatis中如何组装传递模糊查询的条件(一共有两种方式)。
我上一篇博文记录的是使用resultMap属性和标签或者给列名起别名的方式处理数据库中列名和JAVA对象属性名不一致的情况。感兴趣的读者可以移步查阅,链接如下所示:
这种方式需要使用到 #{ } 占位符,本来#{ } 占位符会默认加上双引号,也是非常好的。推荐使用这种方式。
接下来举一个示例:要查询全部学生姓名中,带有某一个字的学生信息。
其实这样只需要一个很简单的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
selectPart(@Param(value = "condition") String condition); - }
(其实上面方法中的@Param注解可以不要,不过使用了更加规范,就当做是练手了)
mapper.xml文件代码,如下所示:
- "1.0" encoding="UTF-8" ?>
- 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="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
studentList = studentDao.selectPart(condition);//传参 - System.out.println(studentList);
- }
- }
运行结果如下图所示:
在控制台输入 马 ,可以顺利得到名字中含有 马 的学生信息。
第二种方式其实就是第一种方式的一种特殊形式,利用的还是SQL语句的语法,就比如下面这条SQL语句也能查询出 name字段中包含 马 的学生信息:
SELECT * FROM student WHERE NAME LIKE "%" "马" "%";
注意:"%" 和 "马" 之间有一个空格。
只需要将 马 这个参数通过#{ }占位符传进来就可以了。也就是说,真正在mapper.xml文件中的SQL语句应该是下面的样子的:
SELECT * FROM student WHERE NAME LIKE "%" #{} "%"
这种方式不是很推荐,如果我们要查询 姓马的同学的信息,那么还需要修改mapper.xml文件中的代码,这样是很麻烦的。
推荐使用第一种方法。
这种方法这里我就不粘贴示例代码了,跟上面示例代码的代码差不多,只有SQL语句的编写不一样和传递的参数不一样而已。
感兴趣的读者,下面仓库地址中含有本篇博客使用的简单的代码,包含SQL脚本:
MyBatis20220828: 20220828介绍两种组装Like模糊查询条件的方法https://gitee.com/MissShe/MyBatis20220828.git