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>
相关推荐
morris13144 分钟前
【redis】事务
数据库·redis·缓存·pipeline·lua·事务
Z_zz_Z___1 小时前
MySQL创建数据库和表,插入四大名著中的人物
数据库·mysql
PONY LEE2 小时前
基于Flink SQL的实时指标多维分析模型
sql·flink
月落星还在4 小时前
Redis 的过期策略与键的过期时间设置
数据库·redis·bootstrap
酒酿祺子7 小时前
蓝队第三次
sql
cg50177 小时前
MySQL数据库复杂的增删改查操作
数据库·mysql
虾球xz8 小时前
游戏引擎学习第147天
数据库·学习·游戏引擎
向上的车轮9 小时前
什么是时序数据库?有哪些时序数据库?常见的运用场景有哪些?
数据库·时序数据库
就叫飞六吧9 小时前
WangEditor快速实现版
node.js·mybatis
岱宗夫up10 小时前
【Python】Django 中的算法应用与实现
数据库·python·opencv·django·sqlite