【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>

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

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

相关文章

100天精通Python(可视化篇)——第99天:Pyecharts绘制多种炫酷K线图参数说明+代码实战

文章目录 专栏导读一、K线图介绍1. 说明2. 应用场景 二、配置说明三、K线图实战1. 普通k线图2. 添加辅助线3. k线图鼠标缩放4. 添加数据缩放滑块5. K线周期图表 书籍推荐 专栏导读 &#x1f525;&#x1f525;本文已收录于《100天精通Python从入门到就业》&#xff1a;本专栏专…

Unity中Shader的混合模式Blend

文章目录 前言一、混合的作用就是实现各种半透明效果二、混合操作三、在 Shader 中暴露两个属性 来调节 混合的效果 前言 Unity中Shader的混合模式Blend 一、混合的作用就是实现各种半透明效果 这里用PS里的混合作为例子 没选择混合效果前&#xff0c;显示的效果是这样 选择…

基于 Zookeeper 实现服务注册和服务发现

文章目录 前言声明前置知识服务注册和发现Zookeeper 工作原理实现过程注册中心服务注册服务发现 总结 前言 无论是采用SOA还是微服务架构&#xff0c;都需要使用服务注册和服务发现组件。我刚开始接触 Dubbo 时一直对服务注册/发现以及 Zookeeper 的作用感到困惑&#xff0c;现…

React 18 对 state 进行保留和重置

参考文章 对 state 进行保留和重置 各个组件的 state 是各自独立的。根据组件在 UI 树中的位置&#xff0c;React 可以跟踪哪些 state 属于哪个组件。可以控制在重新渲染过程中何时对 state 进行保留和重置。 UI 树 浏览器使用许多树形结构来为 UI 建立模型。DOM 用于表示 …

解决Linux Ubuntu上安装RabbitMQ服务后的公网远程访问问题,借助cpolar内网穿透技术

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 RabbitMQ是一个在 AMQP(高级消息队列协议)基…

软件产品确认测试鉴定测试

软件产品确认测试 确认测试也称鉴定测试&#xff0c;即验证软件的功能、性能及其它特性是否与用户的要求一致。软件确认测试是在模拟的环境下&#xff0c;验证软件是否满足需求规格说明书列出的需求。为此&#xff0c;需要首先制定测试计划&#xff0c;规定要做测试的种类&…

Pinely Round 2 (Div. 1 + Div. 2) F. Divide, XOR, and Conquer(区间dp)

题目 给定长为n(n<1e4)的数组&#xff0c;第i个数为ai(0<ai<2的60次方) 初始时&#xff0c;区间为[1,n]&#xff0c;也即l1&#xff0c;rn&#xff0c; 你可以在[l,r)中指定一个k&#xff0c;将区间分成左半边[l,k]、右半边[k1,r] 1. 如果左半边异或和与异或和的异…

分类预测 | MATLAB实现GRNN广义回归神经网络多特征分类预测

分类预测 | MATLAB实现GRNN广义回归神经网络多特征分类预测 目录 分类预测 | MATLAB实现GRNN广义回归神经网络多特征分类预测分类效果基本介绍模型描述预测过程程序设计参考资料分类效果 基本介绍 MATLAB实现GRNN广义回归神经网络多特

自建音乐服务器Navidrome之一

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

「Redis」1. 数据类型的底层实现

前言&#xff1a;在这篇博文中&#xff0c;我们将简单总结在面试中怎么回答Redis数据类型的底层实现。 因为面试时间就那么点&#xff0c;言简意赅的描述自己会的知识显得尤为重要‼️ 文章目录 0.1. String 的底层实现原理0.2. 列表的底层实现原理0.3. 字典的底层实现原理0.4.…

​放弃数据库,改用Kafka!

长期以来&#xff0c;数据库一直充当着记录系统&#xff0c;它们以可靠且持久的方式存储和管理关键数据&#xff0c;也赢得了大多数公司的信赖。 但时代在变。许多新兴趋势正在影响当今数据的存储和管理方式&#xff0c;不得不让一些技术决策者们重新考虑数据存储究竟还有哪些…

敏感接口权限校验

前端校验 &#xff08;从前端或者从token里面拿一下&#xff09;&#xff0c;看一下用户有没有这个页面的权限&#xff08;但是一般不用&#xff0c;因为nodejs也可以写后端&#xff0c;但是放到前端去校验不安全&#xff09; 后端校验 需要梳理敏感数据接口&#xff0c;将这…

重写 UGUI

重写Button using UnityEngine; using UnityEngine.UI; public class MyButton : Button {[SerializeField] private int _newNumber; }using UnityEditor;//编辑器类在UnityEditor命名空间下。所以当使用C#脚本时&#xff0c;你需要在脚本前面加上 "using UnityEditor&q…

Hive-安装与配置(1)

&#x1f947;&#x1f947;【大数据学习记录篇】-持续更新中~&#x1f947;&#x1f947; 个人主页&#xff1a;beixi 本文章收录于专栏&#xff08;点击传送&#xff09;&#xff1a;【大数据学习】 &#x1f493;&#x1f493;持续更新中&#xff0c;感谢各位前辈朋友们支持…

微信小程序修改vant组件样式

1 背景 在使用vant组件开发微信小程序的时候&#xff0c;想更改vant组件内部样式&#xff0c;达到自己想要的目的&#xff08;van-grid组件改成宫格背景色为透明&#xff0c;默认为白色&#xff09;&#xff0c;官网没有示例&#xff0c;通过以下几步修改成功。 2 步骤 2.1 …

随机森林算法

介绍 随机森林是一种基于集成学习的有监督机器学习算法。随机森林是包含多个决策树的分类器&#xff0c;一般输出的类别是由决策树的众数决定。随机森林也可以用于常见的回归拟合。随机森林主要是运用了两种思想。具体如下所示。 Breimans的Bootstrap aggregatingHo的random …

重装系统全流程

重点&#xff1a; 下载镜像网址&#xff1a;下载 Windows 10 (microsoft.com) 不过不用下载&#xff0c;你的美均相U盘里面有下载好的Win10系统 重点注意&#xff0c;重启后拔优盘&#xff0c;安装时不要联网

PID串行多闭环控制与并行多闭环控制的优缺点分析和应用比较

导言&#xff1a; 在自动控制领域&#xff0c;PID控制器是一种经典的控制策略&#xff0c;被广泛应用于各种工业和非工业过程。随着控制系统的复杂性增加&#xff0c;PID串行多闭环控制和PID并行多闭环控制成为解决复杂控制问题的重要方法。本文将从优点和缺点的角度对这两种控…

Web服务器简介及HTTP协议

一、Web Server&#xff08;网页服务器&#xff09; 一个 Web Server 就是一个服务器软件&#xff08;程序&#xff09;&#xff0c;或者是运行这个服务器软件的硬件&#xff08;计算机&#xff09;。其主要功能是通过 HTTP 协议与客户端&#xff08;通常是浏览器&#xff08…

(二十)大数据实战——Flume数据采集的基本案例实战

前言 本节内容我们主要介绍几个Flume数据采集的基本案例&#xff0c;包括监控端口数据、实时监控单个追加文件、实时监控目录下多个新文件、实时监控目录下的多个追加文件等案例。完成flume数据监控的基本使用。 正文 监控端口数据 ①需求说明 - 使用 Flume 监听一个端口&am…