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

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

一、MyBatis动态SQL

1.1、sql标签

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

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//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 mapperPUBLIC "-//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类型转换的处理器,可选。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//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注入问题。

<?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 employeewhere name like #{name}</select>
</mapper>

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

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

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

在这里插入图片描述

测试代码:

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 {@Resourceprivate EmployeeMapper employeeMapper;@Testpublic 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】的方式获取具体的输入参数。

    <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的配置文件里面,添加如下配置:

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

(2)使用_databaseId参数

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/131997.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【FAQ】视频监控管理平台/视频汇聚平台EasyCVR安全检查相关问题及解决方法3.0

智能视频监控系统/视频云存储/集中存储/视频汇聚平台EasyCVR具备视频融合汇聚能力&#xff0c;作为安防视频监控综合管理平台&#xff0c;它支持多协议接入、多格式视频流分发&#xff0c;视频监控综合管理平台EasyCVR支持海量视频汇聚管理&#xff0c;可应用在多样化的场景上&…

DHT11 温湿度传感器

目录 1.DHT11 温湿度传感器概述 2.检测DHT11温湿度传感器模块是否存在 3.通过编写代码读取温湿度数据​编辑 4.将读取到的温湿度数据通过串口上传 1.DHT11 温湿度传感器概述 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器&#xff0c;应用领域&am…

【资源推荐】一站式机器学习学习资料

我之前向大家推荐了许多关于人工智能数学原理与应用的资料&#xff0c;其中包括线性代数、机器学习和深度学习等方面的内容。 交互式线性代数学习网站 沉浸式线性代数学习网站 Kaggle大神教你机器学习 今天我将继续向大家推荐一个一站式学习机器学习的绝佳资源&#xff1a;《…

《TCP/IP网络编程》阅读笔记--多线程服务器端的实现

1--多线程的优点 多进程服务器的缺点&#xff1a; ① 创建进程的过程会带来一定的开销&#xff1b; ② 为了完成进程间的数据交换&#xff0c;需要特殊的 IPC 技术&#xff1b; ③ 进程间的上下文切换是创建进程时的最大开销&#xff1b; 多线程的优点&#xff1a; ① 线程的创…

C#类与类库调用注意事项

类 创建一个类文件&#xff0c;myfunction.cs //静态类&#xff1a;直接引用、无需实例化 static public int jiafa(int V) //普通类&#xff1a;引用时需要实例化 public int jiafa(int V)using System; using System.Collections.Generic; using System.Diagnostics; using …

无涯教程-JavaScript - ISNA函数

描述 如果指定的值为Excel&#xff03;N/A错误值,或者表达式返回Excel&#xff03;N/A错误,则ISNA函数将返回逻辑值TRUE。否则返回FALSE。当值不可用于您的公式时,将发生Excel&#xff03;N/A错误。 语法 ISNA (value)争论 Argument描述Required/OptionalvalueValue or exp…

《算法竞赛·快冲300题》每日一题:“点灯游戏”

《算法竞赛快冲300题》将于2024年出版&#xff0c;是《算法竞赛》的辅助练习册。 所有题目放在自建的OJ New Online Judge。 用C/C、Java、Python三种语言给出代码&#xff0c;以中低档题为主&#xff0c;适合入门、进阶。 文章目录 题目描述题解C代码Java代码Python代码 “ 点…

vue cli 打包、生产环境http-proxy-middleware代理

结构树 版本 1、创建vue.config.js const path require(path); const UglifyJsPlugin require(uglifyjs-webpack-plugin) //压缩 const CompressionWebpackPlugin require(compression-webpack-plugin) const isProduction process.env.NODE_ENV ! development;module.exp…

请求与响应以及REST风格

目录 请求与响应请求参数参数传递 五种类型参数传递普通参数POJO数据类型嵌套POJO类型参数数组类型参数集合类型参数 JSON数据传输参数JSON普通数组JSON对象数据JSON对象数组知识点1&#xff1a;EnableWebMvc知识点2&#xff1a;RequestBodyRequestBody与RequestParam区别日期类…

[SICTF 2023] webmisc

文章目录 webBaby_PHP涉及知识点 我全都要RCE你能跟得上我的speed吗 miscPixel_art攻破这个压缩包&#xff01; web Baby_PHP 涉及知识点 php解析特性apache换行解析漏洞无参RCE 源代码 <?php highlight_file(__FILE__); error_reporting(0);$query $_SERVER[QUERY_ST…

OpenCV Series : Target Box Outline Border

角点 P1 (255, 000, 000) P2 (000, 255, 000) P3 (000, 000, 255) P4 (000, 000, 000)垂直矩形框 rect cv2.minAreaRect(cnt)targetColor roi_colortargetThickness 1targetColor (255, 255, 255)if lineVerbose:if True:cv2.line(ph…

做机器视觉工程师,其实挺没意思的

3.康耐视VisionPro高级脚本系列教程-3.脚本编辑错误和运行错误调试方法&#xff0c;break和Contitinuee的差别_哔哩哔哩_bilibili 其实人生就是“有时有意思&#xff0c;有时没意思”。 心里有太多的不甘心&#xff0c;太多的苦水&#xff0c;是没法再吃学习的苦&#xff0c…

市场调查中的信度和效度分析原理及python实现示例

市场调查中的信度和效度分析 1.量表信度分析1.1 内部一致性信度&#xff1a;克朗巴赫α系数原理1.2 python实现示例 2.量表效度分析2.1 内容效度2.1.1 原理2.1.2 python实现示例 2.2 准则效度2.2.1 原理2.2.2 python实现示例 2.3 结构效度2.3.1 原理2.3.2 python实现示例 3.量表…

[PyTorch][chapter 54][GAN- 1]

前言&#xff1a; GAN playground: Experiment with Generative Adversarial Networks in your browser 生成对抗网络&#xff08;Generative Adversarial Nets&#xff0c;GAN&#xff09;是一种基于对抗学习的深度生成模型&#xff0c;最早由Ian Goodfellow于2014年在《Gener…

selenium.chrome怎么写扩展拦截或转发请求?

Selenium WebDriver 是一组开源 API&#xff0c;用于自动测试 Web 应用程序&#xff0c;利用它可以通过代码来控制chrome浏览器&#xff01; 有时候我们需要mock接口的返回&#xff0c;或者拦截和转发请求&#xff0c;今天就来实现这个功能。 代码已开源&#xff1a; https:/…

使用java连接Libvirtd

基于springboot web 一、依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId>&l…

用c语言编写出三底模型

以下是一个用C语言实现三底模型的示例代码。这个程序通过循环遍历输入的股票数据&#xff0c;判断是否出现三底形态&#xff0c;如果是&#xff0c;则输出买入信号&#xff0c;否则输出卖出信号。 c语言 #include <stdio.h> #include <stdlib.h> // 判断是否出现…

Java项目---图片服务器

图片服务器--->服务器&#xff08;图床&#xff09; 核心功能&#xff1a;上传图片、展示图片等 比如&#xff1a;编写博客时我们会插入图片&#xff0c;本质上是往文章中放了一个链接&#xff08;URL&#xff09;&#xff0c;这个URL资源在另外一个服务器上。 核心知识点…

FPGA 纯VHDL解码 IMX214 MIPI 视频,2路视频拼接输出,提供vivado工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 MIPI 编解码方案3、本 MIPI CSI2 模块性能及其优越性4、详细设计方案设计原理框图IMX214 摄像头及其配置D-PHY 模块CSI-2-RX 模块Bayer转RGB模块伽马矫正模块VDMA图像缓存Video Scaler 图像缓存HDMI输出 5、vivado工程详解PL端FPGA硬件设…

无涯教程-JavaScript - INFO函数

描述 INFO函数返回有关当前操作环境的信息。 语法 INFO (type_text) 争论 Argument描述Required/OptionalType_text 指定要返回的信息类型的文本。 下表给出了Type_text的值和相应的返回信息。 Required Type_text 返回的信息"目录" 当前目录或文件夹的路径。&qu…