当前位置: 首页 > news >正文

【MyBatis笔记10】Mybatis中几个动态SQL标签和内置参数

这篇文章,主要介绍MyBatis中几个动态SQL标签和内置参数。

目录

一、MyBatis动态SQL

1.1、sql标签

1.2、include标签

1.3、resultMap标签

1.4、bind标签

1.5、_parameter内置参数

1.6、_databaseId内置参数

(1)添加databaseIdProvider

(2)使用_databaseId参数


一、MyBatis动态SQL

1.1、sql标签

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

<?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标签则是在其他地方引用公共代码块。

<?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="com.mybatis.demo.domain.User" resultType="com.mybatis.demo.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类型转换的处理器,可选。
<?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="com.mybatis.demo.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注入问题。

<?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 -->
    <select id="query" parameterType="com.mybatis.demo.domain.User" resultType="com.mybatis.demo.domain.User">
        <bind name="username" value="'%' + _parameter.getUsername() + '%'"/>
        select *
        from user
        where username like #{username}
    </select>
</mapper>

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

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

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

测试代码:

package com.mybatis.demo;

import com.mybatis.demo.domain.User;
import com.mybatis.demo.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * @author ZhuYouBin
 * @version 1.0.0
 * @Date: 2022/9/1 16:23
 * @Description
 */
public class DemoTest {
    public static void main(String[] args) throws IOException {
        // 1、加载配置文件
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        // 2、创建 SqlSessionFactoryBuilder 对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        // 3、创建 SqlSessionFactory 对象
        SqlSessionFactory sqlSessionFactory = builder.build(is);
        // 4、创建 SqlSession 对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 5、获取 UserMapper
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        // 执行操作
        User user = new User();
        user.setUsername("2022");
        List<User> query = userMapper.query(user);
        for (User user1 : query) {
            System.out.println(user1);
        }
        // 提交事务: mybatis 默认是不会自动提交事务的
        sqlSession.commit();
        // 关闭流
        sqlSession.close();
        is.close();
    }
}

1.5、_parameter内置参数

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

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

    <select id="query7" parameterType="com.mybatis.demo.domain.User" resultType="com.mybatis.demo.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的配置文件里面,添加如下配置:

    <databaseIdProvider type="DB_VENDOR">
        <!-- 定义参数 -->
        <property name="MySQL" value="mysql"/>
    </databaseIdProvider>

(2)使用_databaseId参数

<?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="com.mybatis.demo.domain.User" resultType="com.mybatis.demo.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>

以上,就是MyBatis动态SQL的标签以及内置参数。

综上,这篇文章结束了,主要介绍MyBatis中几个动态SQL标签和内置参数。

相关文章:

  • 7.Nodejs新特性async和await的使用
  • 怎么安装一个简单的vue3.0框架。整个流程.::
  • 【延展Extension Objective-C语言】
  • IDA* AcWing 181. 回转游戏
  • Web3小知识集锦
  • tensorflow基础
  • android自定义Apk名称和指定生成的路径
  • java框架----SSM快速整合教程
  • mongodb基本操作及使用
  • jQuery中的函数
  • leetcode:188. 买卖股票的最佳时机IV
  • 电脑技巧:Win7、Win10、Win11如何选择,看完你就懂了
  • 【初阶数据结构】堆排序和TopK问题
  • 筑梦远航 势不可挡|和数研究院四周岁啦
  • 广东2022年上半年系统集成项目管理工程师下午真题及答案解析
  • 分享一款快速APP功能测试工具
  • JAVA并发编程--1.基础概念
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 警报:线上事故之CountDownLatch的威力
  • 手机端车牌号码键盘的vue组件
  • 我建了一个叫Hello World的项目
  • 新手搭建网站的主要流程
  • 7行Python代码的人脸识别
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​520就是要宠粉,你的心头书我买单
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • # 数据结构
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)为C# Windows服务添加安装程序
  • (转载)Linux网络编程入门
  • .net 4.0发布后不能正常显示图片问题
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET Core引入性能分析引导优化
  • .Net Core与存储过程(一)
  • .NET Reactor简单使用教程
  • .NET/C# 使用反射注册事件
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • @font-face 用字体画图标
  • @synthesize和@dynamic分别有什么作用?
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [ANT] 项目中应用ANT
  • [bzoj1901]: Zju2112 Dynamic Rankings
  • [cb]UIGrid+UIStretch的自适应
  • [CERC2017]Cumulative Code