【SpringBoot3.x教程05】SpringBoot与关系型数据库的整合

前言:常用的ORM框架有哪些

JdbcTemplate

JdbcTemplate 是Spring框架提供的一个JDBC抽象库,旨在简化传统的JDBC操作,避免了繁琐的JDBC代码和数据库资源的手动处理。通过JdbcTemplate,开发者可以更加专注于业务逻辑而不是数据库的连接管理和资源释放。

核心特点

  • 简化数据库交互:自动处理连接的开启和关闭,减少了重复的数据库连接代码。
  • 异常处理:提供了一个统一的异常处理机制,将SQL异常转换为DataAccessException,方便异常管理。
  • 灵活的查询和更新操作:支持直接执行SQL查询和更新操作,以及调用存储过程。
  • 回调机制:通过RowMapperResultSetExtractor等回调接口,可以将数据库结果集映射到Java对象或集合。

使用场景:适用于需要直接使用SQL进行数据操作的场景,特别是在需要细粒度控制SQL执行和结果映射时。

Spring Data JPA

Spring Data JPA 是对JPA(Java Persistence API)的进一步封装和整合,目的是简化JPA的使用和提高开发效率。Spring Data JPA通过提供repository抽象层,使得数据库操作更加简单。

核心特点

  • 简化数据访问层(DAO)代码:通过扩展JpaRepository接口,自动实现了一系列标准的数据访问方法,如保存、删除、查询等。
  • 查询方法名解析:支持通过解析方法名自动生成查询,无需编写查询语句。
  • 查询注解:通过@Query注解,可以自定义JPQL(Java Persistence Query Language)或原生SQL查询。
  • 事务管理:整合了Spring的声明式事务管理。

使用场景:适用于JPA项目,特别是对于域驱动设计(DDD)和需要快速开发的应用程序。

MyBatis

MyBatis 是一个半ORM(对象关系映射)框架,提供了对象与数据库之间的映射,同时保留了编写原生SQL的能力。它避免了JDBC代码的繁琐和手动设置参数、获取结果集的过程,同时提供了更多的控制权和灵活性。

核心特点

  • 灵活的SQL编写:支持完全的SQL编写,使得开发者可以利用数据库的特性,如窗口函数、CTE(公用表表达式)等。
  • 动态SQL:支持动态SQL语句的构建,根据条件拼接不同的SQL片段。
  • 映射器(Mapper)XML文件:通过XML文件或注解定义SQL语句和映射规则。
  • 延迟加载:支持关联对象的延迟加载。

使用场景:适用于那些需要高度控制SQL语句,或数据库设计复杂、需要优化数据库查询性能的项目。

本文重点:学会三种方式的CRUD操作

第一步:引入pom依赖
<!-- MySQL 驱动 -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- Spring Boot Starter for Data JPA -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- Spring Boot Starter for JdbcTemplate -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- MyBatis Spring Boot Starter -->
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.4</version>
</dependency>
第二步:配置数据库属性
spring.datasource.url=jdbc:mysql://xxxx:3306/nextJava?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456# JPA特有配置
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true# MyBatis特有配置
mybatis.mapper-locations=classpath:mappers/*.xml
第三步:代码实现
  1. 使用JdbcTemplate
@Repository
public class UserRepository {@Autowiredprivate JdbcTemplate jdbcTemplate;// 增public int save(User user) {return jdbcTemplate.update("INSERT INTO user(name, email) VALUES(?, ?)",user.getName(), user.getEmail());}// 删public int deleteById(Long id) {return jdbcTemplate.update("DELETE FROM user WHERE id = ?", id);}// 改public int update(User user) {return jdbcTemplate.update("UPDATE user SET name = ?, email = ? WHERE id = ?",user.getName(), user.getEmail(), user.getId());}// 查public User findById(Long id) {return jdbcTemplate.queryForObject("SELECT * FROM user WHERE id = ?",new Object[]{id},(rs, rowNum) ->new User(rs.getLong("id"),rs.getString("name"),rs.getString("email")));}
}

2、使用Spring Data JPA

@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;private String email;// Constructors, Getters and Setters
}

使用Spring Data JPA,只需要定义接口,继承JpaRepository即可自动拥有增删改查功能:

public interface UserRepository extends JpaRepository<User, Long> {
}

3、使用Mybatis

在src/main/resources/mappers目录下创建MyBatis的映射文件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.mapper.UserMapper"><insert id="save" parameterType="com.example.model.User">INSERT INTO user(name, email) VALUES(#{name}, #{email})</insert><delete id="deleteById" parameterType="long">DELETE FROM user WHERE id = #{id}</delete><update id="update" parameterType="com.example.model.User">UPDATE user SET name = #{name}, email = #{email} WHERE id = #{id}</update><select id="findById" parameterType="long" resultType="com.example.model.User">SELECT * FROM user WHERE id = #{id}</select>
</mapper>

以及Mapper类

@Mapper
public interface UserMapper {void save(User user);void deleteById(Long id);void update(User user);User findById(Long id);
}

对应表创建语句为:

CREATE TABLE IF NOT EXISTS `User` (`id` BIGINT(20) NOT NULL AUTO_INCREMENT,`name` VARCHAR(255) NOT NULL,`email` VARCHAR(255) NOT NULL,PRIMARY KEY (`id`),UNIQUE KEY `email_unique` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

结束语

无论是使用JdbcTemplate来直接操作数据库,还是利用Spring Data JPA和MyBatis这样的ORM框架来简化数据持久层的开发,Spring Boot都以其"约定优于配置"的理念,让开发者能够集中精力于业务逻辑的实现,而不是纠结于繁琐的配置和底层实现细节。下一节我们来学习一下事务管理

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

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

相关文章

【网站项目】308学生档案管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

如何用Python3自撰一个简单的后端框架

不使用任何现有的后端框架来创建一个Python 3的后端框架是一个相当复杂的任务,因为它涉及到许多Web开发的基础知识,比如HTTP协议处理、路由、中间件、请求和响应处理等。然而,我们可以从最基本的概念开始,逐步构建一个简单的后端框架。 以下是一个非常基础的指南,用于创建…

Spring Webflux 详解

目录 0、组件对比 1、WebFlux 1、引入 2、Reactor Core 1、HttpHandler、HttpServer 3、DispatcherHandler 1、请求处理流程 4、注解开发 1、目标方法传参 2.返回值写法 5、文件上传 6、错误处理 7、RequestContext 8、自定义Flux配置 9、Filter WebFlux&am…

2024武汉国际氢能源与燃料电池展将在8月盛大开幕!

2024武汉国际氢能源及燃料电池产业博览会 同期举办&#xff1a;2024世界汽车制造技术暨智能装备博览会 时间&#xff1a;2024.8.14-16 地点&#xff1a;武汉国际博览中心 邀请函 主办单位&#xff1a; 湖北省汽车行业协会 湖北省机械行业联合会 湖北省汽车产业技术创新联…

查找数组元素相同的最后一组数组的第一个下标

题目 面试过程中&#xff0c;被问到这道面试题&#xff0c;做个记录&#xff1a; 有一组数组x&#xff1a; x{“11”,”aa”} 要比较的数组y是&#xff1a; y{“11”,”aa”,“11”,”aa”} y1{“11”,”aa”,“11”,”res”,”aa”} y2 {“11”,”11”,“11”,”aa”} 需…

为树莓派5编译Android14源码

为树莓派5编译Android14源码 1. 软硬件要求 官方推荐配置: https://source.android.google.cn/docs/setup/start/requirements?hl=zh-cn ubuntu22.04 虚拟机内存最低 16GB磁盘最低 360GB2. 安装依赖工具 官方文档:https://source.android.google.cn/docs/setup/start/init…

jieba模块中文分词应用场景案例

jieba 是一个在 Python 中广泛使用的中文分词库。由于其高效、准确和易用&#xff0c;jieba 在自然语言处理领域有着广泛的应用。下面我将通过一个简单的案例来展示 jieba 在中文分词中的应用场景。 案例&#xff1a;文本分类 假设我们有一个简单的文本分类任务&#xff0c;需…

Linux 之二:CentOS7 的 IP 常用命令和配置及 xshell 基本使用方法

1. 进入虚拟机 点击右键---进入终端--输入 ip adrr 或 ifconfig 查看ip地址 下面输入命令 ifconfig&#xff08;注意&#xff1a;不是 ipconfig &#xff09; 或 ip addr 来查看当前系统 IP 查看到IP 后&#xff0c;比如&#xff1a;上面是 192.168.184.137 1.1 IP 常用命令…

LeetCode142题:环形链表II(python3)

代码思路&#xff1a; 双指针的第一次相遇&#xff1a; 设两指针 fast&#xff0c;slow 指向链表头部 head 。 令 fast 每轮走 2 步&#xff0c;slow 每轮走 1 步。 fast 指针走过链表末端&#xff0c;说明链表无环&#xff0c;此时直接返回 null。 如果链表存在环&#xff0c;…

web学习笔记(二十六)

目录 1.JS执行队列 1.1JS是单线程 1.2Web Worker 1.3同步和异步 1.4JS执行机制 2.location对象 2.1什么是location对象 2.2url包含的信息 2.3location对象属性 2.4location对象的方法 3.navigator对象和history对象 3.1navigator对象 3.2history对象 1.JS执行队…

在Jupyter Notebook中安装第三方库

pip vs. conda pip 可以在所有环境下安装python包。conda 可以在conda环境下安装所有包。 如果你已经安装了python&#xff0c;那么这个选择对你来说是非常容易的&#xff1a; 如果你是用Anaconda或者Miniconda安装的python&#xff0c;那么请使用conda命令来安装python包。如…

原来我不会递归的原因是不会调试

visual 2022 关于debug和release的区别&#xff0c; 原谅我现在才知道 飞机降落--蓝桥 #include<iostream> using namespace std; struct node {int a, b, c; }q[11];int t, n;bool book[11]; // 标记第 i 架飞机是否降落bool dfs(int num, int last) {if (num n) r…

【MogDB】实战MogDB数据库适配Halo博客系统1.6版本(基于springframework+hibernate+HikariPool)

前言 前一篇文章说了MogDB适配Halo,【MogDB】将流行的博客系统Halo后端的数据库设置为MogDB,但是适配的是2.x版本&#xff0c;由于2.x版本已经引入了对postgresql的支持&#xff0c;而MogDB对于postgresql有很好的兼容性&#xff0c;因此适配起来很简单。但是由于halo2.x的版本…

初识JS

目录 javascript的作用: 浏览器如何执行JS代码&#xff1a; JS的三部分组成&#xff1a; ECMAScript: DOM: BOM: JS的三种书写导入方式&#xff1a; JS注释&#xff1a; JS的输入输出语句&#xff1a; JS变量,数据&#xff1a; 变量的使用&#xff1a; 声明变量&…

Linux的包管理和软件仓库常见问题有哪些?怎么解决

Linux的包管理和软件仓库在使用过程中可能会遇到一些问题&#xff0c;这些问题通常涉及软件的安装、更新、依赖关系、仓库配置等方面。以下是一些常见问题及其解决方法&#xff1a; 1. **软件包依赖问题**&#xff1a; - **问题**&#xff1a;在安装软件时&#xff0c;系统…

嵌入式学习第二十五天!(网络的概念)

网络&#xff1a; 可以用来&#xff1a;数据传输、数据共享 1. 网络协议模型&#xff1a; 1. OSI协议模型&#xff1a; 应用层实际收发的数据表示层发送的数据是否加密会话层是否建立会话连接传输层数据传输的方式&#xff08;数据包&#xff0c;流式&#xff09;网络层数据的…

Vue+SpringBoot打造医院门诊预约挂号系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 功能性需求2.1.1 数据中心模块2.1.2 科室医生档案模块2.1.3 预约挂号模块2.1.4 医院时政模块 2.2 可行性分析2.2.1 可靠性2.2.2 易用性2.2.3 维护性 三、数据库设计3.1 用户表3.2 科室档案表3.3 医生档案表3.4 医生放号…

SpringCloud Alibaba 学习

一&#xff1a;SpringCloud Alibaba介绍 Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服 务的必需组件&#xff0c;方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。 依托 Spring Cloud Alibaba&…

3-1大佬分享:字节跳动代码设计理念

面试官: 你好&#xff0c;今天我们来聊一聊抽象工厂模式。首先&#xff0c;你能概述一下什么是抽象工厂模式吗&#xff1f; 求职者: 当然。抽象工厂模式是一种创建型设计模式&#xff0c;它提供了一个接口来创建一系列相关或者相互依赖的对象&#xff0c;而不需要指定它们具体…

JavaScript实现点击鼠标弹钢琴的效果

思路&#xff1a; 图片设置宽900px&#xff0c;找到鼠标按下时的x坐标和img距离body的x坐标&#xff0c;两个值相减&#xff0c;然后除100取整&#xff0c;赋值给a&#xff0c;通过判断a的值来确定放出那个音乐。 完整代码&#xff1a; <!DOCTYPE html> <html lan…