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

【Spring Boot】使用XML配置文件实现数据库操作(一)

使用XML配置文件实现数据库操作(一)

1.SQL映射文件

SQL映射文件就是我们通常说的mapper.xml配置文件,主要实现SQL语句的配置和映射,同时实现Java的POJO对象与数据库中的表和字段进行映射关联的功能。

1.1 mapper.xml的结构

下面就来详细介绍mapper.xml文件的结构。首先看一个完整的mapper.xml示例:

<?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.example.demo.Mapper.StudentMapper"><select id="selectAll" resultMap="BaseResultMap">SELECT*FROM student</select><resultMap id="BaseResultMap" type="com.example.demo.model.Student"><id column="id" property="id" jdbcType="BIGINT" /><result column="name" property="name" jdbcType="VARCHAR" /><result column="sex" property="sex" javaType="INTEGER" /><result column="age" property="age" jdbcType="INTEGER" /></resultMap>
</mapper>

如上述示例所示,一般mapper.xml主要分为4部分:

1)mapper.xml的语法声明,声明MyBatis语法。

2)通过namespace指明mapper.xml文件对应的Mapper接口。

3)通过XML标签定义接口方法对应的SQL语句,id属性对应Mapper接口中的方法,resultMap属性为返回值类型。

4)<resultMap>标签定义返回的结果类型与数据库表结构的对应关系,上面映射的是Student实体类对象。

1.2 mapper.xml的标签

mapper.xml映射文件提供了一些非常实用的标签,其中比较常用的有resultMap、sql、insert、update、delete、select等标签。熟练掌握标签的使用,这样使用MyBatis才能如鱼得水。MyBatis标签和功能说明如表所示。

在这里插入图片描述

2.定义SQL语句

MyBatis提供了insert、update、delete和delete四个标签来定义SQL语句。接下来就从SQL语句开始介绍每个标签的用法。

2.1 select

select是MyBatis常用的元素之一,MyBatis在查询和结果映射中做了相当多的改进。一个简单查询的select元素是非常简单的,比如:

<select id="selectOne" resultType="hashmap" parameterType="Long">SELECT name,age FROM student WHERE id = #{id}
</select>

在上面的示例中,通过id查询学生的姓名和年龄。定义方法名为selectOne,接收一个Long类型的参数,并返回一个HashMap类型的对象。HashMap的键是列名,值是结果集中的对应值。#{id}为传入的参数符号。

select标签允许配置很多属性来配置每条语句的行为细节,比如参数类型、返回值类型等,包含的属性如表所示。

属性说明
id命名空间中唯一的标识符,被用来引用这条语句
parameterType将传入语句的参数的数据类型,可选。因为 MyBatis 可以通过类型处理程序(TypeHandler)推断出传入语句的参数的数据类型,默认值为未设置 (unset)
resultType返回结果的数据类型。注意,如果返回的是集合,那么应该设置为集合包含的类型,而不是集合本身的类型。resultType 和 resultMap 之间只能使用一个
resultMap结果映射, resultMap 是 MyBatis 的强大特性之一, resultType 和resultMap 之间只能使用一个
flushCache是否清空缓存,Select 语句默认值为 false,如果设置为 true,只要语句被调用,将清空本地缓存和二级缓存
useCache是否使用缓存,默认值为 tue,缓存本条语句的查询结果
timeout超时时间,等待数据库返回请求结果的时间。默认值为未设置 (unset)
fetchSize设置返回的结果行数。默认值为未设置 (unset)
statementType使用 Statement、PreparedStatement或CallableStatement执行SQL 语句,默认值为PREPARED
resultSetTypeFORWARD_ONLY、SCROLL_SENSITIVE、SCROLL_INSENSITIVE 或 DEFAULT (等价于unset),默认值为DEFAULT
databaseId数据库厂商标识 (databaseldProvider),如果配置了此属性,MyBatis 会加载所有不带databaseId 或匹配当前 databaseId 的语句
resultOrdered针对嵌套结果 select 语句,默认值为 false,如果为 true,将会假设包含嵌套结果集或分组,当返回一个主结果行时,不会产生对前面结果集的引用
resultSets仅适用于多结果集的情况。将列出语句执行后返回的结果集并赋予每个结果集一个名称,多个名称之间以逗号分隔

select标签虽然有很多属性,但是常用的是id、parameterType、resultType、resultMap这4个属性。需要注意的是,resultMap是MyBatis的强大特性之一,如果对其理解透彻,许多复杂的映射问题都能迎刃而解。

2.2 insert

insert标签主要用于定义插入数据的SQL语句,例如:

<insert id="insert" parameterType="com.example.demo.Mapper.Student">INSERT INTOstudent(id, name, sex, age)VALUES(#{id}, #{name}, #{sex}, #{age})
</insert>

在上面的示例中,插入语句的配置规则更加复杂,同时提供了额外的属性和子元素用来处理主键的生成方式。

如果数据库包含自动生成主键的字段,那么可以设置useGeneratedKeys=“true”,然后把keyProperty设置为目标属性。比如,上面的Student表已经在id列上使用了自动生成主键,那么语句可以修改为:

<insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="com.example.demo.model.Student">INSERT INTOstudent(name, sex, age)VALUES(#{name}, #{sex}, #{age})
</insert>

在上面的示例中,设置useGeneratedKeys=“true”,然后设置keyProperty="id"对应的主键字段。

insert标签包含的属性如表所示。

属性说明
id命名空间中唯一的标识符,被用来引用这条语句
parameterType将传入语句的参数的数据类型,可选。MyBatis 可以通过类型处理程序 (TypeHandler)推断出传入语句的参数的数据类型,默认值为未设置 (unset)
flushCache是否清空缓存,默认值为 true,只要语句被调用,就清空本地缓存和二级缓存
timeout超时时间,即等待数据库返回请求结果的时间。默认值为未设置 (unset)
statementType使用 Statement、PreparedStatement 或 CallableStatement 执行 SQL 语句,默认值为PREPARED
useGeneratedKeys自动生成主键,默认值为 false,设置为 true 时,根据规则自动生成主键
keyProperty指定能够唯一识别对象的属性
keyColumn指定数据库表的主键列名
databaseld数据库厂商标识 (databaseIdProvider),如果配置了此属性,MyBatis 会加载所有不带databaseId 或匹配当前 databaseId 的语句

常用的属性有id、parameterType、useGeneratedKeys、keyProperty等,部分属性和select标签是一致的。

2.3 update

update标签和insert标签类似,主要用来映射更新语句,示例代码如下:

<update id="update" parameterType="com.example.demo.model.Student">UPDATEstudentSETname = #{name},sex = #{sex},age = #{age}WHEREid = #{iid
</update>

如果需要根据传入的参数来动态判断是否进行修改,可以使用if标签动态生成SQL语句,示例代码如下:

<update id="update" parameterType="com.example.demo.model.Student">UPDATEstudentSET<if test="name != null">name = #{name},</if><if test="sex != null">sex = #{sex},</if>age = #{age}WHEREid = #{iid
</update>

在上面的示例中,通过if标签判断传入的name参数是否为空,实现根据参数动态生成SQL语句。

update标签包含的属性和insert标签基本一致。

2.4 delete

delete标签用来映射删除语句。

<delete id="delete" parameterType="Long">DELETE FROMstudentWHEREid = #{id}
</delete>

delete标签包含的属性如表所示。

在这里插入图片描述

delete标签除了少了useGeneratedKeys、keyProperty和keyColumn三个属性之外,其余的和insert、update标签一样。

3.结果映射

结果映射是MyBatis重要的功能之一。对于简单的SQL查询,使用resultType属性自动将结果转换成Java数据类型。不过,如果是复杂的语句,则使用resultMap映射将查询结果转换为数据实体关系。

3.1 resultType

前面介绍select标签的时候提到,select标签的返回结果可以使用resultMap和resultType两个属性指定映射结构。下面就来演示resultType的用法。

<select id="selectOne" resultType="com.example.demo.model.Student">select *from studentwhere id =#{id}
</select>

通过设置resultType属性,MyBatis会自动把查询结果集转换为Student实体对象。当然,如果只查询部分字段,则可以返回HashMap,比如:

<select id="selectOne" parameterType="Long" resultType="hashmap">select name,age from student where id = #{id}
</select>

上述语句,Mybatis会自动将所有的列映射成HashMap对象

3.2 resultMap

在日常开发过程中,在大部分情况下resultType就能满足。但是使用resultType需要数据库字段和属性字段名称一致,否则就得使用别名,这样就使得SQL语句变得复杂。

所以MyBatis提供了resultMap标签定义SQL查询结果字段与实体属性的映射关系。下面演示resultMap的使用。

首先,定义resultMap:

<resultMap id="BaseResultMap" type="com.example.demo.model.Student"><id column="id" property="id" jdbcType="BIGINT" /><result column="name" property="name" jdbcType="VARCHAR" /><result column="sex" property="sex" javaType="INTEGER" /><result column="age" property="age" jdbcType="INTEGER" />
</resultMap>

在上面的示例中,我们使用resultMap标签定义了BaseResultMap映射关系,将数据库中的字段映射为Student实体对象。

然后,在SQL语句中使用自定义的BaseResultMap映射关系,设置select标签的resultMap=“BaseResultMap”,示例代码如下:

<select id="selectOne" parameterType="Long" resultMap="BaseResultMap">SELECT*FROM studentWHERE id =#{id}
</select>

3.3 resultMap的结构

resultMap标签的结构比较复杂,包含很多子属性和子标签。resultMap标签包含id和type属性:

  • id定义该resultMap的唯一标识。
  • type为返回值的类名。

同样,resultMap还可以包含多个子标签,包括:

1)id标签用于设置主键字段与领域模型属性的映射关系,此处主键为id,对应数据库字段中的主键ID。

2)result标签用于设置普通字段与领域模型的属性映射关系。

3)association标签用于配置一对一结果映射,可以关联resultMap中的定义,或者对其他结果映射的引用。

4)collection标签用于配置一对多结果映射,可以关联resultMap中的定义,或者对其他结果映射的引用。

下面是完整的resultMap元素的结构:

<resultMap id="BaseResultMap" type="com.example.demo.model.Student"><id column="id" property="id" jdbcType="BIGINT" /><result column="name" property="name" jdbcType="VARCHAR" /><result column="sex" property="sex" javaType="INTEGER" /><result column="age" property="age" jdbcType="INTEGER" /><association property="classes" javaType="com.example.demo.model.Classes"><id column="id" property="id"/><result column="class_name" property="name" jdbcType="VARCHAR"/><result column="memo" property="memo" jdbcType="VARCHAR"/></association>
</resultMap>

相关文章:

【Spring Boot】使用XML配置文件实现数据库操作(一)

使用XML配置文件实现数据库操作&#xff08;一&#xff09; 1.SQL映射文件 SQL映射文件就是我们通常说的mapper.xml配置文件&#xff0c;主要实现SQL语句的配置和映射&#xff0c;同时实现Java的POJO对象与数据库中的表和字段进行映射关联的功能。 1.1 mapper.xml的结构 下…...

PMP中常用英文术语

常用术语&#xff08;五&#xff09; Project 项目 为完成一个唯一的产品或服务的一种一次性努力。 Project Charter 项目许可证 由高级管理部门提供的一个文档&#xff0c;它给项目经理特权把组织的资源应用到项目工作中。 Project Communication Management 项目沟通管理 项目…...

【Apollo学习笔记】——规划模块TASK之SPEED_BOUNDS_PRIORI_DECIDERSPEED_BOUNDS_FINAL_DECIDER

文章目录 前言SPEED_BOUNDS_PRIORI_DECIDER功能简介SPEED_BOUNDS_FINAL_DECIDER功能简介SPEED_BOUNDS_PRIORI_DECIDER相关配置SPEED_BOUNDS_FINAL_DECIDER相关配置SPEED_BOUNDS_DECIDER流程将障碍物映射到ST图中ComputeSTBoundary(PathDecision* path_decision)ComputeSTBounda…...

score_inverse_problems运行环境,pycharm重新安装,jax,jaxlib的GPU版本安装-230831

尝试运行https://github.com/yang-song/score_inverse_problems pycharm2019不支持python3.10&#xff0c;其实后来我用来3.8…… pycharm2022.3.3的安装&#xff0c;涉及激活&#xff08;淘宝5元&#xff09;&#xff0c;搜狗拼音输入&#xff08;shift不能切换输入法&#x…...

VSC++: 奇怪的风吹

void 奇怪的风吹() {//缘由https://ask.csdn.net/questions/1062454int aa[]{15, 30, 12, 36, 11, 20, 19, 17, 16, 18, 38, 15, 30, 12, 36, 11, 20, 19, 17, 16, 18, 38, -1},j 0, a 0, y 0, z 0;while (aa[j] > 0){if (j && aa[j] > 35 || aa[j] < 15)…...

被动操作系统指纹识别的强大功能可实现准确的物联网设备识别

到 2030 年&#xff0c;企业网络和互联网上的物联网设备数量预计将达到290 亿。这种指数级增长无意中增加了攻击面。 每个互连设备都可能为网络攻击和安全漏洞创造新的途径。Mirai 僵尸网络通过使用数千个易受攻击的 IoT 设备对关键互联网基础设施和热门网站发起大规模 DDoS 攻…...

QT/C++获取电脑系统,主板型号,CPU型号,硬盘型号,内存大小等相关信息(二)通过Windows Server (WMI)查询

Qt/C调用windows Api库通过wmi的方式查询电脑能获取更多详细信息&#xff0c;也更加合理有技术性。 建议使用MSCV编译器&#xff0c;如MSCV 2017 ,Qt版本 : 5.13.1 目录导读 关于 WMI示例&#xff1a;创建 WMI 应用程序示例&#xff1a;打印Wmi执行的查询项的所有属性头文件引用…...

自建音乐服务器Navidrome之一

这里写自定义目录标题 1.1 官方网站 2. Navidrome 简介2.1 简介2.2 特性 3. 准备工作4. 视频教程5. 界面演示5.1 初始化页5.2 专辑页 前言 之前给大家介绍过 Koel 音频流服务&#xff0c;就是为了解决大家的这个问题&#xff1a;下载下来的音乐&#xff0c;只能在本机欣赏&…...

ACL 访问控制 过滤数据 维护网络安全(第七课)

一 ACL 简介 ACL是Access Control List(访问控制列表)的缩写,是一种用于控制文件、目录、网络设备等资源访问权限的方法。ACL可以对每个用户或用户组设置不同的访问权,即在访问控制清单中为每个用户或用户组指定允许或禁止访问该资源的权限。它通常由一系列规则组成,规则…...

3D视觉测量:面对面的对称度 点对(附源码)

文章目录 0. 测试效果1. 基本内容2. 3D视觉测量对称度测量思路3. 代码实现4. 参考文章目录:3D视觉测量目录微信:dhlddxB站: Non-Stop_目标:通过3D视觉方法计算面对面的对称度0. 测试效果 数据说明:此测试点云是通过UG建模,Meshlab降采样得到,数据比较理想,仅作为测试使用…...

无涯教程-JavaScript - RANK函数

RANK函数取代了Excel 2010中的RANK.EQ函数。 描述 该函数返回数字列表中数字的等级。数字的等级是其相对于列表中其他值的大小。 如果对列表进行排序,则数字的排名将是其位置。 语法 RANK (number,ref,[order])争论 Argument描述Required/OptionalNumberThe number whose…...

蓝牙发展现状

目录 一、产品分类1、Bluetooth经典2、Bluetooth低能耗(LE)3、二者差异 二、出货量三、未来需要加强的方向四、技术行业细分五、学习资料1、蓝牙官网2、大神博客——于忠军 一、产品分类 1、Bluetooth经典 Bluetooth Classic无线电&#xff0c;也被称为Bluetooth 基本速率/增强…...

排序算法问题

给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 示例 1&#xff1a; 输入&#xff1a;nums [5,2,3,1] 输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&#xff1a;nums [5,1,1,2,0,0] 输出&#xff1a;[0,0,1,1,2,5] 代码如下&#xff1a; 1.插入排序(简…...

PlotlyJs 指定画布的宽度并页面居中

可以通过CSS样式来实现指定画布的宽度并使其在页面居中。具体方法如下&#xff1a; 在HTML文件中定义一个div&#xff0c;用来包含PlotlyJs画布。如下所示&#xff1a; <div id"plotly-div"></div>在CSS样式中指定该div的宽度和居中方式。如下所示&…...

java基础-----第八篇

系列文章目录 文章目录 系列文章目录一、Java类加载器二、双亲委托模型 一、Java类加载器 JDK自带有三个类加载器&#xff1a;bootstrap ClassLoader、ExtClassLoader、AppClassLoader。 BootStrapClassLoader是ExtClassLoader的父类加载器&#xff0c;默认负责加载%JAVA_HOME…...

【Java 基础篇】StringBuilder的魔力:Java字符串处理探究

在Java编程中&#xff0c;字符串是一个常见的数据类型&#xff0c;用于存储文本信息。然而&#xff0c;与字符串相关的操作可能会导致性能问题&#xff0c;因为字符串是不可变的&#xff0c;每次对字符串进行操作都会创建一个新的字符串对象。为了解决这个问题&#xff0c;Java…...

Shell 编程技巧:批量转换Markdown文件

由于一些原因&#xff0c;需要将以前编写的所有markdown文件转成docx文件&#xff0c;以便做一个备份&#xff0c;特别是原文档中引用的图片需要嵌入docx文件&#xff0c;作本地化保存。先上脚本吧&#xff1a; sudo yum -y install pandoc # set new line char as IFS IFS$\…...

EasyAVFilter的初衷:把ffmpeg.c当做SDK来用,而不是当做EXE来用

之前我们做一个视频点播的功能&#xff0c;大概的流程就是将上传上来的各种格式的视频&#xff0c;用FFmpeg统一进行一次转码&#xff0c;如果probe到视频的编码格式是H.264就调用-vcodec copy&#xff0c;如果probe到视频的编码格式不是H.264就调用-vcodec libx264&#xff0c…...

内存管理之:内存空间分布和栈攻击(黑客常用攻击手段)

目录 C语言内存管理及栈攻击 内存管理 Linux虚拟内存空间分布&#xff08;重要&#xff09; 栈溢出&#xff08;栈攻击&#xff09; 堆栈的特点 栈攻击 栈攻击的实现 原理 编译器选项 实现案例 linux修改栈空间大小方式 内存泄漏 如何避免野指针&#xff1f; 如何…...

一米facebook功能点

用户信息批量修改 可批量修改已登录用户的头像、密码、个人说明等信息。 小号批量刷赞、评论 可以批量用facebook小号给帖子、主页等刷赞或评论。 直播帖刷人气/评论/分享 可以直接刷直播帖子的人气、评论&#xff0c;并可一键分享到小组或个人时间线、公共主页等。 小组成员…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...