Mybatis中动态SQL标签和内置参数介绍

Mybatis中动态SQL标签和内置参数

一、MyBatis动态SQL

1.1、sql标签

sql标签用于抽取公用的SQL代码,定义sql标签的时候需要通过【id】属性设置唯一标识。

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.mybatis.demo.mapper.UserMapper">
    <!-- 动态SQL -->
    <sql id="sqlDemo">
        id,username,password
    </sql>
</mapper>

1.2、include标签

include标签用于引用其他的sql代码块,上面介绍的sql标签是定义公共代码块,而include标签则是在其他地方引用公共代码块。

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.mybatis.demo.mapper.UserMapper">
    <!-- 动态SQL -->
    <sql id="sqlDemo">
        id,username,password
    </sql>
    
    <select id="query" parameterType="cn.js.domain.User" resultType="cn.js.domain.User">
        select
            <include refid="sqlDemo"></include>
        from user 
    </select>
</mapper>

1.3、resultMap标签

resultMap标签用于定义sql表字段和java实体类属性的映射关系,resultMap标签中可以使用如下几个标签。

  • id标签:用于指定主键。
  • result标签:用于指定普通的实体字段属性映射关系。
  • associate标签:一对一的关联查询。
  • collection标签:一对多、多对多的关联查询。

id标签和column标签都有下面这些属性:

  • column属性:用于指定数据库表字段名称。
  • property属性:用于执行java实体类属性名称。
  • jdbcType属性:数据库表字段的类型,可选。
  • javaType属性:java实体类字段的类型,可选。
  • typeHandler属性:定义jdbcType和javaType类型转换的处理器,可选。
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.mybatis.demo.mapper.UserMapper">
    <!-- 动态SQL -->
    <resultMap id="resultMap" type="cn.js.domain.User">
        <!-- id 标签: 用于指定主键 -->
        <id column="id" property="id" jdbcType="INTEGER" javaType="Integer" typeHandler=""/>
        <!-- column 标签: 用于定义数据库和java实体类的名称映射关系 -->
        <result column="username" property="username"/>
        <result column="password" property="password"/>
    </resultMap>
</mapper>

定义resultMap标签之后,可以通过select标签的【resultMap】属性进行引用。

MyBatis中常见的数据类型映射关系如下所示:

jdbcType和javaType类型对应关系:

  • INTEGER===》INTEGER
  • DATE===》DATE
  • BLOB===》BLOB
  • (oracle中是NUMBER)(mysql中是DOUBLE)===》DOUBLE
  • DECIMAL===》DECIMAL
  • VARCHAR===》STRING

1.4、bind标签

bind标签是用于绑定参数的,它可以对输入参数拼接一些其他的内容,然后将拼接好的整体一起拼接到SQL语句上面,例如:模糊查询的时候需要拼接【%】符号,这种情况就可以使用bind标签,并且使用bind标签处理模糊查询可以解决SQL注入问题。

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="cn.js.Mapper.EmployeeMapper">
    <!-- 动态SQL -->
   <!-- 动态SQL -->
    <select id="query" parameterType="cn.js.domain.Employee" resultType="cn.js.domain.Employee">
        <bind name="name" value="'%' + _parameter.getName() + '%'"/>
        select *
        from employee
        where name like #{name}
    </select>
</mapper>

bind标签中有两个属性,分别是:

  • name属性:这个是输出参数的名称。
  • value属性:这个是拼接之后name参数的新值。

上面代码中,假设我们传递的输入参数username值是:【雄霸】,那么经过bind标签参数绑定之后,新的username参数值等于【%雄霸%】,这样就实现了模糊查询的SQL。

测试代码:

java 复制代码
package cn.js.Test;

import cn.js.Mapper.EmployeeMapper;
import cn.js.MybatisApp;
import cn.js.domain.Employee;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;

/**
 * @BelongsProject: MybatisTest
 * @Author: com.js
 * @CreateTime: 2023-09-10  00:01
 * @Version: 1.0
 * @introduce:
 */
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MybatisApp.class)
public class EmployeeTsst {

    @Resource
    private EmployeeMapper employeeMapper;

    @Test
    public void test01(){
        Employee user = new Employee();
        user.setName("雄霸");
        Employee employee = employeeMapper.query(user);
        System.out.println(employee);
    }
}

1.5、_parameter内置参数

【_parameter】是MyBatis框架中提供的一个内置参数对象,这个_parameter对象包含了Mapper接口方法的所有参数,如果Mapper接口方法只有一个输入参数,那么【_parameter】对象就表示这个输入参数;

如果Mapper接口方法有多个输入参数,那么MyBatis框架会将所有的参数封装为一个Map对象,我们可以直接通过【_parameter.XXX】的方式获取具体的输入参数。

sql 复制代码
    <select id="query7" parameterType="cn.js.domain.User" resultType="cn.js.domain.User">
        select * from user
        <where>
            <if test="_parameter.username != null">
                and username = #{username}
            </if>
        </where>
    </select>

1.6、_databaseId内置参数

【_databaseId】内置参数,可以获取到当前项目中使用的数据库类型,例如:是MySQL数据库,还是Oracle数据库。要使用【_databaseId】内置参数,必须在Mybatis的配置文件里面添加【databaseIdProvider】标签。

(1)添加databaseIdProvider

在mybatis的配置文件里面,添加如下配置:

sql 复制代码
    <databaseIdProvider type="DB_VENDOR">
        <!-- 定义参数 -->
        <property name="MySQL" value="mysql"/>
    </databaseIdProvider>

(2)使用_databaseId参数

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.mybatis.demo.mapper.UserMapper">
    <select id="query6" parameterType="cn.js.domain.User" resultType="cn.js.domain.User">
        <if test="_databaseId == 'mysql'">
            select * from user limit 5,5
        </if>
        <if test="_databaseId == 'oracle'">
            select * from user where rownum <![CDATA[ <= ]]> 5
        </if>
    </select>
</mapper>
相关推荐
沐雪架构师3 分钟前
mybatis连接PGSQL中对于json和jsonb的处理
json·mybatis
Dxy12393102168 分钟前
python下载pdf
数据库·python·pdf
桀桀桀桀桀桀1 小时前
数据库中的用户管理和权限管理
数据库·mysql
鹿屿二向箔1 小时前
基于SSM(Spring + Spring MVC + MyBatis)框架的咖啡馆管理系统
spring·mvc·mybatis
lzhlizihang2 小时前
【Hive sql 面试题】求出各类型专利top 10申请人,以及对应的专利申请数(难)
大数据·hive·sql·面试题
superman超哥2 小时前
04 深入 Oracle 并发世界:MVCC、锁、闩锁、事务隔离与并发性能优化的探索
数据库·oracle·性能优化·dba
用户8007165452002 小时前
HTAP数据库国产化改造技术可行性方案分析
数据库
engchina3 小时前
Neo4j 和 Python 初学者指南:如何使用可选关系匹配优化 Cypher 查询
数据库·python·neo4j
engchina3 小时前
使用 Cypher 查询语言在 Neo4j 中查找最短路径
数据库·neo4j
尘浮生3 小时前
Java项目实战II基于Spring Boot的光影视频平台(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·后端·maven·intellij-idea