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

XML语言

XML语言

在开始介绍Mybatis之前,先介绍一下XML语言,XML语言发明最初是用于数据的存储和传输,它是由一个一个的标签嵌套而成

<?xml version="1.0" encoding="UTF-8" ?>
<outer> <name>阿伟</name><desc>怎么又在玩电动啊</desc> <inner type="1"> <age>10</age> <sex></sex>  </inner>
</outer>

JDK为我们内置了一个叫做org.w3c的XML解析库,我们来看看如何使用它来进行XML文件内容解析:

// 创建DocumentBuilderFactory对象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 创建DocumentBuilder对象
try {DocumentBuilder builder = factory.newDocumentBuilder();Document d = builder.parse("file:mappers/test.xml");// 每一个标签都作为一个节点NodeList nodeList = d.getElementsByTagName("test");  // 可能有很多个名字为test的标签Node rootNode = nodeList.item(0); // 获取首个NodeList childNodes = rootNode.getChildNodes(); // 一个节点下可能会有很多个节点,比如根节点下就囊括了所有的节点//节点可以是一个带有内容的标签(它内部就还有子节点),也可以是一段文本内容for (int i = 0; i < childNodes.getLength(); i++) {Node child = childNodes.item(i);if(child.getNodeType() == Node.ELEMENT_NODE)  //过滤换行符之类的内容,因为它们都被认为是一个文本节点System.out.println(child.getNodeName() + ":" +child.getFirstChild().getNodeValue());// 输出节点名称,也就是标签名称,以及标签内部的文本(内部的内容都是子节点,所以要获取内部的节点)}
} catch (Exception e) {e.printStackTrace();
}

依赖管理

如果使用Maven可以直接引入:

<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.16</version>
</dependency>

依赖变多之后,我们可以将其放到一个单独的文件夹,不然会很繁杂:

QQ_1723452238551

依赖导入完成后,我们就可以编写Mybatis的配置文件了(现在不是在Java代码中配置了,而是通过一个XML文件去配置

配置文件架构
创建mybatis-config.xml作为全局配置入口
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development">  <environment id="development">  <transactionManager type="JDBC"/>  <dataSource type="POOLED">  <property name="driver" value="${jdbc.driver}"/>  <property name="url" value="${jdbc.url}"/>  <property name="username" value="${jdbc.username}"/>  <property name="password" value="${jdbc.password}"/>  </dataSource>       </environment>  </environments>  <!-- 加载 Mapper 文件 -->  <mappers>  <!--映射文件方式1:一个一个的配置 -->  <mapper resource="mapper/UserMapper.xml"/>  <!--<mapper resource="com/demo14/mapper/UserMapper.xml"/>-->  <!--  <mapper class="mapper.UserMapper.xml"/> 根据实际路径调整 -->  <!--映射方式2,自动扫描包内的Mapper接口与配置文件-->  <!--<package name="com.demo14.mapper"/>-->   </mappers>  
</configuration>

实体类与映射文件

UserMapper.xml 是 MyBatis 实现 ​数据访问层 的核心文件,通过将接口方法与 SQL 绑定,简化数据库操作

<select id="唯一标识(必须与Mapper接口中的方法名一致用于绑定SQL与方法)" parameterType="传入参数类型(可省略),MyBatis通过方法参数自动推断" resultType="返回结果类型,MyBatis将查询结果自动映射到该实体类">
</select>  
  • 创建与数据库表对应的Java实体类,属性名需与字段名严格对应:
    @Data
package com.demo14.entity;  /**  * 用户实体类  */  
public class User {  private Integer userid;  private String userName;  private String userPwd;  private Integer userage;  ...}
/**  * 用户接口类  */  
@WebServlet  
public interface UserMapper {  public User queryUserByName(String userName);  }
  • 编写Mapper XML文件TestMapper.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 接口全限定名一致 -->  
<mapper namespace="com.demo14.mapper.UserMapper">  <!--  id: 对应 Mapper 接口方法名  parameterType: 参数类型(可省略)  resultType: 返回结果实体类全限定名  -->  <!--  MyBatis 代理 --><select id="queryUserByName" parameterType="string" resultType="com.demo14.entity.User">  <!--SQL 执行-->SELECT * FROM tb_user WHERE userName = #{userName}  </select>  
</mapper>
_`resultType`指定结果映射的实体类全路径_

属性外部化
- 创建jdbc.properties文件管理数据库参数

        jdbc.driver=com.mysql.cj.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/web_studyjdbc.username=testjdbc.password=123456
- 配置文件引用:
    <?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-config.dtd">  
<configuration>  <!--  properties 标签中的配置可以供整个配置文件使用,在任何位置都可以引入其中配置的值  properties 标签可以通过标签property标签来配置一些子元素信息,也可以配置外部的动态文件  -->  <!-- 加载外部属性文件(如 jdbc.properties)(支持多环境配置)-->  <properties resource="jdbc.properties"/> <!-- 全局参数优化(生产环境必调参数) --><settings>        <!-- 启用下划线转驼峰 -->  <setting name="mapUnderscoreToCamelCase" value="true"/>  <!-- 启用日志输出 -->  <setting name="logImpl" value="STDOUT_LOGGING"/>  </settings>    <!-- 全局设置 -->  <!--<settings>  启用字段下划线转驼峰  <setting name="mapUnderscoreToCamelCase" value="true"/>   </settings> -->  <!-- 配置类型别名(可选) -->  <!--<typeAliases>     实体类包路径  <package name="com.example.entity"/>  </typeAliases>-->  <!-- 数据库环境配置(需与 jdbc.properties 中的参数匹配) -->  <environments default="development">  <environment id="development">  <transactionManager type="JDBC"/>  <dataSource type="POOLED">  <property name="driver" value="${jdbc.driver}"/>  <property name="url" value="${jdbc.url}"/>  <property name="username" value="${jdbc.username}"/>  <property name="password" value="${jdbc.password}"/>  </dataSource>       </environment>  </environments>  <!-- 加载 Mapper 文件 -->  <mappers>  <!--映射文件方式1:一个一个的配置 -->  <mapper resource="mapper/UserMapper.xml"/>  <!--<mapper resource="com/demo14/mapper/UserMapper.xml"/>-->  <!--  <mapper class="mapper.UserMapper.xml"/> 根据实际路径调整 -->  <!--映射方式2,自动扫描包内的Mapper接口与配置文件-->  <!--<package name="com.demo14.mapper"/>-->   </mappers>  </configuration>
为什么需要 MyBatis 的 <select> 标签配置?

1. 解耦 SQL 与 Java 代码

  • 传统 JDBC 问题
    SQL 与 Java 代码混杂,导致代码臃肿且难以维护。例如:
    // 传统 JDBC 代码(硬编码 SQL)
    String sql = "SELECT * FROM user WHERE name = ?";
    PreparedStatement stmt = connection.prepareStatement(sql);
    stmt.setString(1, "admin");
    ResultSet rs = stmt.executeQuery();
    
    • 缺点:SQL 修改需重新编译 Java 代码,且字符串拼接易引发 SQL 注入。
  • MyBatis 解决方案
    将 SQL 独立到 XML 文件中,实现 ​业务逻辑与数据访问逻辑分离
    <!-- UserMapper.xml -->
    <select id="getUserByName" resultType="User">SELECT * FROM user WHERE name = #{name}
    </select>
    

2. 自动结果集映射

  • 传统 JDBC 问题
    手动解析 ResultSet 到 Java 对象,代码重复且易错:
    User user = new User();
    while (rs.next()) {user.setId(rs.getInt("id"));user.setName(rs.getString("name"));// ...其他字段
    }
    
  • MyBatis 解决方案
    通过 resultTyperesultMap 自动映射查询结果到对象:
    <select id="getUserByName" resultType="com.example.User">SELECT id, name, email FROM user WHERE name = #{name}
    </select>
    

3. 动态 SQL 支持

  • 传统 JDBC 问题
    拼接动态 SQL 易出错且难以维护:

    String sql = "SELECT * FROM user WHERE 1=1 ";
    if (name != null) {sql += "AND name = '" + name + "' "; // 存在 SQL 注入风险
    }
    
  • MyBatis 解决方案
    使用 <if>, <where>, <foreach> 等标签实现动态 SQL:

    <select id="searchUsers" resultType="User">SELECT * FROM user<where><if test="name != null">AND name = #{name}</if><if test="age != null">AND age = #{age}</if></where>
    </select>
    
  • 核心机制
    MyBatis 通过 ​接口绑定 将 Mapper 接口与 XML SQL 关联:

public interface UserMapper {  public User queryUserByName(String userName);  
}
- ​**工作流程**:1. 调用 `userMapper.queryUserByName("admin")`。2. MyBatis 动态代理接口,根据方法名 `getUserByName` 找到对应的 XML SQL。3. 执行 SQL 并返回结果。

替代方案:简单项目可用注解,但 XML 仍是 MyBatis 的推荐实践

为何需要分别两个 mapper 目录?

这样做的原因是为了遵循Maven或Gradle的项目结构约定,构建工具会自动处理资源文件的打包和路径问题

职责分离

​构建与部署规范

  • Java 代码目录 (src/main/java)
    • 存放可编译的 Java 源文件(如 UserMapper.java)。
    • 构建工具(如 Maven/Gradle)会将其编译为 .class 文件。
  • 资源目录 (src/main/resources)
    • 存放非代码文件(如 XML、配置文件)。
    • 构建时,资源文件会被复制到 target/classes(类路径),供 MyBatis 运行时加载。

流程

  1. 开发者编写 UserMapper.java 接口。

  2. UserMapper.xml 中编写对应的 SQL。

  3. 构建工具将 Java 代码编译为 .class 文件,资源文件复制到类路径

  4. MyBatis 启动时,通过 ​接口名 + 方法名 动态绑定 XML 中的 SQL。

若合并目录

  • 将 XML 文件放在 Java 包目录中,可能导致构建工具忽略资源文件,引发 ​SQL 映射加载失败

MyBatis 的约定与配置

  • 默认映射规则
    MyBatis 要求 XML 文件的路径与接口包名一致。例如:

    • 接口路径:com.demo14.mapper.UserMapper
    • XML 路径:resources/mapper/UserMapper.xml
  • 配置验证
    mybatis-config.xml 或 Spring Boot 配置中需指定 XML 文件位置:

    <!-- MyBatis 配置 -->
    <mappers><mapper resource="mapper/UserMapper.xml"/>
    </mappers>
    
  • 在 Mapper 接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致

相关文章:

XML语言

XML语言 在开始介绍Mybatis之前&#xff0c;先介绍一下XML语言&#xff0c;XML语言发明最初是用于数据的存储和传输&#xff0c;它是由一个一个的标签嵌套而成 <?xml version"1.0" encoding"UTF-8" ?> <outer> <name>阿伟</name&…...

基于SpringBoot的小区停车位管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

VR博物馆,足不出户云逛展

VR博物馆概念与特点 定义与由来 VR博物馆&#xff0c;即虚拟现实(Virtual Reality)博物馆&#xff0c;是利用计算机技术、互联网和虚拟现实技术&#xff0c;将实体博物馆及其藏品数字化&#xff0c;实现在虚拟空间中的展示和体验的新型博物馆形式。概念起源于20世纪90年代末&…...

uniapp|实现多终端聊天对话组件、表情选择、消息发送

基于UniApp框架,实现跨平台多终端适配的聊天对话组件开发、表情选择交互设计及消息发送,支持文本与表情混合渲染。 目录 聊天界面静态组件实现消息列表布局消息气泡双向布局辅助元素定位与样式静态数据模拟与扩展性设计表情选择器静态模块浮层实现符号网格排列多端样式适配方…...

73页最佳实践PPT《DeepSeek自学手册-从理论模型训练到实践模型应用》

这份文档是一份关于 DeepSeek 自学手册的详细指南&#xff0c;涵盖了 DeepSeek V3 和 R1 模型的架构、训练方法、性能表现以及使用技巧等内容。它介绍了 DeepSeek V3 作为强大的 MoE 语言模型在数学、代码等任务上的出色表现以及其训练过程中的创新架构如多头潜在注意力和多 To…...

stm32 WDG看门狗

目录 stm32 WDG看门狗一、WDG基础知识1&#xff09;WDG&#xff08;Watchdog&#xff09;看门狗简介 二、IWDG独立看门狗1&#xff09;IWDG键寄存器2&#xff09;IWDG超时时间 三、WWDG窗口看门狗1&#xff09;WWDG框图2&#xff09;WWDG工作特性3&#xff09;WWDG超时时间4&am…...

BUUCTF——Cookie is so stable

BUUCTF——Cookie is so stable 进入靶场 页面有点熟悉 跟之前做过的靶场有点像 先简单看一看靶场信息 有几个功能点 flag.php 随便输了个admin 根据题目提示 应该与cookie有关 抓包看看 构造payload Cookie: PHPSESSIDef0623af2c1a6d2012d57f3529427d52; user{{7*7}}有…...

用go从零构建写一个RPC(仿gRPC,tRPC)--- 版本1(Client端)

这里我们来实现这个RPC的client端 为了实现RPC的效果&#xff0c;我们调用的Hello方法&#xff0c;即server端的方法&#xff0c;应该是由代理来调用&#xff0c;让proxy里面封装网络请求&#xff0c;消息的发送和接受处理。而上一篇文章提到的服务端的代理已经在.rpc.go文件中…...

一文读懂 AI

2022年11月30日&#xff0c;OpenAI发布了ChatGPT&#xff0c;2023年3月15日&#xff0c;GPT-4引发全球轰动&#xff0c;让世界上很多人认识了ai这个词。如今已过去快两年半&#xff0c;AI产品层出不穷&#xff0c;如GPT-4、DeepSeek、Cursor、自动驾驶等&#xff0c;但很多人仍…...

第三天 车联网云架构

一、车联网技术演进与行业变革 1.1 从传统Telematics到智能网联汽车 当我们驾驶着搭载智能网联系统的汽车时,车辆每秒会产生超过1GB的数据流量。这些数据包括: 高精度地图的实时更新ADAS传感器采集的环境信息车载娱乐系统交互数据车辆状态监控信息传统基于2G/3G的Telematic…...

【LeetCode Hot100 | 每日刷题】二叉树的层序遍历

题目&#xff1a; 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]]示例 2&a…...

Unity垃圾回收(GC)

1.GC的作用&#xff1a;定期释放不再使用的内存空间。 注&#xff1a;C不支持GC&#xff0c;需要手动管理内存&#xff0c;使用new&#xff08;&#xff09;申请内存空间&#xff0c;使用完后通过delete&#xff08;&#xff09;释放掉&#xff0c;但可能出现忘记释放或者指针…...

SpringBoot3集成Oauth2——1(/oauth2/token方法的升级踩坑)

备注&#xff1a;本文适用于你在SpringBoot2.7以前集成过oauth2&#xff0c;并且项目已经正式投入使用的情况&#xff0c;否则&#xff0c;我建议你直接学习或者找资料学习最新的oauth2集成&#xff0c;就不要纠结于老版本的oauth2。 原因&#xff1a;Spring Security 5.x和Sp…...

MySQL 索引与事务详解

目录 一、索引&#xff08;Index&#xff09; 二、事务&#xff08;Transaction&#xff09; 三、总结 一、索引&#xff08;Index&#xff09; 索引的本质&#xff1a;一种数据结构&#xff08;如 BTree、Hash&#xff09;&#xff0c;用于快速定位数据&#xff0c;避免全…...

基于Qt开发的多线程TCP服务端

目录 一、Qt TCP服务端开发环境准备1. 项目配置2. 核心类说明 二、服务端搭建步骤详解步骤1&#xff1a;初始化服务端对象步骤2&#xff1a;启动端口监听步骤3&#xff1a;处理客户端连接 三、数据通信与状态管理1. 数据收发实现2. 客户端状态监控 四、进阶功能扩展1. 多客户端…...

【Debian】关于LubanCat-RK3588s开发板安装Debian的一些事

琐碎的事问题不少&#xff0c;甚至一度让我以为核心坏了 按照指引烧录完Debian11-gnome镜像后启动&#xff0c;此时输出的分辨率不一定匹配显示器&#xff0c;进而导致黑屏&#xff0c;此时需要使用MobaXterm的串口终端以运行一些指令&#xff0c;下载链接用xrandr指令查看显示…...

Python爬虫实战:研究网站动态滑块验证

1. 引言 1.1 研究背景与意义 在当今信息时代,Web 数据的价值日益凸显。通过爬虫技术获取公开数据并进行分析,能够为企业决策、学术研究等提供有力支持。然而,为了防止数据被恶意爬取,许多网站采用了各种反爬机制,其中动态滑块验证是一种常见且有效的方式。动态滑块验证通…...

Centos离线安装mysql、redis、nginx等工具缺乏层层依赖的解决方案

Centos离线安装mysql、redis、nginx等工具缺乏层层依赖的解决方案 引困境yum-utils破局 引 前段时间&#xff0c;有个项目有边缘部署的需求&#xff0c;一台没有的外网的Centos系统服务器&#xff0c;需要先安装jdk&#xff0c;node&#xff0c;mysql&#xff0c;reids&#xf…...

从零开始开发纯血鸿蒙应用之XML解析

从零开始开发纯血鸿蒙应用 〇、前言一、鸿蒙SDK中的 XML API1、ohos.xml2、ohos.convertxml 三、XML 解析实践1、源数据结构2、定义映射关系3、定义接收对象4、获取文章信息 四、总结 〇、前言 在前后端的数据传输方面&#xff0c;论格式化形式&#xff0c;JSON格式自然是首选…...

10.王道_HTTP

1. 互联网时代的诞生 2. HTTP的基本特点 2.1客户端-服务端模型 2.2 无状态协议 2.3 可靠性 2.4 文本协议 3. HTML,CSS和JS 4. HTTP的各个组件 4.1 客户端 4.2 服务端 4.3 代理 5. URI和URL 6. HTTP报文 HTTP报文分为两种——请求报文和响应报文。 6.1 GET请求示例 注意&#…...

解决stm32HAL库使用vscode打开,识别不到头文件及uint8_t等问题

解决stm32HAL库使用vscode打开&#xff0c;识别不到头文件及uint8_t等问题 结论&#xff0c;问题有2问题1问题2解决办法将Keil Assistant自动生成的.vscode目录复制到MDK-ARM上层目录将Keil Assistant自动生成的.vscode目录复制到MDK-ARM上层目录将Keil Assistant自动生成的.vs…...

Docker Compose 完全指南:从入门到生产实践

Docker Compose 完全指南&#xff1a;从入门到生产实践 1. Docker Compose 简介与核心价值 Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过一个 YAML 文件来配置应用的服务&#xff0c;只需简单命令就能创建和启动所有服务。 核心优势&#xff1a;…...

Android Framework 记录之一

1、下载源码,目录如下: 2、Android系统的层次如下: 3、项目目录简单分析如下: 4、telphony目录 文件描述CellIdentityCdma...

uniapp-商城-50-后台 商家信息(输入进行自定义规则验证)

本文介绍了如何在后台管理系统中添加和展示商家信息&#xff0c;包括商家logo、名称、电话、地址和介绍等内容&#xff0c;并支持后期上传营业许可等文件。通过使用uni-app的uni-forms组件&#xff0c;可以方便地实现表单的创建、校验和管理操作。文章详细说明了组件的引入、页…...

XSS ..

Web安全中的XSS攻击详细教学&#xff0c;Xss-Labs靶场通关全教程&#xff08;建议收藏&#xff09; - 白小雨 - 博客园跨站脚本攻击&#xff08;XSS&#xff09;主要是攻击者通过注入恶意脚本到网页中&#xff0c;当用户访问该页面时&#xff0c;恶意脚本会在用户的浏览器中执行…...

网页版部署MySQL + Qwen3-0.5B + Flask + Dify 工作流部署指南

1. 安装MySQL和PyMySQL 安装MySQL # 在Ubuntu/Debian上安装 sudo apt update sudo apt install mysql-server sudo mysql_secure_installation# 启动MySQL服务 sudo systemctl start mysql sudo systemctl enable mysql 安装PyMySQL pip install pymysql 使用 apt 安装 My…...

WEBSTORM前端 —— 第2章:CSS —— 第8节:网页制作2(小兔鲜儿)

目录 1.项目目录 2.SEO 三大标签 3.Favicon 图标 4.版心 5.快捷导航(shortcut) 6.头部(header) 7.底部(footer) 8.banner 9.banner – 圆点 10.新鲜好物(goods) 11.热门品牌(brand) 12.生鲜(fresh) 13.最新专题(topic) 1.项目目录 【xtx-pc】 ima…...

仓储车间安全革命:AI叉车防撞装置系统如何化解操作风险

在现代物流体系中&#xff0c;仓储承担着货物储存、保管、分拣和配送等重要任务。但现代仓储行业的安全现状却不容乐观&#xff0c;诸多痛点严重制约着其发展&#xff0c;其中叉车作业的安全问题尤为突出。相关数据显示&#xff0c;全球范围内&#xff0c;每年因叉车事故导致的…...

gin + es 实践 08

自动扩缩容 本文档详细介绍如何在Kubernetes环境中实现Go-ES应用的自动扩缩容&#xff0c;包括水平Pod自动扩缩容(HPA)、垂直Pod自动扩缩容(VPA)和集群自动扩缩容。 1. 自动扩缩容概述 自动扩缩容是指根据负载变化自动调整计算资源的过程&#xff0c;主要目标是&#xff1a;…...

在Postman中高效生成测试接口:从API文档到可执行测试的完整指南

引言 在API开发与测试流程中,Postman是一款高效的工具,能将API文档快速转化为可执行的测试用例。本文以《DBC协议管理接口文档》为例,详细讲解如何通过Postman实现接口的创建、配置、批量生成及自动化测试,帮助开发者和测试人员提升效率,确保接口质量。 一、准备工作:理…...