MyBatis-Mapper 接口与 XML 映射

MyBatis 是一款流行的持久层框架,提供了对 SQL 语句的良好支持和灵活的配置方式。在 MyBatis 中,可以通过两种方式进行 SQL 映射:Mapper 接口XML 映射。这两种方式各有优劣,灵活的使用能够满足不同的开发需求。

一、MyBatis 的核心概念

在讨论 Mapper 接口和 XML 映射之前,首先需要了解 MyBatis 的几个核心概念:

  1. SqlSession:这是 MyBatis 的核心接口,用于执行 SQL 操作,包括插入、更新、删除和查询。
  2. Mapper:Mapper 是一个接口或者 XML 文件,用于定义 SQL 语句与 Java 方法的映射关系。
  3. XML 映射文件:这是 MyBatis 中一种配置 SQL 语句的方式,通常通过 XML 文件将 SQL 与 Java 对象进行映射。
  4. 动态 SQL:MyBatis 支持动态 SQL,通过 XML 中的标签(如 <if><choose><foreach>)来动态生成 SQL 语句。

二、Mapper 接口映射

1. 什么是 Mapper 接口

Mapper 接口是一种直接使用 Java 接口与 SQL 语句进行绑定的方式。Mapper 接口允许我们通过编写接口的方法名,来代替传统的手写 SQL 代码,使得开发更加简洁。MyBatis 会根据方法签名自动匹配 SQL 语句,并返回结果。

2. Mapper 接口示例

假设我们有一个 User 实体类,包含 idnameemail 属性。可以通过定义一个 UserMapper 接口来操作用户数据表。

public interface UserMapper {// 查询所有用户List<User> findAllUsers();// 根据 ID 查询用户User findUserById(int id);// 插入新用户void insertUser(User user);// 更新用户void updateUser(User user);// 删除用户void deleteUser(int id);
}
3. 使用注解实现 SQL 映射

在 Mapper 接口中,我们可以直接使用注解来实现 SQL 语句的映射,避免使用 XML 文件。MyBatis 提供了多种注解,如 @Select@Insert@Update@Delete,用于声明 SQL 语句。

public interface UserMapper {@Select("SELECT * FROM users")List<User> findAllUsers();@Select("SELECT * FROM users WHERE id = #{id}")User findUserById(int id);@Insert("INSERT INTO users(name, email) VALUES(#{name}, #{email})")void insertUser(User user);@Update("UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}")void updateUser(User user);@Delete("DELETE FROM users WHERE id = #{id}")void deleteUser(int id);
}

通过注解方式,SQL 语句直接在 Java 接口中编写,简单直观,适合小型项目或简单 SQL 语句的情况。

4. 优点与缺点

优点

  • 开发简单,不需要 XML 配置文件。
  • 代码与 SQL 语句紧密结合,便于理解和维护。
  • 避免了大量的配置文件,代码更简洁。

缺点

  • 当 SQL 语句较为复杂时,代码会显得繁杂,难以维护。
  • 不易复用 SQL 片段,尤其是涉及到动态 SQL 的时候,注解方式会显得冗长。
  • 注解不适合处理长篇 SQL 查询,尤其是多表关联查询。

三、XML 映射

1. 什么是 XML 映射

XML 映射是 MyBatis 中更传统的方式,它通过 XML 文件来编写 SQL 语句,将 SQL 与 Mapper 接口的方法进行绑定。XML 映射提供了更强的灵活性,特别是对于动态 SQL 以及复杂查询的情况,更加清晰易维护。

2. XML 映射示例

继续以 User 实体类为例,首先需要定义 UserMapper.xml 文件,并在其中编写 SQL 语句。

UserMapper.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.mapper.UserMapper"><!-- 查询所有用户 --><select id="findAllUsers" resultType="User">SELECT * FROM users</select><!-- 根据 ID 查询用户 --><select id="findUserById" parameterType="int" resultType="User">SELECT * FROM users WHERE id = #{id}</select><!-- 插入新用户 --><insert id="insertUser" parameterType="User">INSERT INTO users (name, email)VALUES (#{name}, #{email})</insert><!-- 更新用户 --><update id="updateUser" parameterType="User">UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}</update><!-- 删除用户 --><delete id="deleteUser" parameterType="int">DELETE FROM users WHERE id = #{id}</delete></mapper>

在上述 XML 文件中:

  • <select> 标签用于定义查询语句。
  • <insert> 标签用于插入数据。
  • <update><delete> 分别用于更新和删除操作。
  • #{} 用于参数占位符,它会自动将 Java 对象的属性值映射到 SQL 中。
3. Mapper 接口与 XML 的绑定

在使用 XML 映射时,我们需要在 UserMapper 接口中定义方法,但不需要为这些方法添加注解。MyBatis 会自动将接口与对应的 XML 映射文件关联。

public interface UserMapper {List<User> findAllUsers();User findUserById(int id);void insertUser(User user);void updateUser(User user);void deleteUser(int id);
}

MyBatis 会根据方法名自动匹配 XML 中的 SQL 语句,并执行相应的数据库操作。

4. 动态 SQL

动态 SQL 是 XML 映射的一大优势。MyBatis 提供了丰富的动态 SQL 支持,可以根据传入的参数动态生成 SQL 语句。例如,使用 <if> 标签进行条件判断:

<select id="findUsers" resultType="User">SELECT * FROM users<where><if test="name != null">AND name = #{name}</if><if test="email != null">AND email = #{email}</if></where>
</select>

这种动态 SQL 的生成方式对于处理复杂查询非常有用,并且在 XML 中更加清晰、灵活。

5. 优点与缺点

优点

  • 动态 SQL 支持非常强大,适合复杂查询场景。
  • SQL 与 Java 代码分离,保持代码简洁。
  • 易于维护和扩展,特别是在大型项目中,SQL 语句的复用和优化更加方便。

缺点

  • 需要编写和维护额外的 XML 文件。
  • SQL 与 Java 代码分离,可能不直观,尤其对初学者而言,调试较为麻烦。
  • 相比注解方式,开发效率较低,尤其是简单的 CRUD 操作时。

四、选择 Mapper 接口与 XML 映射

在实际开发中,如何选择使用 Mapper 接口还是 XML 映射,取决于项目的需求和开发习惯。

1. 使用 Mapper 接口的场景
  • 当 SQL 语句比较简单,主要是 CRUD 操作时,使用注解更直观,开发效率较高。
  • 小型项目或模块,SQL 不复杂时,可以避免编写额外的 XML 文件,提升开发速度。
2. 使用 XML 映射的场景
  • SQL 语句比较复杂,尤其是涉及动态 SQL 或多表关联时,XML 映射更清晰易维护。
  • 大型项目,SQL 逻辑复杂,且需要 SQL 优化和复用时,XML 更加灵活和便于管理。
  • 需要生成动态 SQL 语句时,XML 的标签支持比注解更强大。

五、总结

MyBatis 提供了两种主要的 SQL 映射方式:Mapper 接口和 XML 映射。Mapper 接口通过注解方式使得简单的 CRUD 操作更简洁易用,而 XML 映射则提供了强大的动态 SQL 支持,适合复杂查询的场景。

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

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

相关文章

[uni-app]小兔鲜-02项目首页

轮播图 轮播图组件需要在首页和分类页使用, 封装成通用组件 准备轮播图组件 <script setup lang"ts"> import type { BannerItem } from /types/home import { ref } from vue // 父组件的数据 defineProps<{list: BannerItem[] }>()// 高亮下标 const…

【React】Ant Design 5.x版本drawer抽屉黑边问题

环境 antd: ^5.14.1react: ^18 问题情况 <Drawer open{open} closable{false} mask{false} width{680}getContainer{props.getContainer || undefined}><p>Some contents...</p><p>Some contents...</p><p>Some contents...</p> …

时序数据库 TDengine 的入门体验和操作记录

时序数据库 TDengine 的学习和使用经验 什么是 TDengine &#xff1f;什么是时序数据 &#xff1f;使用RPM安装包部署默认的网络端口 TDengine 使用TDengine 命令行&#xff08;CLI&#xff09;taosBenchmark服务器内存需求删库跑路测试 使用体验文档纠错 什么是 TDengine &…

OpenAI GPT o1技术报告阅读(2)- 关于模型安全性的测试案例

✨报告阅读&#xff1a;使用大模型来学习推理(Reason) 首先是原文链接&#xff1a;https://openai.com/index/learning-to-reason-with-llms/ 接下来我们看一个简单的关于模型安全性的测试&#xff0c;当模型被问到一个有风险的话题时&#xff0c;会如何思考并回答用户呢&…

深度学习:数据增强

目录 前言 一、为什么要使用数据增强&#xff1f; 二、数据增强有哪些方法&#xff1f; 1. 几何变换 2. 颜色变换 3. 噪声添加 4. 裁剪 5. 混合技术 6. 其他方法 三、代码实现 前言 数据增强是深度学习中常用的一种技术&#xff0c;旨在通过对训练数据进行各种变换来…

C++ | Leetcode C++题解之第421题数组中两个数的最大异或值

题目&#xff1a; 题解&#xff1a; struct Trie {// 左子树指向表示 0 的子节点Trie* left nullptr;// 右子树指向表示 1 的子节点Trie* right nullptr;Trie() {} };class Solution { private:// 字典树的根节点Trie* root new Trie();// 最高位的二进制位编号为 30static…

【linux】gcc makefile

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;linux笔记仓 目录 01.gcc如何完成02.gcc选项03.函数库与动静态链接静态链接动态链接库文件特点和用途动态链接版本和兼容性 04.makefile自动推导 01.gcc如何完成 预处理(进行宏替换) 预处理功能主要…

828华为云征文|使用Flexus X实例创建FDS+Nginx服务实现图片上传功能

一、Flexus X实例 什么是Flexus X实例呢&#xff0c;这是华为云最新推出的云服务器产品&#xff0c;如下图&#xff1a; 华为云推出的Flexus云服务器X系列&#xff0c;是在华为顶尖技术团队&#xff0c;特别是荣获国家科技进步奖的领军人物顾炯炯博士及其团队的主导下精心研发…

EventSource 和 WebSocket的区别

EventSource 和 WebSocket 都是用于在客户端和服务器之间进行实时通信的技术&#xff0c;但它们之间存在一些区别&#xff1a; 一、连接方式 EventSource&#xff1a; 建立连接相对简单&#xff0c;客户端通过向服务器发送一个 HTTP 请求来初始化连接&#xff0c;请求的 URL 指…

Verilog学习之旅~

记录Verilog的学习日常~ 第一阶段&#xff1a;牛客网刷题 1.Verilog快速入门 基础语法 VL1:四选一多路器&#xff1a;case语句、条件表达符&#xff1b; VL2:异步复位的串联T触发器:T触发器的基本功能及代码实现、异步复位的概念&#xff1b; VL3:奇偶校验&#xff1a;缩…

spring boot导入多个配置文件

1、简介 Spring Boot从2.4.x版本开始支持了导入文件的方式来加载配置参数&#xff0c;与spring.config.additional-location不同的是不用提前设置而且支持导入的文件类型相对来说要丰富很多。 我们只需要在application.properties/application.yml配置文件中通过spring.config.…

通过document获取节点元素

1.层级节点 <ul><li id"li1">1</li><li>2</li><li id"li3">3</li><li>4</li><li>5</li></ul><script>//获取id名为li1的元素赋值给li1let li1document.getElementById(li…

Java语言程序设计基础篇_编程练习题**18.34 (游戏:八皇后问题)

目录 题目&#xff1a;**18.34 (游戏:八皇后问题) 代码示例 代码解析 输出结果 使用文件 题目&#xff1a;**18.34 (游戏:八皇后问题) 八皇后问题是要找到一个解决方案&#xff0c;将一个皇后棋子放到棋盘上的每行中&#xff0c;并且两个皇后棋子之间不能相互攻击。编写个…

Oracle Truncate和delete的区别

DropTruncatedelete语句类型 DDl &#xff08;数据定义语言 Data Definition Language DDl &#xff08;数据定义语言 Data Definition Language DML&#xff08;数据操作语言 Data Manipulation Language 速度 快 删除整个表 快 一次性删除 慢 逐行删除 回滚不可不可可del…

基于C#+SQL Server2005(WinForm)图书管理系统

图书管理系统 一、 首先把数据库脚本贴出来(数据库名为library) USE [library] GO /****** Object: Table [dbo].[books] Script Date: 06/12/2016 11:27:12 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[books]([bNum] [nvarchar](10…

【python】利用python处理数据(stata等价命令)

1.一般运算 加法 # gen x y z df[x] df[y] df[z]减法 # gen x y - 1 df[x] df[y] - 1乘法 # gen var x * y df[var] df[x] * df[y]除法 # gen x z / y df[x] df[z] / df[y]取对数 # gen logx log(x) df[logx] np.log(df[x])开根号 # gen z sqrt(y) df[z] …

宝塔部署vue项目出现的各种问题

使用宝塔面板&#xff0c;网站页面&#xff0c;构建php静态网页 问题一&#xff1a;图片等静态资源无法加载 找到真正请求的url&#xff0c; 然后在项目目录下面创建对应的目录&#xff0c;将资源放入 问题二&#xff1a;刷新出现404 在这里任意位置添加 ## 添加上这个配…

socket.io-client实现实前后端时通信功能

这里我使用的后端 基于node.js的koa框架 前端使用的是vite {"name": "hou","version": "1.0.0","description": "","main": "app.js","scripts": {"test": "echo …

MongoDB-aggregate流式计算:去重操作

场景一&#xff1a;去重查询 在MongoDB的find查询里&#xff0c;可以直接使用distinct方法&#xff0c;但也有不少限制 在aggregate流式计算中&#xff0c;没有办法直接使用distinct方法&#xff0c;需要使用其他方法实现&#xff1a; 1、使用$group管道操作符&#xff0c;将需…

C语言中的typedef简介

type简介 在C语言中&#xff0c;typedef 是用于为现有的数据类型定义一个新的类型名称的关键字。它的作用是为类型取一个别名&#xff0c;使代码更简洁、更易于理解。 基本语法 typedef 原始类型 新类型名; 示例 为 int 类型定义一个别名&#xff1a; typedef int INTEGER…