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

news2024/11/18 2:29:27

使用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 INTO
    student
    (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 INTO
    student
    (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">
    UPDATE
    student
    SET
    name = #{name},
    sex = #{sex},
    age = #{age}
    WHERE
    id = #{iid
</update>

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

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

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

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

2.4 delete

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

<delete id="delete" parameterType="Long">
    DELETE FROM
    student
    WHERE
    id = #{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 student
    where 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 student
    WHERE 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.coloradmin.cn/o/956551.html

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

相关文章

设计模式之建造者、原型

目录 建造者模式 简介 使用场景 优缺点 模式结构 实现 原型模式 简介 应用场景 优缺点 模式结构 实现 建造者模式 简介 将复杂对象的构建与表示进行分离&#xff0c;使得同样的构建过程可以创建不同的表示。是一个将复杂的对象分解为多个简单的对象&#xff0c;然…

windows下安装go环境 和vscode中go扩展+调试

1. 首先安装GO Go下载地址&#xff1a;go.dev 选择相对应的版本&#xff0c;下载&#xff0c;运行安装程序&#xff0c;并打开命令提示符&#xff0c;运行 go env &#xff0c;确认已经安装go 注意关注其中GOPATH和GOROOT&#xff0c;这两个地址可以在系统环境变量中进行设置…

HarmonyOS开发:探索动态共享包的依赖与使用

前言 所谓共享包&#xff0c;和Android中的Library本质是一样的&#xff0c;目的是为了实现代码和资源的共享&#xff0c;在HarmonyOS中&#xff0c;给开发者提供了两种共享包&#xff0c;HAR&#xff08;Harmony Archive&#xff09;静态共享包&#xff0c;和HSP&#xff08;H…

centos安装nginx实操记录(加安全配置)

1.下载与安装 yum -y install nginx2.启动命令 /usr/sbin/nginx -c /etc/nginx/nginx.conf3.新建配置文件 cd /etc/nginx/conf.d vim index.conf配了一个负责均衡&#xff0c;如不需要&#xff0c;可将 server localhost: 多余的去掉 upstream web_server{server localhost…

软件测试人需要掌握的测试知识架构体系(上)

软件计划与可行性研究&#xff08;问题定义、可行性研究&#xff09;&#xff1b;需求分析&#xff1b;软件设计&#xff08;概要设计、详细设计&#xff09;&#xff1b;编码&#xff1b;软件测试&#xff1b;运行与维护。 一、软件的生命周期(SDLC) 1、生存周期划分 各阶段…

react 基础知识(一)

1、 安装1 &#xff08;版本 react 18&#xff09; // 安装全局脚手架&#xff08;create-react-app基于webpackes6&#xff09; npm install -g create-react-app //使用脚手架搭建项目 create-react-app my-app // 打开目录 cd my-app // 运行项目 npm start2、初体验 impo…

C#-单例模式

文章目录 单例模式的概述为什么会有单例模式如何创建单例模式1、首先要保证&#xff0c;该对象 有且仅有一个2、其次&#xff0c;需要让外部能够获取到这个对象 示例通过 属性 获取单例 单例模式的概述 总结来说&#xff1a; 单例 就是只有 一个实例对象。 模式 说的是设计模式…

汽车售后接待vr虚拟仿真实操演练作为岗位培训的重要工具和手段

汽车虚拟仿真教学软件是一种基于虚拟现实技术的教学辅助工具。它能够模拟真实的汽车环境和操作场景&#xff0c;让学生能够通过虚拟仿真来学习和实践汽车相关知识和技能。与传统的教学方式相比&#xff0c;汽车虚拟仿真教学软件具有更高的视觉沉浸感和互动性&#xff0c;能够更…

OpenCV(五):图像颜色空间转换

目录 1.图像颜色空间介绍 RGB 颜色空间 2.HSV 颜色空间 3.RGBA 颜色空间 2.图像数据类型间的互相转换convertTo() 3.不同颜色空间互相转换cvtColor() 4.Android JNI demo 1.图像颜色空间介绍 RGB 颜色空间 RGB 颜色空间是最常见的颜色表示方式之一&#xff0c;其中 R、…

小文智能GPT助手介绍

如何使用小文交互的GPT助手&#xff0c;让AI更加智能&#xff0c;适用更多场景&#xff1f; 在小文智能最新推出的4.0版本&#xff0c;有一个新功能&#xff0c;叫做GPT助手。GPT助手&#xff0c;顾名思义&#xff0c;即在小文智能的场景中&#xff0c;接入ChatGPT&#xff0c…

阿里云部署开源MQTT平台mosquitto的docker操作

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的消息传输协议&#xff0c;广泛用于物联网和传感器网络中。Mosquitto是一个流行的开源MQTT代理&#xff0c;可以在Docker中进行配置和部署。本文将详细介绍如何在Docker中配置Mosquitto MQTT代理…

使用VBA将不同工作表拆分为单独的工作簿:实战指南

实现步骤 在处理大量数据时&#xff0c;Excel工作簿常常包含多个工作表。有时&#xff0c;我们需要将这些不同的工作表拆分为单独的工作簿&#xff0c;以便于分别处理或保存。这种情况下&#xff0c;我们可以利用VBA来实现这一目标。 VBA是一种基于Visual Basic的编程语言&…

详解MAC帧、ARP、DNS、ICMP协议

局域网通信原理 比如新建了一个内网&#xff0c;如果一台机器A找机器B&#xff0c;封FRAME时&#xff08;OSI的第二层用的数据格式&#xff09;&#xff0c;要封装对方的MAC&#xff0c;开始时A不知道B的MAC&#xff0c;只知道IP&#xff0c;它就发一个ARP包&#xff0c;源IP是…

信息安全法规和合规指南: 解析不同地区的信息安全法规要求,提供合规实践建议和资源推荐

第一章&#xff1a;引言 随着数字化时代的到来&#xff0c;信息安全已经成为企业不可忽视的重要议题。各个地区纷纷制定了信息安全法规&#xff0c;以确保个人隐私和敏感数据的保护。本文将深入探讨不同地区的信息安全法规要求&#xff0c;并提供合规实践建议和资源推荐&#…

一百六十九、Hadoop——Hadoop退出NameNode安全模式与查看磁盘空间详情(踩坑,附截图)

一、目的 在海豚跑定时跑kettle的从Kafka到HDFS的任务时&#xff0c;由于Linux服务器的某个文件磁盘空间满了&#xff0c;导致Hadoop的NodeName进入安全模式&#xff0c;此时光执行hdfs dfsadmin -safemode leave命令语句没有效果&#xff08;虽然显示Safe mode is OFF&#x…

JVM的故事——虚拟机字节码执行引擎

虚拟机字节码执行引擎 文章目录 虚拟机字节码执行引擎一、概述二、运行时栈帧结构三、方法调用 一、概述 执行引擎Java虚拟机的核心组成之一&#xff0c;它是由软件自行实现的&#xff0c;能够执行那些不被硬件直接支持的指令集格式。 对于不同的虚拟机实现&#xff0c;执行引…

css强制显示一行

要强制将文本内容显示在一行中&#xff0c;可以使用CSS的white-space属性和overflow属性来实现。 首先&#xff0c;将white-space属性设置为nowrap&#xff0c;这样文本内容就不会换行。然后&#xff0c;将overflow属性设置为hidden&#xff0c;这样超出一行的内容就会被隐藏起…

从零开始探索C语言(五)----函数和作用域

文章目录 1. 函数1.1 函数定义1.2 函数声明1.3 函数调用1.3.1 传值调用1.3.2 引用调用 2. 作用域2.1 局部变量2.2 全局变量2.3 形式参数 1. 函数 函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数&#xff0c;即主函数 main() &#xff0c;所有简单的程序都可以…

直接插入排序与希尔排序

目录 一&#xff0c;排序的概念 二&#xff0c;插入排序 2.1直接插入排序 2.2 希尔排序 一&#xff0c;排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些或某些关键字的大小&#xff0c;递增或递减的排列 稳定性&#xff…

flutter自定义按钮-文本按钮

目录 前言 需求 实现 前言 最近闲着无聊学习了flutter的一下知识&#xff0c;发现flutter和安卓之间&#xff0c;页面开发的方式还是有较大的差异的&#xff0c;众所周知&#xff0c;android的页面开发都是写在xml文件中的&#xff0c;而flutter直接写在代码里&#xff08;da…