springboot3 mybatis 数据库操控入门与实战

news/2025/9/30 11:01:22/文章来源:https://www.cnblogs.com/lxjshuju/p/19120211

Mybatis 项目

https://gitee.com/supervol/loong-springboot-study

(记得给个start,感谢)

Mybatis 概述

        在 Spring Boot 3 环境中,MyBatis 作为一款轻量级持久层框架,凭借其对 SQL 的灵活控制和与 Spring 生态的良好兼容性,成为数据访问层的常用选择。

Mybatis 核心

        MyBatis 专注于解决 JDBC 操作的痛点(如手动处理连接、结果集映射等),同时保留开发者对 SQL 的直接控制权,核心特性包括:

  • SQL 与代码解耦:通过 XML 或注解定义 SQL,避免硬编码;
  • 灵活的映射机制:支持对象与数据库表的自动映射(如下划线转驼峰),也可手动配置复杂映射(一对一、一对多关联);
  • 动态 SQL:通过标签(ifchooseforeach 等)根据条件动态生成 SQL,简化复杂查询;
  • 轻量级:无侵入性,核心依赖少,性能接近原生 JDBC;
  • 与 Spring 无缝集成:通过 mybatis-spring-boot-starter 快速整合到 Spring Boot 3 中,无需手动管理 SqlSession 等组件。

Mybatis 对比

        MyBatis 和 JPA(Java Persistence API)是 Java 生态中最常用的两种持久层技术,它们的设计理念和适用场景有显著差异。

1. 定位与理念

维度MyBatisJPA
定位半自动 ORM 框架(SQL 与对象映射分离)ORM 规范(通常指 Hibernate 等实现,全自动 ORM)
设计理念聚焦 SQL 控制,保留开发者对 SQL 的直接管理权聚焦对象模型,通过面向对象的方式操作数据库
核心目标简化 JDBC 操作,同时不丢失 SQL 的灵活性消除 SQL 依赖,让开发者以 "操作对象" 的方式操作数据库

2. 核心功能对比

(1)SQL 控制能力

  • MyBatis:完全开放 SQL 控制权,支持 手写 SQL(XML 或注解),开发者可直接编写优化后的原生 SQL、存储过程、复杂联合查询等。例:通过 XML 或 @Select 注解直接定义 SQL:

  • JPA:屏蔽 SQL 细节,通过 JPQL(面向对象的查询语言) 或 Criteria API 操作数据,SQL 由框架(如 Hibernate)自动生成。例:通过 JPQL 查询:

    @Query("SELECT u FROM User u WHERE u.age > :minAge ORDER BY u.createTime DESC")
    List findByAgeGreaterThan(@Param("minAge") int minAge);

    复杂场景下也可手写原生 SQL,但违背 JPA "屏蔽 SQL" 的设计初衷。

(2)映射关系

  • MyBatis:需手动配置 结果映射(ResultMap) 处理对象关联(一对一、一对多等),灵活性高但配置繁琐。例:一对多映射:

    
    
  • JPA:通过注解(@OneToOne@OneToMany 等)自动维护关联关系,框架会自动生成关联查询的 SQL。例:一对多映射:

    @Entity
    public class User {@Idprivate Long id;@OneToMany(mappedBy = "user") // 自动关联 Order 中的 user 字段private List orders;
    }

(3)开发效率

  • MyBatis

    • 简单 CRUD 需手动编写 SQL(或通过代码生成工具生成),开发速度较慢;
    • 复杂查询时,手写 SQL 反而更高效(避免框架生成冗余 SQL)。
  • JPA

    • 基于 Spring Data JPA 时,通过继承 JpaRepository 可直接获得 CRUD、分页、排序等功能,无需编写实现;
    • 例:public interface UserRepository extends JpaRepository<User, Long> 即可直接调用 findAll()save() 等方法;
    • 简单业务场景下开发效率极高,复杂场景需额外配置(如自定义 JPQL)。

(4)性能与优化

  • MyBatis

    • 性能接近原生 JDBC,因为 SQL 可控,可针对性优化(如索引利用、查询字段精简);
    • 无额外缓存(需手动集成 Redis 等),但避免了框架级缓存的复杂性。
  • JPA(以 Hibernate 为例)

    • 自动生成的 SQL 可能存在冗余(如关联查询过度加载),需通过 fetch = FetchType.LAZY 等配置优化;
    • 内置一级缓存(Session 级)和二级缓存(全局),可减少重复查询,但缓存配置不当易引发数据一致性问题。

(5)学习曲线

  • MyBatis:门槛低,对熟悉 SQL 的开发者友好,核心只需掌握 Mapper 接口、XML 映射规则即可。

  • JPA:门槛较高,需理解 ORM 核心概念(如持久化上下文、脏检查)、JPQL 语法、关联映射策略等,初期学习成本高。

3. 适用场景

框架适用场景不适用场景
MyBatis1. 需精细控制 SQL(如复杂报表、多表联合查询);2. 数据库设计不规范(字段名与对象属性差异大);3. 团队熟悉 SQL 优化;4. 对性能要求极高的场景。1. 快速开发简单 CRUD 业务;2. 团队更擅长面向对象编程而非 SQL。
JPA1. 业务简单(以 CRUD 为主),需快速迭代;2. 数据库设计规范,适合 ORM 映射;3. 团队偏好面向对象编程,希望减少 SQL 编写。1. 复杂 SQL 场景(如多表嵌套查询、存储过程);2. 需深度优化 SQL 性能的场景。

Mybatis 示例

        请参考项目地址中 springboot-orm/springboot-mybatis 模块代码。

Mybatis 集成

1. 添加依赖

        在 pom.xml 中引入核心依赖:


org.springframework.bootspring-boot-starter-parent3.2.0

org.springframework.bootspring-boot-starter-weborg.mybatis.spring.bootmybatis-spring-boot-starter3.0.3 com.mysqlmysql-connector-jruntimecom.zaxxerHikariCPorg.springframework.bootspring-boot-starter-testtest

2. 核心配置

        在 src/main/resources/application.yaml 中配置:

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/test_db?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=trueusername: rootpassword: 123456hikari: # HikariCP 配置maximum-pool-size: 10 # 最大连接数minimum-idle: 5 # 最小空闲连接
mybatis:mapper-locations: classpath:mybatis/mappers/*.xml # Mapper XML 文件位置type-aliases-package: com.example.demo.entity # 实体类别名包(简化 XML 中的类名)configuration:map-underscore-to-camel-case: true # 开启下划线转驼峰(如数据库字段 user_name → 实体类 userName)log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印 SQL 日志(开发环境用)

3. 创建实体类

package com.example.demo.entity;
public class User {private Long id;private String username; // 对应数据库 user_name(下划线转驼峰生效)private Integer age;// 省略 getter、setter、toString
}

4. 创建 Mapper 接口

        定义数据操作方法:

package com.example.demo.mapper;
import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
// @Mapper 标识为 MyBatis 映射接口(或在启动类用 @MapperScan 批量扫描)
@Mapper
public interface UserMapper {// 查询所有用户List findAll();// 根据 ID 查询User findById(Long id);// 新增用户int insert(User user);// 更新用户int update(User user);// 删除用户int deleteById(Long id);
}

5. 编写 Mapper XML

        在 src/main/resources/mybatis/mappers/UserMapper.xml 中编写 SQL:

INSERT INTO user (username, age) VALUES (#{username}, #{age})UPDATE user SET username = #{username}, age = #{age} WHERE id = #{id}DELETE FROM user WHERE id = #{id}

6. 编写核心代码

// Service 层(业务逻辑)
package com.example.demo.service;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {private final UserMapper userMapper;// 构造器注入(Spring Boot 3 推荐)public UserService(UserMapper userMapper) {this.userMapper = userMapper;}public List getAllUsers() {return userMapper.findAll();}public User getUserById(Long id) {return userMapper.findById(id);}public void addUser(User user) {userMapper.insert(user);}
}
// Controller 层(接口暴露)
package com.example.demo.controller;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {private final UserService userService;public UserController(UserService userService) {this.userService = userService;}@GetMappingpublic List getAll() {return userService.getAllUsers();}@GetMapping("/{id}")public User getById(@PathVariable Long id) {return userService.getUserById(id);}@PostMappingpublic String add(@RequestBody User user) {userService.addUser(user);return "新增成功,ID:" + user.getId();}
}

7. 启动类与测试

package com.example.demo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
// @MapperScan 批量扫描 Mapper 接口(替代每个接口加 @Mapper)
@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

启动后,访问 http://localhost:8080/users 即可测试接口。

Mybatis 高级

1. 动态 SQL

        通过 <if>、<choose>、<foreach> 等标签动态生成 SQL:

2. 分页查询

        添加依赖:

com.github.pagehelperpagehelper-spring-boot-starter1.4.6

        使用方式:

// Service 中
public PageInfo getUsersByPage(int pageNum, int pageSize) {PageHelper.startPage(pageNum, pageSize); // 分页拦截List users = userMapper.findAll();return new PageInfo<>(users); // 封装分页信息
}

3. 事务管理

        通过 Spring 的 @Transactional 注解控制事务:

@Service
public class UserService {// ...@Transactional // 方法内所有操作要么全成功,要么全回滚public void batchAdd(List users) {for (User user : users) {userMapper.insert(user);}}
}

4. 多数据源配置

        通过 @Configuration 配置多个数据源,配合 @MapperScan 指定不同 Mapper 对应的数据源:

@Configuration
public class DataSourceConfig {@Primary // 默认数据源@Bean@ConfigurationProperties("spring.datasource.first")public DataSource firstDataSource() {return DataSourceBuilder.create().build();}@Bean@ConfigurationProperties("spring.datasource.second")public DataSource secondDataSource() {return DataSourceBuilder.create().build();}
}

Mybatis 注意

  1. 版本兼容性:MyBatis-Spring-Boot-Starter 需使用 3.x 版本(适配 Spring Boot 3);
  2. 包名迁移:Spring Boot 3 基于 Jakarta EE,若使用 javax.persistence 相关注解,需替换为 jakarta.persistence
  3. Mapper 扫描:确保 @Mapper 或 @MapperScan 正确配置,否则会出现 "No qualifying bean" 错误;
  4. SQL 日志:生产环境建议关闭 log-impl 配置,避免性能损耗。

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

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

相关文章

青岛网站设计工作室清远哪里有网页设计培训学费

比较器是一个简单的概念-在输入端对两个电压进行比较。输出为高或者低。因此&#xff0c;在转换的过程中为什么存在振荡。 当转换电平缓慢改变的时候&#xff0c;这个现象经常会发生。常常是由于输入信号存在噪声&#xff0c;因此在转换电平附近的轻微波动会引起输出端的振荡。…

解决winform调用wpf窗体时原窗体缩小的问题

在使用winform调用wpf窗体时,原来的winform窗体会缩小,同时分辨率会发生变化,用如下方法来解决这个问题。 方法一、 首先找到winform项目中的Properties ==>AssemblyInfo.cs,打开该文件,在末尾加入如下代码,之…

便宜的seo网站优化排名专业酒店设计网站建设

OTA简介 随着设备系统日新月异&#xff0c;用户如何及时获取系统的更新&#xff0c;体验新版本带来的新的体验&#xff0c;以及提升系统的稳定性和安全性成为了每个厂商都面临的严峻问题。OTA&#xff08;Over the Air&#xff09;提供对设备远程升级的能力。升级子系统对用户…

三明北京网站建设设计网站排名

[react] 怎么在JSX里属性可以被覆盖吗&#xff1f;覆盖的原则是什么&#xff1f; 会被覆盖&#xff0c;类似Object.assign&#xff0c;后面的覆盖前面的 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨…

C# invoke C++ method

1. Platform Invocation (P/Invoke) Set C++ project as dll, compile, copy compiled c++ dll to C# bin/debug matched location //C++ // ConsoleApplication1.cpp : This file contains the main function. Progra…

本土化优势凸显:Gitee如何成为中国开发团队的效率引擎

本土化优势凸显:Gitee如何成为中国开发团队的效率引擎 在全球数字化转型加速的背景下,中国开发者正面临着独特的挑战与机遇。作为国内领先的代码托管平台,Gitee凭借其深度本土化服务和技术合规优势,正在重塑企业级…

Linux系统OOM终止Oracle进程

提供的系统日志截图,这是一次典型的 Linux 系统因内存不足(Out of Memory, OOM)而强制终止进程的事件。系统内核为了保护自身不被完全挂起,选择了终止占用大量内存的 Oracle 数据库进程。 核心问题分析:根本原因:…

实用指南:《C++进阶之C++11》【可变参数模板 + emplace接口 + 新的类功能】

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Filebeat写ElasticSearch故障排查思路(上) - 教程

Filebeat写ElasticSearch故障排查思路(上) - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

告别 “一刀切” 管理!MyEMS 为不同行业定制专属能源优化方案

在能源管理领域,“一刀切” 的粗放式管理曾是行业普遍痛点 —— 统一的节能指标、相同的管控策略,既无法适配不同行业的能源消耗特性,也难以解决企业个性化的能耗难题。随着 “双碳” 目标推进与企业降本需求升级,…

网站你应该明白我的意思吗二级分销

一、问题 什么是悬空指针&#xff1f;为什么会出现&#xff1f;我们该如何避免悬空指针的出现&#xff1f; 二、解答 在C语言中&#xff0c;悬空指针指的是指向已删除&#xff08;或释放&#xff09;的内存位置的指针。如果一个指针指向的内存被释放&#xff0c;但指针本身并未…

贵阳公司网站建立网站开发费待摊年限

在Android项目中&#xff0c;如果你想在一个Gradle文件中引入另一个Gradle文件&#xff0c;你可以使用apply from语句。以下是一个简单的例子&#xff1a; 假设你有一个通用的Gradle配置脚本common.gradle&#xff0c;它位于项目的根目录下。 common.gradle 文件内容示例&…

网站运营有前途吗设计一个自己的电商网站

Varjo 的新一代头显将世界上最先进的混合现实技术与顶尖的图形处理能力连接起来&#xff0c;满足最高级别的视觉保真度和沉浸感至关重要的工业用例。 光学设计的根本性突破 体验全新的沉浸感。大幅扩展的视野&#xff0c;跨越 120 x 105 度&#xff0c;打破了受人尊敬的“全双眼…

网站建设工作小组推进表怎样才能把网站做好

文章目录 前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用 2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用 3. 结语 前言 群晖作为专业的数据存储中心&…

东莞制作网站公司企业网站风格

STM32——串口实践 1.蓝牙控制点灯 项目需求 通过蓝牙模块&#xff0c;实现手机控制蓝牙插座/风扇/灯。 本质&#xff1a; 采用蓝牙的透传功能&#xff1b; 控制 IO 口的输出。 硬件清单 HC01蓝牙模块 CH340 杜邦线 项目设计 HC01_TX – RX1 HC01_RX – TX1 项目…

Fourier Features Let Networks Learn High Frequency Functions in Low Dimensional Domains

[NIPS20] 建立“位置坐标-标量”的隐式神经表示过程中使用傅里叶特征映射对MLP性能增益的理论证明Fourier Features Let Networks Learn High Frequency Functions in Low Dimensional Domains 原文:从理论层面解释位…

「突发奇想,灵光乍现」 - hello

1. 困住自己的,是一种执着,和来自沉迷于某种欲望的享受。

BST(self saved)

#include<iostream> #include<cstdio> using namespace std; int root,tot; struct bst {int v,l,r,vnum,lnum;bst(){v=l=r=vnum=lnum=0;}void nw(int a){v=a;vnum=1;lnum=0;l=r=0;} }tree[1000010]; stru…

jenkins 用户权限 管理配置

这里使用插件 Role-based Authorization Strategy下载插件 插件 管理 搜 Role-based Authorization Strategy 点击下载 安装即可配置Role-based Authorization Strategy 插件 系统管理-全局安全配置-授权策略 选择,…

DirectX- DLL修复工具 免费下载!绿色单文件版!安装使用教程

软件介绍Cloudbox工具箱本身只有7.6M左右大小,一款开源免费的 Windows 聚合工具箱,主要分为四个部分,装机检测、系统常用、影音下载、其他工具。每一类中都有40多款软件,集成 198 款工具,提供绿色免安装软件,能简…