动态SQL :元素
在MyBatis中,<if>
元素是常用的判断语句,主要用于实现某些简单的条件选择。在实际应用中,我们可能会通过多个条件来精确地查询某个数据。
【示例8-1】下面通过一个具体的案例来演示元素的使用。
(1)创建一个名为chapter08的Web项目。
(2)将之前chapter06项目中的JAR包和src目录下的文件复制到chapter08中。
(3)将配置文件中的数据库信息修改为外部引用的形式,即在项目的src目录下创建一个名称为db.properties的配置文件,编辑代码,如下所示。
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db_mybatis
jdbc.username=root
jdbc.password=root
然后在MyBatis配置文件mybatis-config.xml中配置<properties/>
属性,并修改配置文件中数据库连接的信息,修改完成后mybatis-config.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 1.配置环境,默认的环境 id 为 mysql--><environments default="mysql">
<!-- 1.2 配置id为mysql 的数据库环境--><environment id="mysql">
<!-- 使用JDBC的事务管理--><transactionManager type="JDBC" />
<!-- 数据库连接池--><dataSource type="POOLED">
<!-- 数据库驱动--><property name="driver" value="com.mysql.jdbc.Driver" />
<!-- 连接数据库的url--><property name="url" value="jdbc:mysql://localhost:3306/db_mybatis" />
<!-- 连接数据库的用户名--><property name="username" value="root" />
<!-- 连接数据库的用户名--><property name="password" value="root" /></dataSource></environment></environments>
<!--2.配置 Mapper的位置--><mappers><mapper resource="UserMapper.xml" /></mappers>
</configuration>
(4)创建一个com.ssm.util包,在该包下创建工具类MybatisUtil,在其中定义获取SqlSession的方法getSession(),如下所示。
package com.ssm.util;import java.io.IOException;
import java.io.Reader;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;/*** 功能描述** @author: 衍生星球* @date: 2023年05月29日 15:32*/public class MybatisUtil {private static SqlSessionFactory sqlSessionFactory=null;static {try {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {e.printStackTrace();}}// 获取SqlSession的方法public static SqlSession getSession() {return sqlSessionFactory.openSession();}
}
(5)修改映射文件UserMapper.xml,在映射文件中使用<if>
元素编写根据用户姓名(username)和职业(jobs)组合条件查询用户信息列表的动态SQL,如下所示。
<?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.ssm.mapper.UserMapper">
<!--<if>元素使用--><select id="findUserByNameAndJobs" parameterType="com.ssm.po.User" resultType="com.ssm.po.User">select * from t_user where 1=1<if test="username !=null and username !=''">and username like concat('%', #{username},'%')</if><if test="jobs !=null and jobs !=''">and jobs = #{jobs}</if></select>
</mapper>
使用<if>
元素的test属性分别对username和jobs进行了非空判断(test属性多用于条件判断语句中,用于判断真假,大部分的场景中都是进行非空判断的,有时也需要判断字符串、数字和枚举等),如果传入的查询条件非空,就进行动态SQL组装。
(6)在测试类MybatisTest中,编写测试方法findUserByNameAndJobsTest(),如下所示。
public class MybatisTest {/**根据用户姓名和职业组合条件查询用户信息列表*/@Testpublic void findUserByNameAndJobsTest() throws Exception {//通过工具类生成SqlSession对象SqlSession sqlSession = MybatisUtil.getSession();//创建User对象,封装需要组合查询的条件User user = new User();user.setUsername("zhangsan");user.setJobs("teacher");//执行SqlSession的查询办法,返回结果集List<User> users =sqlSession.selectList("com.ssm.mapper.UserMapper.findUserByNameAndJobsTest",user);//输出查询结果for (User u :users) {System.out.println((u.toString()));}sqlSession.close();}}
findUserByNameAndJobsTest()方法中,首先通过MybatisUtils工具类获取了SqlSession对象,然后使用User对象封装了用户名为zhangsan且职业为teacher的查询条件,并通过SqlSession对象的selectList()方法执行多条件组合的查询操作。最后,程序执行完毕时关闭了SqlSession对象。执行findUserByNameAndJobsTest()方法后,控制台的输出结果如图所示。
将封装到User对象中的zhangsan和teacher两行代码注释掉,然后再次执行findUserByNameAndJobsTest()
方法,控制台的输出结果如图所示。
当未传递任何参数时,会将数据表中的所有数据查出来。这就是<if>
元素的使用。