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

MyBatis与 Springboot 的集成

MyBatis 是一个优秀的持久层框架,专注于 SQL 语句的灵活控制,与 Spring Boot 集成可以简化数据库操作,提升开发效率。Spring Boot 提供了与 MyBatis 无缝集成的支持,使得 MyBatis 可以轻松与 Spring Boot 应用结合使用。

一、MyBatis 与 Spring Boot 集成的优势

将 MyBatis 与 Spring Boot 集成的主要优势包括:

  1. 简化配置:Spring Boot 提供了自动配置,减少了手动配置 MyBatis 的工作量。
  2. 简洁的开发模式:通过 @Mapper 注解,MyBatis 的 Mapper 接口可以自动注入到 Spring 的上下文中,简化开发。
  3. 便捷的事务管理:Spring Boot 支持基于注解的事务管理,使得 MyBatis 的事务操作更加容易控制。

二、集成步骤

以下是 MyBatis 与 Spring Boot 集成的详细步骤。

1. 引入依赖

在集成 MyBatis 与 Spring Boot 之前,需要在项目的 pom.xml 中引入相关依赖。Spring Boot 提供了一个 mybatis-spring-boot-starter 起步依赖,包含了所有必须的 MyBatis 集成内容。

<dependencies><!-- Spring Boot Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- MyBatis Starter for Spring Boot --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.0</version> <!-- 具体版本可根据项目需要调整 --></dependency><!-- MySQL Driver (或其他数据库驱动) --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency>
</dependencies>
2. 配置数据源

MyBatis 需要一个数据库数据源。Spring Boot 可以通过 application.propertiesapplication.yml 来配置数据源。这里以 MySQL 数据库为例,假设我们使用 application.yml 文件。

src/main/resources/application.yml 中,添加数据库的配置:

spring:datasource:url: jdbc:mysql://localhost:3306/mydatabase?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTCusername: rootpassword: yourpassworddriver-class-name: com.mysql.cj.jdbc.Drivermybatis:mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.example.demo.model
  • spring.datasource.*:配置数据库连接的信息,包括 JDBC URL、用户名、密码和驱动类。
  • mybatis.mapper-locations:指定 MyBatis XML 映射文件的位置,Spring Boot 会自动扫描该路径下的 Mapper 文件。
  • mybatis.type-aliases-package:指定实体类所在的包,MyBatis 可以自动识别这些类的别名。
3. 创建数据库实体类

假设我们有一个 User 表,并在项目中创建对应的实体类。实体类通常用于映射数据库表中的字段。

package com.example.demo.model;public class User {private Long id;private String name;private String email;// Getters and Setterspublic Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}
}
4. 创建 Mapper 接口

Mapper 接口是 MyBatis 中用于定义 SQL 操作的接口。每个方法对应一个 SQL 语句,方法的参数和返回值与 SQL 操作密切相关。

package com.example.demo.mapper;import com.example.demo.model.User;
import org.apache.ibatis.annotations.*;import java.util.List;@Mapper
public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{id}")User findById(Long id);@Select("SELECT * FROM users")List<User> findAll();@Insert("INSERT INTO users(name, email) VALUES(#{name}, #{email})")@Options(useGeneratedKeys = true, keyProperty = "id")void insert(User user);@Update("UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}")void update(User user);@Delete("DELETE FROM users WHERE id = #{id}")void delete(Long id);
}

在这个接口中,我们使用了 MyBatis 的注解 @Select@Insert@Update@Delete 来定义 SQL 操作:

  • @Select:用于执行查询操作。
  • @Insert:用于插入数据,使用 @Options 注解将自动生成的主键返回给实体对象。
  • @Update:用于更新数据。
  • @Delete:用于删除数据。
5. 使用 XML 文件定义 SQL

除了在 Mapper 接口中使用注解定义 SQL 语句外,MyBatis 也支持通过 XML 文件进行 SQL 定义。为了演示,假设我们想通过 XML 文件定义 SQL 查询。

创建 UserMapper.xml 文件,并将其放在 resources/mapper/ 目录下。

<?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.demo.mapper.UserMapper"><!-- 查询所有用户 --><select id="findAll" resultType="com.example.demo.model.User">SELECT * FROM users</select><!-- 根据 ID 查询用户 --><select id="findById" parameterType="Long" resultType="com.example.demo.model.User">SELECT * FROM users WHERE id = #{id}</select><!-- 插入新用户 --><insert id="insert" parameterType="com.example.demo.model.User" useGeneratedKeys="true" keyProperty="id">INSERT INTO users (name, email)VALUES (#{name}, #{email})</insert><!-- 更新用户 --><update id="update" parameterType="com.example.demo.model.User">UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}</update><!-- 删除用户 --><delete id="delete" parameterType="Long">DELETE FROM users WHERE id = #{id}</delete></mapper>

在这个 XML 文件中,我们定义了与 UserMapper 接口对应的 SQL 语句。通过 XML 定义 SQL 语句的方式适用于复杂的 SQL 逻辑或需要动态生成 SQL 的场景。

6. 编写 Service 层

在业务逻辑层(Service)中,使用 UserMapper 来执行数据库操作。Service 层通常包含事务管理和业务逻辑的处理。

package com.example.demo.service;import com.example.demo.mapper.UserMapper;
import com.example.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import java.util.List;@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public User findById(Long id) {return userMapper.findById(id);}public List<User> findAll() {return userMapper.findAll();}@Transactionalpublic void insert(User user) {userMapper.insert(user);}@Transactionalpublic void update(User user) {userMapper.update(user);}@Transactionalpublic void delete(Long id) {userMapper.delete(id);}
}

这里,我们使用了 @Service 注解标记业务层,并通过 @Autowired 注入了 UserMapper。同时,通过 @Transactional 注解,管理事务操作。

7. 创建控制器

最后,创建一个控制器来处理 HTTP 请求,并调用业务逻辑层执行数据库操作。

package com.example.demo.controller;import com.example.demo.model.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/{id}")public User getUserById(@PathVariable Long id) {return userService.findById(id);}@GetMappingpublic List<User> getAllUsers() {return userService.findAll();}@PostMappingpublic void addUser(@RequestBody User user) {userService.insert(user);}@PutMappingpublic void updateUser(@RequestBody User user) {userService.update(user);}@DeleteMapping("/{id}")public void deleteUser(@PathVariable Long id) {userService.delete(id);}
}

控制器通过 @RestController 注解定义 RESTful API,接收客户端请求,调用 UserService 执行相关的数据库操作。

三、事务管理

Spring Boot 自动集成了事务管理,我们只需要在需要事务控制的方法上加上 @Transactional 注解即可。所有标记为 @Transactional 的方法会自动受到 Spring 的事务管理控制,确保操作的一致性和原子性。

例如,以下代码展示了在插入和更新时的事务管理:

@Service
public class UserService {@Autowiredprivate UserMapper userMapper;@Transactionalpublic void insertAndUpdate(User newUser, User existingUser) {userMapper.insert(newUser);userMapper.update(existingUser);}
}

四、总结

通过集成 MyBatis 与 Spring Boot,我们能够高效地处理数据库操作。Spring Boot 的自动配置减少了大量的样板代码,同时 MyBatis 的灵活性允许我们轻松处理复杂的 SQL 语句。通过注解和 XML 文件,我们可以根据项目需求选择合适的方式进行 SQL 映射,并结合 Spring 的事务管理,构建稳定、高效的数据库操作层。

相关文章:

MyBatis与 Springboot 的集成

MyBatis 是一个优秀的持久层框架&#xff0c;专注于 SQL 语句的灵活控制&#xff0c;与 Spring Boot 集成可以简化数据库操作&#xff0c;提升开发效率。Spring Boot 提供了与 MyBatis 无缝集成的支持&#xff0c;使得 MyBatis 可以轻松与 Spring Boot 应用结合使用。 一、MyB…...

迁移学习和外推关系

**迁移学习&#xff08;Transfer Learning&#xff09;和外推&#xff08;Extrapolation&#xff09;**都是机器学习中处理新数据的一种方式&#xff0c;但它们的定义、应用场景和挑战有所不同。让我们来对比两者并探讨它们的关系。 定义 迁移学习&#xff08;Transfer Learni…...

小程序-生命周期与WXS脚本

生命周期 什么是生命周期 生命周期&#xff08;Life Cycle&#xff09;是指一个对象从创建 -> 运行 -> 销毁的整个阶段&#xff0c;强调的是一个时间段。 我们可以把每个小程序运行的过程&#xff0c;也概括为生命周期&#xff1a; 小程序的启动&#xff0c;表示生命…...

828华为云征文 | 云服务器Flexus X实例,Docker集成搭建FC-web模拟器

828华为云征文 | 云服务器Flexus X实例&#xff0c;Docker集成搭建FC-web模拟器 华为云端口放行 服务器放行对应端口9995 Docker安装并配置镜像加速 1、购买华为云 Flexus X 实例 Flexus云服务器X实例-华为云 (huaweicloud.com) 2、docker安装 yum install -y docker-ce3、验证…...

_RET_IP_ 和_THIS_IP_ 作用

在Linux内核中,有两个罕见的宏定义_RET_IP_ 和_THIS_IP_。但是这两个宏在内核代码中又时不时的出现&#xff0c;那么它们到底是什么含义呢? 1、宏定义 我们先看它们的宏定义 include./linux/kernel.h#define _RET_IP_ (unsigned long)__builtin_return_address(0)#define …...

Spring Boot 点餐系统:高效餐饮服务

第二章关键技术的研究 2.1相关技术 网上点餐系统是在Java MySQL开发环境的基础上开发的。Java是一种服务器端脚本语言&#xff0c;易于学习&#xff0c;实用且面向用户。全球超过35&#xff05;的Java驱动的互联网站点使用Java。MySQL是一个数据库管理系统&#xff0c;因为它的…...

RtspServer:轻量级RTSP服务器和推流器

文章目录 项目概述技术分析支持的编码格式传输方式心跳检测机制RTSP 推流安全性 架构分析RtspServer 整体架构流程分析1. 客户端连接和会话建立2. 媒体数据传输3. 心跳检测和连接维护 xop 基础库项目介绍功能特性xop 整体架构 应用场景社区问题收集与解答问题一&#xff1a;刚开…...

为什么结构化 Prompt 如此有效?

你好&#xff0c;我是三桥君 在今年&#xff0c;我研究了结构化编写Prompt的方法&#xff0c;并观察到这种结构化、模板化的Prompt能够有效地突破ChatGPT 3.5的限制&#xff0c;实现所谓的“越狱”。然而&#xff0c;为什么ChatGPT会对这种结构化Prompt如此有效呢&#xff1f;…...

无人机飞手培训校企合作特训技术详解

随着无人机技术的飞速发展&#xff0c;其在航拍、农业、测绘、救援等多个领域的应用日益广泛&#xff0c;市场对高素质无人机飞手的需求急剧增加。为满足这一需求&#xff0c;促进教育与产业深度融合&#xff0c;无人机飞手培训校企合作模式应运而生。本文将从确定合作目标、共…...

从零开始的软件开发详解:数字药店系统源码与医保购药APP

很多小伙伴们疑问&#xff0c;医保购药APP是如何开发的&#xff0c;今天我将从零数字药店系统源码开始为大家提供一条清晰的实现方案。 一、技术架构设计 在开发医保购药APP之前&#xff0c;首先需要明确技术架构。一般来说&#xff0c;APP的技术架构可以分为前端和后端。 1…...

【记录】在返回值类型为BigDecimal情况下末尾小数位为0的会省略不显示

【问题】&#xff1a;在返回值类型为BigDecimal情况下末尾小数位为0的会省略不显示 问题复现&#xff1a; 实体类 package com.zlp.aspect.entity;import java.math.BigDecimal;/*** program: my_utils* description:* author: zlp* create: 2024-09-24 10:01**/public clas…...

通信工程高级职称评审条件详细解读

通信工程只有正高和副高级别的职称&#xff0c;中级通信工程的职称是需要自己参加考试的&#xff0c;并不是评审获得&#xff0c;这个大家需要注意一下&#xff0c;先要考取中级通信工程师之后才能评审副高和正高级通信工程的职称。 下面跟甘建二一起来看看通信专业职称评审条件…...

yolov8环境安装

yolov8 git地址 https://github.com/ultralytics/ultralytics/tree/main 我的电脑显卡配置 nvidia-smi cuda11.8下载 https://developer.nvidia.com/cuda-11-8-0-download-archive?target_osWindows&target_archx86_64&target_version10&target_typeexe_local …...

C语言中易混淆概念的关键字

最快的关键字---- register register&#xff1a; 这个关键字请求编译器尽可能的将变量存在 CPU 内部寄存器中而不是通过内 存寻址访问以提高效率。注意是尽可能&#xff0c;不是绝对。你想想&#xff0c;一个 CPU 的寄存器也就那么 几个或几十个&#xff0c;你要是定义了很多很…...

网络资源模板--Android Studio 零食工坊(商城)

目录 一、项目演示 二、项目测试环境 三、项目详情 四、完整的项目源码 一、项目演示 网络资源模板--零食工坊 二、项目测试环境 三、项目详情 1. **加载 Fragment 布局**&#xff1a; - 使用 inflater.inflate 加载 fragment_snack 的布局。 2. **视图组件初始化**&am…...

百度高德坐标系相互转换

一、百度与高德坐标系互换 百度坐标系&#xff1a;bd09 高德坐标系&#xff1a; gcj02 import math# 坐标系转换&#xff1a;百度转高德&#xff0c;高德转百度 class CoordinateSystem:staticmethoddef bd09_to_gcj02(bd_lon, bd_lat):百度坐标系:bd09 转成高德坐标系 gcj0…...

免费下载6组简历模板,让HR一眼相中你!

简历是求职者向招聘单位展示自我的重要工具&#xff0c;选择一份高质量的简历模板免费下载&#xff0c;能够提升面试机会并留下深刻印象。优秀的简历模板需具备清晰的信息结构、出色的视觉效果及合理的排版布局。简历的配色可以凸显求职者的个性&#xff0c;而有逻辑性的排版则…...

设计模式之模版方法模式

定义 定义一个操作中的算法的骨架&#xff08;稳定&#xff09;&#xff0c;而将一些步骤延迟&#xff08;变化&#xff09;到子类中。模版方法使得子类可以不改变&#xff08;复用&#xff09;一个算法的结构即可重定义&#xff08;override 重写&#xff09;该算法的某些特定…...

解析!文档扫描 SDK 中的高级图像处理技术

随着世界数字化&#xff0c;文档扫描已成为现代商业运营的关键&#xff0c;它使文档的存储、访问和管理更加便捷。然而&#xff0c;扫描图像的质量对于这些数字档案的有效性至关重要。高质量的扫描可确保文本清晰、数据准确捕获并且信息易于检索。 另一方面&#xff0c;质量差…...

线性判别分析(LDA)中求协方差矩阵示例

让我们通过一个简单的例子计算协方差矩阵。假设我们有两类数据集 X 0 X_0 X0​ 和 X 1 X_1 X1​&#xff0c;每类有两个样本&#xff0c;每个样本有两个特征。 数据集&#xff1a; 类 0 的样本&#xff1a; X 0 [ 1 2 2 3 ] X_0 \begin{bmatrix} 1 & 2 \\ 2 & 3…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...