MyBatis 集成spring框架

MyBatis 集成 Spring 框架详解

MyBatis 是一个优秀的持久层框架,它通过简单、灵活的 SQL 语句与 Java 对象进行映射,而 Spring 是 Java 生态系统中最流行的框架之一,广泛用于依赖注入(DI)、面向切面编程(AOP)和事务管理等功能。将 MyBatis 集成到 Spring 框架中,能让开发者充分利用 Spring 的强大功能(如事务管理、IOC 容器等),同时使用 MyBatis 进行高效的数据库操作。


1. 项目依赖配置

在 Spring 项目中集成 MyBatis 通常使用 Spring 提供的 MyBatis Starter。下面以 Spring Boot 为例,演示如何通过 Maven 添加 MyBatis 相关依赖。

1.1 添加 Maven 依赖

在 Spring Boot 项目中集成 MyBatis 需要在 pom.xml 中添加如下依赖:

<dependencies><!-- Spring Boot Starter Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- MyBatis Spring Boot Starter --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.0</version></dependency><!-- MySQL Connector --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!-- Lombok(可选,简化实体类代码) --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency>
</dependencies>
  • spring-boot-starter-web:提供 Spring MVC 功能。
  • mybatis-spring-boot-starter:MyBatis 与 Spring Boot 集成的 Starter,自动配置 MyBatis。
  • mysql-connector-java:MySQL 数据库驱动。
1.2 配置数据库连接

src/main/resources/application.yml 中配置数据库连接信息:

spring:datasource:url: jdbc:mysql://localhost:3306/mydbusername: rootpassword: passworddriver-class-name: com.mysql.cj.jdbc.Drivermybatis:type-aliases-package: com.example.demo.model  # 实体类所在包mapper-locations: classpath:mapper/*.xml      # Mapper XML 文件位置
  • datasource.url:数据库连接 URL。
  • type-aliases-package:指定实体类所在的包,用于简化 MyBatis 中的类型映射。
  • mapper-locations:指定 Mapper XML 文件的存放位置。

2. MyBatis 基础配置

在集成 MyBatis 时,通常需要配置实体类、Mapper 接口以及相应的 XML 映射文件。

2.1 创建实体类

假设有一个 User 表,创建对应的实体类 User

package com.example.demo.model;import lombok.Data;@Data
public class User {private Integer id;private String username;private String email;
}
2.2 创建 Mapper 接口

在 MyBatis 中,Mapper 接口用于定义与数据库交互的方法。Mapper 接口可以使用注解或者通过 XML 文件进行 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 user WHERE id = #{id}")User getUserById(int id);@Select("SELECT * FROM user")List<User> getAllUsers();@Insert("INSERT INTO user (username, email) VALUES (#{username}, #{email})")@Options(useGeneratedKeys = true, keyProperty = "id")void insertUser(User user);@Update("UPDATE user SET username = #{username}, email = #{email} WHERE id = #{id}")void updateUser(User user);@Delete("DELETE FROM user WHERE id = #{id}")void deleteUser(int id);
}
  • @Mapper:标注这是一个 MyBatis Mapper 接口,Spring Boot 会自动扫描并注入这些接口。
  • @Select、@Insert、@Update、@Delete:用于执行相应的 SQL 操作。
2.3 使用 XML 配置 Mapper(可选)

除了使用注解,还可以通过 XML 配置 Mapper SQL 语句。在 src/main/resources/mapper/ 目录下创建 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.demo.mapper.UserMapper"><select id="getUserById" resultType="com.example.demo.model.User">SELECT * FROM user WHERE id = #{id}</select><select id="getAllUsers" resultType="com.example.demo.model.User">SELECT * FROM user</select><insert id="insertUser" useGeneratedKeys="true" keyProperty="id">INSERT INTO user (username, email) VALUES (#{username}, #{email})</insert><update id="updateUser">UPDATE user SET username = #{username}, email = #{email} WHERE id = #{id}</update><delete id="deleteUser">DELETE FROM user WHERE id = #{id}</delete></mapper>

UserMapper.java 中,不需要再使用 SQL 注解,而是通过 XML 文件进行 SQL 映射。


3. 使用 MyBatis 与 Spring 进行数据库操作

MyBatis 与 Spring 集成后,Spring 可以自动管理 Mapper 的实例,可以通过依赖注入来调用数据库操作方法。

3.1 创建服务类

服务类中调用 UserMapper 接口来执行数据库操作。

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 java.util.List;@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public User getUserById(int id) {return userMapper.getUserById(id);}public List<User> getAllUsers() {return userMapper.getAllUsers();}public void createUser(User user) {userMapper.insertUser(user);}public void updateUser(User user) {userMapper.updateUser(user);}public void deleteUser(int id) {userMapper.deleteUser(id);}
}
3.2 创建控制器

为了通过 REST API 调用数据库操作,创建一个简单的控制器:

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 int id) {return userService.getUserById(id);}@GetMappingpublic List<User> getAllUsers() {return userService.getAllUsers();}@PostMappingpublic void createUser(@RequestBody User user) {userService.createUser(user);}@PutMapping("/{id}")public void updateUser(@PathVariable int id, @RequestBody User user) {user.setId(id);userService.updateUser(user);}@DeleteMapping("/{id}")public void deleteUser(@PathVariable int id) {userService.deleteUser(id);}
}
  • @RestController:标注这是一个 REST 控制器。
  • @RequestMapping:定义基础 URL 路径。
  • @GetMapping@PostMapping 等注解用于处理 HTTP 请求。

4. 事务管理

Spring 提供了强大的事务管理功能,结合 MyBatis 可以轻松管理数据库事务。通常,我们可以通过 @Transactional 注解来声明事务。

4.1 在服务类中声明事务

在需要事务管理的方法或类上添加 @Transactional 注解,Spring 会自动管理事务的提交和回滚。

import org.springframework.transaction.annotation.Transactional;@Service
public class UserService {@Autowiredprivate UserMapper userMapper;@Transactionalpublic void createUserAndLog(User user) {userMapper.insertUser(user);// 如果某个操作发生异常,整个事务将回滚// 例如日志写入失败,user 数据库插入也会回滚logMapper.insertLog(user.getId(), "User created");}
}
  • 事务回滚:当发生异常时,事务会自动回滚,确保数据库的一致性。

5. MyBatis 缓存与日志

5.1 MyBatis 一级缓存与二级缓存
  • 一级缓存:MyBatis 的默认缓存机制,作用范围是 SqlSession,同一个 SqlSession 内的查询会被缓存。
  • 二级缓存:可选的全局缓存,需要在 Mapper 中显式开启,通过 @CacheNamespace<cache> 配置启用。
5.2 日志配置

可以通过配置日志框架(如 SLF4J 和 Logback)来记录 MyBatis 的 SQL 执行情况。将日志级别设置为 DEBUG,可以查看每条 SQL 的执行详情。

logging:level:org.apache.ibatis: DEBUG

logback.xml 中配置 MyBatis 日志:

<logger name="org.apache.ibatis" level="DEBUG" additivity="false"><appender-ref ref="STDOUT"/>
</logger>

6. 总结

MyBatis 与 Spring 的集成为开发者提供了强大的数据持久化解决方案。通过 MyBatis,开发者可以灵活地编写 SQL 并进行高效的数据库交互,而 Spring 的事务管理、依赖注入、AOP 等功能则增强了持久层的管理能力。在实际项目中,可以根据业务需求选择注解或 XML 方式进行 SQL 映射,并利用 Spring 的强大功能实现数据操作的稳定性和可维护性。

集成 Spring 与 MyBatis 的关键步骤包括:

  • 配置数据库连接和 MyBatis 相关依赖。
  • 使用注解或 XML 定义 Mapper 接口和 SQL 语句。
  • 在服务层使用 @Transactional 进行事务管理,保证数据一致性。

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

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

相关文章

第十四章:html和css做一个心在跳动,为你而动的表白动画

💖 让心跳加速,传递爱意 💖 在这个特别的时刻,让爱在跳动中绽放!🌟 无论是初次相遇的心动,还是陪伴多年的默契,我们的心总在为彼此跳动。就像这颗炙热的爱心,随着每一次的跳动,传递着满满的温暖与期待。 在这个浪漫的季节,让我们一同感受爱的律动!无论你是在…

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-19

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-19 1. SAM4MLLM: Enhance Multi-Modal Large Language Model for Referring Expression Segmentation Authors: Yi-Chia Chen, Wei-Hua Li, Cheng Sun, Yu-Chiang Frank Wang, Chu-Song Chen SAM4MLLM: 增强多模…

防火墙详解(三)华为防火墙基础安全策略配置(命令行配置)

实验要求 根据实验要求配置防火墙&#xff1a; 合理部署防火墙安全策略以及安全区域实现内网用户可以访问外网用户&#xff0c;反之不能访问内网用户和外网用户均可以访问公司服务器 实验配置 步骤一&#xff1a;配置各个终端、防火墙端口IP地址 终端以服务器为例&#xff…

离散制造 vs 流程制造:锚定精准制造未来,从装配线到化学反应,实时数据集成在制造业案例中的多维应用

使用 TapData&#xff0c;化繁为简&#xff0c;摆脱手动搭建、维护数据管道的诸多烦扰&#xff0c;轻量替代 OGG, Kettle 等同步工具&#xff0c;以及基于 Kafka 的 ETL 解决方案&#xff0c;「CDC 流处理 数据集成」组合拳&#xff0c;加速仓内数据流转&#xff0c;帮助企业…

Android IME输入法启动显示隐藏流程梳理

阅读Android AOSP 12版本代码&#xff0c;对输入法IME整体框架模块进行学习梳理&#xff0c;内容包含输入法框架三部分IMM、IMMS、IMS的启动流程、点击弹出流程、显示/隐藏流程&#xff0c;以及常见问题和调试技巧。 1. IME整体框架​​​​​​​ IME整体分为三个部分&#xf…

股指期货的持仓量指标如何分析?有哪些作用?

股指期货市的持仓量是一个极其重要的指标&#xff0c;它就像市场的“晴雨表”&#xff0c;能反映出投资者的信心、市场的热度以及潜在的趋势。下面&#xff0c;我们就用大白话的方式来详细解读一下股指期货持仓量指标的分析方法及其作用。 一、什么是股指期货持仓量&#xff1…

用CPU训练机器学习模型

人工智能最近的成功通常归功于 GPU 的出现和发展。GPU 的架构通常包括数千个多处理器、高速内存、专用张量核心等&#xff0c;特别适合满足人工智能/机器学习工作负载的密集需求。 不幸的是&#xff0c;人工智能开发的快速增长导致对 GPU 的需求激增&#xff0c;使得 GPU 难以…

ESP32/ESP8266开发板单向一对多ESP-NOW无线通信

目录 简介读取ESP32/ESP8266接收方Receiver的MAC地址ESP32发送方Sender程序ESP32/ESP8266接收方Receiver程序ESP-NOW通信验证总结 简介 本实验通过ESP-NOW无线通信协议实现ESP32开发板向多个ESP32/ESP 8266开发板发送数据。 读取ESP32/ESP8266接收方Receiver的MAC地址 读取…

Nginx反向代理出现502 Bad Gateway问题的解决方案

&#x1f389; 前言 前一阵子写了一篇“关于解决调用百度翻译API问题”的博客&#xff0c;近日在调用其他API时又遇到一些棘手的问题&#xff0c;于是写下这篇博客作为记录。 &#x1f389; 问题描述 在代理的遇到过很多错误码&#xff0c;其中出现频率最高的就是502&#x…

LabVIEW提高开发效率技巧----代码规范与文档记录

良好的代码规范与文档记录在LabVIEW开发中至关重要。它不仅能够大幅提升开发效率&#xff0c;还为后续的维护和项目交接提供便利。下面将从命名规则、注释标准、功能说明等多个角度&#xff0c;介绍如何通过规范化开发提高项目的可维护性与协作性。 1. 保持一致的命名规则 在L…

Flutter局域网广播(UDP通信)与TCP通信

前言 现在有一个需求&#xff0c;手机和ESP32通过WIFI进行通信。流程如下&#xff1a; 手机创建TCP服务器手机向192.168.0.255的1002端口广播自己的ip地址以及TCP服务器的端口号ESP32监听到1002的广播内容后&#xff0c;连接手机的TCP服务器。最后就是ESP32硬件和TCP服务器进…

双击热备 Electron网页客户端

安装流程&#xff1a; 1.下载node.js安装包进行安装 2.点击Next; 3.勾选&#xff0c;点击Next; 4.选择安装目录 5.选择Online 模式 6.下一步执行安装 。 7.运行cmd,执行命令 path 和 node --version&#xff0c;查看配置路径和版本 8.Goland安装插件node.js 9.配置运行…

【有啥问啥】深度剖析:大模型AI时代下的推理路径创新应用方法论

深度剖析&#xff1a;大模型AI时代下的推理路径创新应用方法论 随着大规模预训练模型&#xff08;Large Pretrained Models, LPMs&#xff09;和生成式人工智能的迅速发展&#xff0c;AI 在多领域的推理能力大幅提升&#xff0c;尤其是在自然语言处理、计算机视觉和自动决策领…

Kafka 下载安装及使用总结

1. 下载安装 官网下载地址&#xff1a;Apache Kafka 下载对应的文件 上传到服务器上&#xff0c;解压 tar -xzf kafka_2.13-3.7.0.tgz目录结果如下 ├── bin │ └── windows ├── config │ └── kraft ├── libs ├── licenses └── site-docs官方文档…

Flink Task 日志文件隔离

Flink Task 日志文件隔离 任务在启动时会先通过 MdcUtils 启动一个 slf4j 的 MDC 环境&#xff0c;然后将 jobId 添加到 slf4j 的 MDC 容器中&#xff0c;随后任务输出的日志都将附带 joid。 MDC 介绍如下&#xff1a; MDC ( Mapped Diagnostic Contexts )&#xff0c;它是一个…

深度学习:(六)激活函数的选择与介绍

激活函数 之前使用的 a σ ( z ) a\sigma(z) aσ(z) &#xff0c;其中 σ ( ) \sigma(~) σ( ) 便是激活函数。 在神经网络中&#xff0c;不同层的激活函数可以不同。 在学习中&#xff0c;一般以 g ( z ) g(z) g(z) 来表示激活函数。 为什么需要(线性)激活函数&#xff…

K8s容器运行时,移除Dockershim后存在哪些疑惑?

K8s容器运行时&#xff0c;移除Dockershim后存在哪些疑惑&#xff1f; 大家好&#xff0c;我是秋意零。 K8s版本截止目前&#xff08;24/09&#xff09;已经发布到了1.31.x版本。早在K8s版本从1.24.x起&#xff08;22/05&#xff09;&#xff0c;默认的容器运行时就不再是Doc…

算法之搜索--最长公共子序列LCS

最长公共子序列&#xff08;longest common sequence&#xff09;:可以不连续 最长公共子串&#xff08;longest common substring&#xff09;&#xff1a;连续 demo for (int i 1;i<lena;i){for (int j 1;j<lenb;j){if(a[i-1]b[j-1]){dp[i][j]dp[i-1][j-1]1;}el…

Qt (17)【Qt 文件操作 读写保存】

阅读导航 引言一、Qt文件概述二、输入输出设备类三、文件读写类四、文件和目录信息类五、自定义“记事本” 引言 在上一篇文章中&#xff0c;我们学习了Qt的事件处理机制&#xff0c;知道了如何响应用户的操作。但应用程序常常还需要处理文件&#xff0c;比如读写数据。所以&a…

python爬虫初体验(一)

文章目录 1. 什么是爬虫&#xff1f;2. 为什么选择 Python&#xff1f;3. 爬虫小案例3.1 安装python3.2 安装依赖3.3 requests请求设置3.4 完整代码 4. 总结 1. 什么是爬虫&#xff1f; 爬虫&#xff08;Web Scraping&#xff09;是一种从网站自动提取数据的技术。简单来说&am…