Mybatis-内置参数

一、_parameter

  • 参数列表只有一个参数时,_parameter为该参数。(可以用于判断传进来的对象是否为空)
  • 参数列表有多个参数时,_parameter为参数列表对应的map,以参数名为键参数值为值。

(1)Mapper文件

<?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.wsh.mapper.UserMapper">
    <resultMap id="EmployeeResult" type="Employee">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="deptId" column="dept_id"/>
    </resultMap>
    
    <select id="selectEmployeeList" resultMap="EmployeeResult">
        select
            *
        from
            employee
        where
            <if test="_parameter.get('arg0') == null">id = 1</if>
            <if test="_parameter.get('arg1') != null">or id = 2</if>
    </select>

</mapper>

(2)接口文件

public interface UserMapper {
    public List<Employee> selectEmployeeList(Employee employee1, Employee employee2);
}

(3)JAVA程序

    public void test() throws IOException {
        //读取配置文件创建SqlSession工厂
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //利用SqlSession工厂创建SqlSession实例
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            //利用SqlSession创建代理对象
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            List<Employee> list = mapper.selectEmployeeList(null, new Employee());
            for (Employee employee : list) {
                System.out.println(employee.toString());
            }
        }finally {
            sqlSession.close();
        }
    }

输出

2022-04-05 16:06:03,332 [main] DEBUG [com.wsh.mapper.UserMapper.selectEmployeeList] - ==>  Preparing: select * from employee where id = 1 or id = 2
2022-04-05 16:06:03,358 [main] DEBUG [com.wsh.mapper.UserMapper.selectEmployeeList] - ==> Parameters: 
2022-04-05 16:06:03,377 [main] DEBUG [com.wsh.mapper.UserMapper.selectEmployeeList] - <==      Total: 2
Employee(id=1, name=张三, deptId=1, department=null)
Employee(id=2, name=李四, deptId=1, department=null)

二、_databaseId

  • 当配置文件中开启了获取数据库厂商标识后,可以利用该参数获取出标识。

(1)Mybatis配置文件

    <databaseIdProvider type="DB_VENDOR">
        <property name="MySQL" value="mysql"/>
    </databaseIdProvider>

(2)Mapper文件

<?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.wsh.mapper.UserMapper">
    <resultMap id="EmployeeResult" type="Employee">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="deptId" column="dept_id"/>
    </resultMap>
    
    <select id="selectEmployeeList" resultMap="EmployeeResult">
        select
            *
        from
            employee
        where
            <if test="_databaseId == 'mysql'">id = 1</if>
            <if test="_databaseId != 'mysql'">id = 2</if>
    </select>

</mapper>

(3)接口文件

public interface UserMapper {
    public List<Employee> selectEmployeeList();
}

(4)JAVA程序

    public void test() throws IOException {
        //读取配置文件创建SqlSession工厂
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //利用SqlSession工厂创建SqlSession实例
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            //利用SqlSession创建代理对象
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            List<Employee> list = mapper.selectEmployeeList();
            for (Employee employee : list) {
                System.out.println(employee.toString());
            }
        }finally {
            sqlSession.close();
        }
    }

输出

2022-04-05 16:15:58,909 [main] DEBUG [com.wsh.mapper.UserMapper.selectEmployeeList] - ==>  Preparing: select * from employee where id = 1
2022-04-05 16:15:58,935 [main] DEBUG [com.wsh.mapper.UserMapper.selectEmployeeList] - ==> Parameters: 
2022-04-05 16:15:58,955 [main] DEBUG [com.wsh.mapper.UserMapper.selectEmployeeList] - <==      Total: 1
Employee(id=1, name=张三, deptId=1, department=null)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mybatis-Plus 中,SQL 的解析是通过内置的 SQL 解析器来实现的。Mybatis-Plus 使用了 Mybatis 的核心组件和功能,包括 SQL 解析、参数处理、SQL 执行等。 具体的 SQL 解析流程如下: 1. Mybatis-Plus 会通过 `SqlParserUtils` 工具类创建一个 SQL 解析器对象 `SqlParser`。 2. 在执行 SQL 之前,Mybatis-Plus 会调用 `SqlParser` 的 `processSelect` 方法进行解析。该方法会解析 SQL 中的查询字段、表名、条件等信息,并返回一个 `SqlInfo` 对象。 3. `SqlInfo` 对象中包含了解析后的 SQL 语句、参数映射等信息,可以通过该对象获取解析后的 SQL 语句和参数。 4. Mybatis-Plus 将解析后的 SQL 语句和参数传递给 Mybatis 的执行引擎,通过 `SqlSession` 执行 SQL。 需要注意的是,Mybatis-Plus 的 SQL 解析器仅对内置的基本查询方法进行解析,如 `selectById`、`selectList`、`selectPage` 等。对于自定义的 SQL 语句或使用 Mybatis 的 XML 映射文件,则需要手动编写和解析 SQL。 此外,Mybatis-Plus 还提供了一些钩子函数和扩展点,可以自定义 SQL 解析和处理的逻辑。例如,可以实现 `ISqlParser` 接口来自定义 SQL 解析器,实现 `ISqlInjector` 接口来自定义 SQL 注入器等。 总结起来,Mybatis-Plus 是通过内置的 SQL 解析器来解析 SQL,然后将解析后的 SQL 语句和参数传递给 Mybatis 的执行引擎。希望能够解答你的问题!如果还有其他疑问,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值