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;会如何思考并回答用户呢&…

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;特别是荣获国家科技进步奖的领军人物顾炯炯博士及其团队的主导下精心研发…

通过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;并且两个皇后棋子之间不能相互攻击。编写个…

基于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…

宝塔部署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 …

ARM单片机的内存分布(重要)

ARM单片机的内存分布&#xff08;重要&#xff09; 一、S32K344的内存布局 MEMORY {int_pflash : ORIGIN 0x00400000, LENGTH 0x003D4000 /* 4096KB - 176KB (sBAF HSE)*/int_dflash : ORIGIN 0x10000000, LENGTH 0x00020000 /* 128KB …

BUUCTF [SCTF2019]电单车详解两种方法(python实现绝对原创)

使用audacity打开&#xff0c;发现是一段PT2242 信号 PT2242信号 有长有短&#xff0c;短的为0&#xff0c;长的为1化出来 这应该是截获电动车钥匙发射出的锁车信号 0 01110100101010100110 0010 0前四位为同步码0 。。。中间这20位为01110100101010100110为地址码0010为功…

不靠学历,不拼年资,怎么才能月入2W?

之前统计局发布了《2023年城镇单位就业人员年平均工资情况》&#xff0c;2023年全国城镇非私营单位和私营单位就业人员年平均工资分别为120698元和68340元。也就是说在去年非私营单位就业人员平均月薪1W&#xff0c;而私营单位就业人员平均月薪只有5.7K左右。 图源&#xff1a;…

两数之和、三数之和、四数之和

目录 两数之和 题目链接 题目描述 思路分析 代码实现 三数之和 题目链接 题目描述 思路分析 代码实现 四数之和 题目链接 题目描述 思路分析 代码实现 两数之和 题目链接 LCR 179. 查找总价格为目标值的两个商品 - 力扣&#xff08;LeetCode&#xff09; 题目…

EfficientFormer实战:使用EfficientFormerV2实现图像分类任务(一)

摘要 EfficientFormerV2是一种通过重新思考ViT设计选择和引入细粒度联合搜索策略而开发出的新型移动视觉骨干网络。它结合了卷积和变换器的优势&#xff0c;通过一系列高效的设计改进和搜索方法&#xff0c;实现了在移动设备上既轻又快且保持高性能的目标。这一成果为在资源受…

Redis-01 入门和十大数据类型

Redis支持两种持久化方式&#xff1a;RDB持久化和AOF持久化。 1.RDB持久化是将Redis的数据以快照的形式保存在磁盘上&#xff0c;可以手动触发或通过配置文件设置定时触发。RDB保存的是Redis在某个时间点上的数据快照&#xff0c;可以通过恢复RDB文件来恢复数据。 2.AOF持久化…

力扣P1706全排列问题 很好的引入暴力 递归 回溯 dfs

代码思路是受一个洛谷题解里面大佬的启发。应该算是一个dfs和回溯的入门题目&#xff0c;很好的入门题目了下面我会先给我原题解思路我想可以很快了解这个思路。下面是我自己根据力扣大佬写的。 我会进行详细讲解并配上图辅助理解大家请往下看 #include<iostream> #inc…

初始MYSQL数据库(7)—— 视图

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; MYSQL 引言 前面我们学习MySQL数据库时&#xff0c;创建表之后&#xff0c;会在表中插入数据&#xff0c;在需要的时候&#xff0c;也会进行…