动态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 {
/*
*根据用户姓名和职业组合条件查询用户信息列表
*/
@Test
public 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>
元素的使用。