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

SSM开发(二) MyBatis两种SQL配置方式及其对比

目录

一、MyBatis两种SQL配置方式

二、使用XML映射文件配置SQL语句

三、使用注解配置SQL语句

四、两种方式对比

总结

1、注解

2、XML配置

五、MyBatis多数据源的两种配置方式

参考


一、MyBatis两种SQL配置方式

MyBatis 提供了两种方式来配置SQL语句:注解(如 @Select)和XML映射文件。

  • 映射文件:通过XML文件来定义SQL语句和映射关系
  • 注解方式:通过在Java代码中使用注解来定义SQL语句和映射关系

二、使用XML映射文件配置SQL语句

在MyBatis中,SQL语句通常定义在XML文件中。例如,定义一个查询用户的SQL:

<!-- UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper"><select id="selectUser" parameterType="int" resultType="com.example.model.User">SELECT * FROM users WHERE id = #{id}</select>
</mapper>

注:parameterType属性指定了输入参数的类型,resultType属性指定了返回结果的类型

三、使用注解配置SQL语句

  • MyBatis 是一个 XML 驱动的框架。配置信息是基于 XML 的,而且映射语句也是定义在 XML 中的。MyBatis 3 以后,支持注解配置。注解配置基于配置 API;而配置 API 基于 XML 配置。

  • MyBatis 支持诸如 @Insert、@Update、@Delete、@Select、@Result 等注解。

使用@Select注解定义上述同样的查询用户的SQL:

package com.example.mapper;import com.example.model.User;
import org.apache.ibatis.annotations.Select;public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{id}")User selectUser(int id);
}

注:@Select注解用于定义SQL语句,其中#{id}表示一个占位符,用于在SQL执行时替换为方法参数id的值

四、两种方式对比

总结

  • 注解:适用于简单、直观的 SQL 语句,便于快速开发和维护,比如,团队对代码整洁度和维护性要求较高,且 SQL 语句相对简单的情况。
  • XML 配置方式:适用于大型项目或 SQL 语句特别复杂的情况,提供高灵活性和易于扩展的维护方式。

1、注解

优点

  • 简洁直观:SQL 语句直接写在注解中,与接口方法紧密结合,便于阅读和维护。
  • 编译时检查:注解中的 SQL 语句在编译时就能被检测到,减少运行时错误。
  • 减少配置文件:不需要额外的 XML 文件,减少了项目的复杂性。

缺点

  • 复杂 SQL 支持不足:对于动态 SQL 或特别复杂的 SQL 语句,注解方式可能显得力不从心。
  • 可读性问题:当 SQL 语句较长或包含复杂逻辑时,注解可能会使代码显得混乱。
  • 灵活性差:SQL 语句在注解中写死后,不易于动态修改或扩展。

2、XML配置

优点

  • 灵活性高:支持复杂的 SQL 语句和动态 SQL,易于管理和维护。
  • 分离职责:SQL 语句与 Java 代码分离,便于独立测试和修改(注: 这个可以理解为解耦,测如果测试环境想使用与生产环境不同的SQL,非常方便)。
  • 易于扩展:XML 文件可以方便地添加新的 SQL 语句,不影响现有代码。

缺点

  • 文件繁多:当项目规模较大时,可能需要管理大量的 XML 文件(注: 可以想一想,上百个文件,修改时非常麻烦)。
  • 阅读不便:需要在多个文件之间切换,不如注解方式直观。
  • 编译时检查不足:XML 文件中的错误通常只能在运行时被发现。

五、MyBatis多数据源的两种配置方式

同一个项目涉及到多个数据库,也就是多数据源。多数据源又可以分为两种情况:

1)两个或多个数据库没有相关性,各自独立,其实这种可以作为两个项目来开发。

2)两个或多个数据库是master-slave的关系,比如有mysql搭建一个 master-master,其后又带有多个slave;或者采用MHA搭建的master-slave复制;

MyBatis多数据源的配置主要有两种方式:

  • 通过@MapperScan注解,对不同包下的Mapper使用不同的sqlSessionFactory
  • 通过@MapperScan注解加自定义注解,对使用不同注解的Mapper使用不同的sqlSessionFactory

参考

https://www.jb51.net/article/152380.htm



MyBatis 3种 使用 SQL 语句的方式;注解方式、注解提供器方式、XML 配置方式 - del88 - 博客园

相关文章:

SSM开发(二) MyBatis两种SQL配置方式及其对比

目录 一、MyBatis两种SQL配置方式 二、使用XML映射文件配置SQL语句 三、使用注解配置SQL语句 四、两种方式对比 总结 1、注解 2、XML配置 五、MyBatis多数据源的两种配置方式 参考 一、MyBatis两种SQL配置方式 MyBatis 提供了两种方式来配置SQL语句&#xff1a;注解&a…...

【Redis】在ubuntu上安装Redis

文章目录 提权搜索软件包安装修改配置文件ip保护模式配置密码 重新启动服务器使用 redis 自带的客户端来连接服务器 提权 先切换到 root 用户,su 命令切换到 root. 搜索软件包 使用 apt 命令来搜索 redis 相关的软件包 apt search redis 安装 使用 apt 命令安装 redisapt …...

JS-Web API -day06

一、正则表达式 正则表达式测试工具: http://tool.oschina.net/regex 1.1 正则表达式介绍与语法 正则表达式&#xff1a; 正则表达式&#xff08;Regular Expression&#xff09;是用于匹配字符串中字符组合的模式。在 JavaScript中&#xff0c;正则表达式也是对象。通常用来查…...

JS-Web API -day03

一、事件流 1.1 事件流与两个阶段说明 事件流 指的是事件完整执行过程中的流动路径 假设页面有个div标签&#xff0c;当触发事件时&#xff0c;会经历两个阶段&#xff0c;分别是捕获阶段、冒泡阶段 捕获阶段&#xff1a;Document - Element html - Elementbody - Element div…...

进程优先级

基本概念 cpu资源分配的先后顺序&#xff0c;就是指进程的优先权&#xff08;priority&#xff09;。 优先权⾼的进程有优先执⾏权利。配置进程优先权对多任务环境的linux很有⽤&#xff0c;可以改善系统性能&#xff1b;还可以把进程运⾏到指定的CPU上&#xff0c;这样⼀来&…...

c语言(转义字符)

前言&#xff1a; 内容&#xff1a; 然后记一下转义字符 \? 在书写连续多个问号时使用&#xff0c;防止他们被解析成三字母词 \ 用于表示字符常量 \\ 用于表示一个反斜杠&#xff0c;防止他被解析为一个转义序列符 \n 换行 \r …...

easyexcel读取写入excel easyexceldemo

1.新建springboot项目 2.添加pom依赖 <name>excel</name> <description>excelspringboot例子</description><parent> <groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId&…...

【人工智能数学基础篇】——深入详解矩阵分解:奇异值分解(SVD)与主成分分析(PCA)在数据降维与特征提取中的应用

目录 1. 引言 2. 矩阵分解概述 2.1 矩阵分解的意义 3. 奇异值分解&#xff08;SVD&#xff09; 3.1 定义与数学基础 3.2 SVD 的性质 3.3 SVD 在数据降维中的应用 3.4 示例代码&#xff1a;使用 SVD 进行图像压缩 3.5 结果分析 4. 主成分分析&#xff08;PCA&#xff0…...

ThreeJS示例教程200+【目录】

Three.js 是一个强大的 JavaScript 库,旨在简化在网页上创建和展示3D图形的过程。它基于 WebGL 技术,但提供了比直接使用 WebGL 更易于使用的API,使得开发者无需深入了解 WebGL 的复杂细节就能创建出高质量的3D内容。 由于目前内容还不多,下面的内容暂时做一个占位。 文章目…...

DC-DC稳压电源——实战(基于Ti5450芯片)基础知识篇(1)

一&#xff1a;基础知识-耦合 1&#xff09;去耦电容 &#xff08;1&#xff09;耦合与去耦 耦合&#xff1a;系统内部的各个部分之间存在相互依赖、相互影响、相互制约的情况。用人话说就是不同部分之间的相互影响。 去耦&#xff1a;自然就是消除不同部分之间的影响了。 &…...

pyrender 渲染mesh

目录 render_meshes函数 调用函数 render_meshes函数 def overlay_human_meshes(humans, K, model, img_pil, unique_colorFalse):# Color of humans seen in the image._color [color[0] for _ in range(len(humans))] if unique_color else color# Get focal and princpt …...

防火墙安全策略

目录 一.拓扑信息 二.需求分析 三.命令行详细配置信息 1.配置IP 2.交换机配置 3.修改安全区域 4.安全策略 四.web界面详细配置 1.配置IP和设置安全区域 2.交换机配置 3.安全策略 五.测试 一.拓扑信息 二.需求分析 1.VLAN 2属于办公区域&#xff1b;VLAN 3属于生…...

selenium clear()方法清除文本框内容

在使用Selenium进行Web自动化测试时&#xff0c;清除文本框内容是一个常见的需求。这可以通过多种方式实现&#xff0c;取决于你使用的是哪种编程语言&#xff08;如Python、Java等&#xff09;以及你的具体需求。以下是一些常见的方法&#xff1a; 1. 使用clear()方法 clear…...

(回溯分割)leetcode93 复原IP地址

#include<iostream> #include<vector> #include<string> #include<algorithm> using namespace std; //卡尔的图不是按照程序执行过程而是直接画程序会执行的过程 // 实际执行是&#xff1a;n个字符&#xff0c;递推n1后&#xff08;叶子节点&#xff…...

高性能队列 Disruptor 在 IM 系统中的实战

高性能队列 Disruptor 在 IM 系统中的实战 前三期我们介绍了Disruptor的典型使用场景和相关高性能原理&#xff0c;本期我介绍一下Disruptor在IM系统用的应用实战&#xff0c;IM系统即社交聊天系统&#xff0c;对实时性的要求非常高&#xff0c;非常符合Disruptor的使用场景。 …...

原生HTML集合

一、表格 1、固定表格 <div class"tablebox"><div class"table-container"><table id"myTable" border"0" cellspacing"0" cellpadding"0"><thead><tr></tr></thead>…...

ES6 简单练习笔记--变量申明

一、ES5 变量定义 1.在全局作用域中 this 其实就是window对象 <script>console.log(window this) </script>输出结果: true 2.在全局作用域中用var定义一个变量其实就相当于在window上定义了一个属性 例如: var name "孙悟空" 其实就相当于执行了 win…...

2025.1.21——六、BUU XSS COURSE 1

题目来源&#xff1a;buuctf BUU XSS COURSE 1 一、打开靶机&#xff0c;整理信息 有吐槽和登陆两个尝试点&#xff0c;题目名称提示是XSS漏洞 XSS&#xff08;Cross-Site Scripting&#xff09;漏洞 1.定义&#xff1a;跨站脚本攻击&#xff0c;是一种常见的 Web 安全漏洞。攻…...

Linux - 五种常见I/O模型

I/O操作 (输入/输出操作, Input/Output) 是指计算机与外部设备就行数据交互的过程. 什么是外部设备: 如键盘, 鼠标, 硬盘, 网卡等. 五种常见的 I/O 模型: 阻塞 I/O非阻塞 I/O信号驱动 I/OI/O 多路复用异步 I/O 阻塞 I/O 阻塞 I/O 的特点: 当用户发起 I/O 请求后, 进程/线程就…...

【负载均衡式在线OJ】加载题目信息(文件版)

目录 如何读取文件 -- 常见流程 代码 如何读取文件 -- 常见流程 在C中使用 std::ifstream来打开文件流是一个常见的操作&#xff0c;用于创建一个输入文件流&#xff0c;并尝试打开名为 question_list的文件。if (!in.is_open())&#xff1a;检查文件是否成功打开。如果文件未…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...