在使用 MyBatis 开发项目时,Mapper 接口是为数据库操作提供最直观的方法,但在实现方式上,我们有两种选择:全注解模式和混合模式。那么,他们有什么区别,应该如何选择?我们一起来讨论一下。

一、全注解模式

全注解模式,两个字:直接。不过在 Mapper 接口中加上注解,将数据库操作直接通过 SQL 语句控制,想查询就用 @Select,想插入就用 @Insert,完全是一样的操作体验。

实现样例

这里有一个基础的用户操作 Mapper:

@Mapper
publicinterfaceUserMapper {@Insert("INSERT INTO user (username, password, role) VALUES (#{username}, #{password}, #{role})")@Options(useGeneratedKeys = true, keyProperty = "id")voidinsertUser(User user);@Select("SELECT * FROM user WHERE username = #{username}")User findByUsername(String username);@Update("UPDATE user SET password = #{password} WHERE id = #{id}")voidupdatePassword(@Param("id") Integer id, @Param("password") String password);
}
优势
  • • 文件构成简单,文件自带直观性。

  • • SQL 语句在全注解模式下直观且清晰,这种方式能够减少错误的发生,尤其是在接口简单、逻辑清晰的情况下。

  • • 适合小应用或数据库表规模较简单的场景。

不足
  • • SQL 语句直接嵌入代码中,容易导致代码臃肿:当查询逻辑变复杂时,大量 SQL 会堆积在接口文件中,导致文件过长且难以维护。

  • • 扩展性差:复杂的查询条件需要硬编码在注解中,无法灵活调整,尤其对于需要动态拼接 SQL 的场景显得力不从心。

  • • 团队协作时难以分工:开发人员需要同时熟悉 SQL 和 Java,且 SQL 的变更可能需要修改接口文件,增加沟通成本。

二、混合模式

混合模式,是使用“接口声明 + XML 配置文件”的方式实现。Mapper 接口直接定义操作类型,而 SQL 语句则存在于配置文件中

实现样例

一个复杂旅游线路查询 Mapper:

@Mapper
publicinterfaceTourLineMapper {List<TourLine> filterTourLines(@Param("destination") String destination,@Param("minPrice") Double minPrice,@Param("maxPrice") Double maxPrice,@Param("minDuration") Integer minDuration,@Param("maxDuration") Integer maxDuration);
}

优势体现在 XML 配置文件中:

<selectid="filterTourLines"parameterType="map"resultType="TourLine">SELECT * FROM tour_lineWHERE 1 = 1<iftest="destination != null">AND destination = #{destination}</if><iftest="minPrice != null">AND price >= #{minPrice}</if><iftest="maxPrice != null">AND price <= #{maxPrice}</if><iftest="minDuration != null">AND duration >= #{minDuration}</if><iftest="maxDuration != null">AND duration <= #{maxDuration}</if>
</select>

结构解读

<select> 标签
  • • 定义了一个 filterTourLines 查询方法,与 Java 中的接口方法对应。

  • • parameterType="map" 指定了传入的参数类型是一个 Map(常见场景中,通过 @Param 传递多个参数时,MyBatis 会将其转换为 Map)。

  • • resultType="TourLine" 定义了查询结果的返回类型为 TourLine 对象。

WHERE 1 = 1

这是一种防止 SQL 拼接错误的技巧,为后续条件拼接提供基础,即使没有后续条件,SQL 也不会因为没有 WHERE 子句而报错。

动态条件(<if> 标签)

<if> 是 MyBatis 动态 SQL 的重要组成部分,用于判断条件是否为 true,从而决定是否拼接该部分 SQL。

例如:

<iftest="destination != null">AND destination = #{destination}</if>

如果 destination 参数不为空,就会将 AND destination = #{destination} 拼接到最终的 SQL 语句中。

参数替换

每个条件中的 #{} 会被传入的参数动态替换为具体值,保证查询的安全性,防止 SQL 注入。

编写技巧

SQL 拼接优雅性

使用 <if> 标签时,可以避免在 Java 代码中手动拼接 SQL,提高代码的可读性和维护性。

参数命名一致性

确保 XML 文件中的参数名称与 Java 接口方法中 @Param 注解指定的名称一致,否则会导致参数映射失败。

灵活性

如果需要更多动态条件,比如基于某个字段的排序,可以在<if>标签外部增加 <choose> <when>标签实现更复杂的逻辑。

例如:

<choose><whentest="sortField != null and sortDirection != null">ORDER BY ${sortField} ${sortDirection}</when><otherwise>ORDER BY id ASC</otherwise>
</choose>
适用场景

这段动态 SQL 非常适合以下场景:

  • • 参数较多且查询条件可能动态变化,比如多字段过滤、范围查询等。

  • • 查询的复杂度较高,不适合直接写在 Java 中,分离到 XML 更易维护。

优势
  • • 加强了 SQL 实现的优雅性: 复杂的查询可以在 XML 文件中通过加入条件转换,条件拼接更加灵活,避免硬编码。

  • • 分离关注点,降低耦合: Java 和 SQL 各司其职,Java 专注业务逻辑,SQL 专注数据操作,改动时互不干扰。

  • • 适合复杂查询与大项目: 对于动态查询需求较高的大型项目,混合模式显得尤为重要,XML 配置文件支持强大的动态 SQL 功能(如 <if><choose> 等)。

不足
  • • 学习成本较高: 需要同时掌握接口声明和 XML 文件配置的语法,对初学者来说可能较难上手。

  • • 文件分散,调试不便: SQL 语句分散在 XML 文件中,可能导致维护时需要在多个文件间切换。

  • • 开发速度稍慢: 相比全注解模式,混合模式的开发速度会稍有降低,尤其是在小型项目中。

三、如何选择?

  • • 如果你的项目规模较小,数据表结构简单,查询逻辑以基础的增删改查为主,可以选择全注解模式。它能够快速上手,开发效率高,适合对时间要求较高的场景。

  • • 如果你的项目规模较大,查询逻辑复杂且动态变化较多,建议选择混合模式。它的灵活性和可维护性更强,能够为复杂需求提供更好的支持。

  • • 团队协作时,混合模式的分离设计可以降低沟通成本,尤其对于 SQL 改动频繁的项目。

无论选择哪种模式,最重要的是根据项目需求灵活运用,选择最适合自己团队和业务的方式。

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

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

相关文章

WS2812灯带效果设计器上位机

软件使用方法介绍&#xff1a;bilibili地址 【免写单片机代码WS2812灯带效果设计软件-哔哩哔哩】 https://b23.tv/xFhxMGm

Docker 容器(二)

Docker四、Docker容器数据卷1.数据卷的主要特点2.卷的共享与继承&#xff08;1&#xff09;卷的共享&#xff08;Sharing&#xff09;(2) 卷的继承&#xff08;Inheritance&#xff09;3.数据卷运行实例五、Dockerfile1.Dockerfile2. 创建一个名为 myubuntu的自定义镜像第 1 步…

PCB基础细节--工艺篇

pcb基础细节&#xff08;工艺篇&#xff09; 1. 孔与焊盘2. PCB各层之间的作用3. 阻抗匹配 3.1. 什么是传输线&#xff1f;我们只看特性阻抗&#xff0c;时延以后再说。 在画原理图时&#xff0c;我们把电阻&#xff0c;电容&#xff0c;电感是抽象成一个点了。两边加一个电压&…

信创服务器总死机原因及解决办法

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01;最近有个项目使用信创的服务器&#xff0c;总是出现死机的情况&#xff0c;联系厂家检查了一下&#xff0c;说是沐创网卡固件较低造成的&#xff0c;让移除网卡或升级固件尝试一下。记得5月份按厂家的说法处理过一台&am…

03_网关ip和端口映射(路由器转发)操作和原理

网关ip和端口映射&#xff08;路由器转发&#xff09;操作和原理IP 与端口映射配置全指南&#xff1a;2 种方案搞定外网访问内网一、先搞懂&#xff1a;为什么需要 IP 与端口映射&#xff1f;二、方案一&#xff1a;路由器端口映射&#xff08;适合有公网 IP&#xff0c;长期稳…

「数据获取」《安徽建设统计年鉴》(2002-2007)(2004、2006缺失)(获取方式看绑定的资源)

01、数据简介《安徽建设统计年鉴》是一部全方位反映安徽省建设事业发展变迁的重要统计资料著作。该书系统收集并精心整理了 2006 年度安徽省城乡建设领域的核心统计数据&#xff0c;涵盖城乡建设固定资产投资、建筑业发展态势、城镇建设推进情况等多个关键方面&#xff0c;为政…

Python/JS/Go/Java同步学习(第一篇)格式化/隐藏参数一锅端 四语言输出流参数宇宙(附源码/截图/参数表/避坑指南/老板沉默术)

&#x1f91d; 免骂声明&#xff1a; 本文四语言输出流参数经本蜀黎实战整理&#xff0c;旨在提供快速参考指南&#x1f4dd;因各语言版本迭代及不同系统环境差异&#xff0c;偶尔可能出现整理不全面之处&#xff0c;实属正常✅欢迎理性交流补充&#xff0c;喷子勿喷——毕竟你…

人工智能助力流感疫苗选择:MIT 团队推出 VaxSeer 系统

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

使用 qmake 生成 Makefile,Makefile 转换为 Qt 的 .pro 文件

使用 qmake 生成 Makefile 的完整指南 qmake 是 Qt 提供的构建工具&#xff0c;用于从 .pro 项目文件生成 Makefile。以下是详细的使用方法&#xff1a; 基本使用方法 1. 从 .pro 文件生成 Makefile bash qmake -o Makefile your_project.pro2. 直接运行 qmake&#xff08;自动…

利用DeepSeek编写验证xlsx格式文件中是否启用sharedStrings.xml对读写效率影响python程序

让他分别用100*10000个单元格有100、1000、10000个不同的1-200字符长的大写英文字母字符串测试. 一开始DeepSeek没有找到启用sharedStrings.xml的写xlsx模块&#xff0c;我自己找了pyxlsbwriter的例子告诉他才改好的。 import os import time import random import string impo…

【C++框架#2】gflags 和 gtest 安装使用

spdlog 安装和使用 1. 概述 介绍&#xff1a;spdlog 是一个高性能、超快速、零配置的 C 日志库&#xff0c;它旨在提供简洁的 API 和丰富的功能&#xff0c;同时保持高性能的日志记录。它支持多种输出目标、格式化选项、线程安全以及异步日志记录。 github 链接&#xff1a;htt…

平衡掌控者-游戏数值战斗设计

一、有效生命值1、计算公式有效生命生命值/&#xff08;1-伤害减免率&#xff09;/&#xff08;1-闪避率&#xff09;2、前摇和后摇对数值来说&#xff0c;战斗由两大模块组成&#xff0c;一个是战斗公式生效前的战斗攻击流程&#xff0c;一个是战斗公式与自身流程。比如说&…

使用DataLoader加载本地数据 食物分类案例

目录 一.食物分类案例 1..整合训练集测试集文档 2.导入相关的库 3.设置图片数据的格式转换 3.数据处理 4.数据打包 5.定义卷积神经网络 6.创建模型 7.训练和测试方法定义 8.损失函数和优化器 9.训练模型&#xff0c;测试准确率 10.测试模型 之前我们DataLoader加载…

从零开始的python学习——函数(2)

ʕ • ᴥ • ʔ づ♡ど &#x1f389; 欢迎点赞支持&#x1f389; 个人主页&#xff1a;励志不掉头发的内向程序员&#xff1b; 专栏主页&#xff1a;python学习专栏&#xff1b; 文章目录 前言 一、变量作用域 二、函数执行过程 三、链式调用 四、嵌套调用 五、函数递归 六、…

RAG 的完整流程是怎么样的?

RAG&#xff08;检索增强生成&#xff09;的完整流程可分为5个核心阶段&#xff1a;数据准备&#xff1a;清洗文档、分块处理&#xff08;如PDF转文本切片&#xff09;&#xff1b;向量化&#xff1a;使用嵌入模型&#xff08;如BERT、BGE&#xff09;将文本转为向量&#xff1…

研发文档版本混乱的根本原因是什么,怎么办

研发文档版本混乱的根本原因通常包括缺乏统一的版本控制制度、团队协作不畅、文档管理工具使用不当以及项目需求频繁变化等因素。这些问题使得研发团队在日常工作中容易出现文档版本混乱的情况&#xff0c;导致信息的不一致性、沟通不畅以及开发进度的延误。为了解决这一问题&a…

ChartView的基本使用

Qt ChartView&#xff08;准确类名 QChartView&#xff09;是 Qt Charts 模块里最常用的图表显示控件。一句话概括&#xff1a;“它把 QChart 画出来&#xff0c;并自带缩放、平移、抗锯齿等交互能力”。QML ChartView 简介&#xff08;一句话先记住&#xff1a;ChartView 是 Q…

系统扩展策略

1、核心指导思想&#xff1a;扩展立方体 在讨论具体策略前&#xff0c;先了解著名的扩展立方体&#xff08;Scale Cube&#xff09;&#xff0c;它定义了三种扩展维度&#xff1a; X轴&#xff1a;水平复制&#xff08;克隆&#xff09; 策略&#xff1a;通过负载均衡器&#…

HBuilder X 4.76 开发微信小程序集成 uview-plus

简介 本文记录了在HBuilder中创建并配置uni-app项目的完整流程。 首先创建项目并测试运行&#xff0c;确认无报错后添加uView-Plus组件库。 随后修改了main.js、uni.scss、App.vue等核心文件&#xff0c;配置manifest.json并安装dayjs、clipboard等依赖库。 通过调整vite.c…

第4章:内存分析与堆转储

本章概述内存分析是 Java 应用性能调优的核心环节之一。本章将深入探讨如何使用 VisualVM 进行内存分析&#xff0c;包括堆内存监控、堆转储生成与分析、内存泄漏检测以及内存优化策略。通过本章的学习&#xff0c;你将掌握识别和解决内存相关问题的专业技能。学习目标理解 Jav…