【Spring】— 动态SQL :<if>元素

动态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>元素的使用。

猜你喜欢

转载自blog.csdn.net/weixin_45627039/article/details/130928746