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

SpringBoot——数据层三组件之间的关系

简单介绍

在之前的文章中,我们介绍了一下SpringBoot中内置的几种数据层的解决方案,在数据层由三部分组成,分别是数据库,持久化技术以及数据源,但是我今天写着写着,突然就想不起来这三部分到底是干什么的了,所以特意作文回忆一下我们这一路到底是用到现在的数据层模式的,以及我们一开始的数据模式是什么,主要还是想理一下这个三个组成部分的关系。

一切的开始

第一次接触数据库编程,基础的是MySQL,作为一款市场最广,最好上手的一款开源数据库,使用MySQL开局确实不错,但是第一次看到MySQL,他是这个样子的:

很好,很符合我对程序员的想象,就是一个朴实无华的黑框,没有任何的花里胡哨的作用,就是单纯的执行SQL语句,甚至有时候你换个行都会导致语句报错。

后来接触到了第一个数据可视化软件,这个因人而异,我第一次接触是NaiCat,有一些人是SQLyog,但是无论哪一个,猛地从小黑框换成一个可编程的界面多少还是有一点小惊喜的:Navicat Essentials | 简单的数据库管理和开发工具

到了后来,除了MySQL,开始深入其他的编程语言,我第一个接触的编程语言是Java,然后在很长的一段时间,我用的都是这个: 直到现在我依然觉得这个很好用,能在代码和SQL界面之间切换,还是很不错的。

说回编程

对于SQL的编程,之前学习的SQL语言自然不用多说,这是肯定都会的,然后就是Java连接数据库。既然是Java连接SQL数据库编程,肯定离不开的就是JDBC

package com.example.springbootsum.pojo;import java.sql.*;
import java.util.HashMap;public class JDBC {public static void main(String[] args) throws Exception {
//        数据源Class.forName("com.mysql.cj.jdbc.Driver");String url = "jdbc:mysql://localhost:3306/jdbc";String username = "root";String password = "数据库密码";Connection connection = DriverManager.getConnection(url, username, password);Statement statement = connection.createStatement();
//        持久化String sql = "select * from user";ResultSet resultSet = statement.executeQuery(sql);HashMap<Integer,String> user = new HashMap<Integer, String>();while (resultSet.next()){user.put(resultSet.getInt("id"), resultSet.getString("name"));}System.out.println(user);}
}

 有点简陋,但是道理是一样的。

我们在使用JDBC的时候就说过,首先你的数据库账号和密码都在代码里,不安全。你的SQL也在代码里,不安全。而且你要说更换自己的SQL就得从代码里找自己的SQL写在哪里,如果你要是编码习惯好点,你把SQL都写在统一的地方,还好说,你要是跟我一样写的像是Shift一样,自己看了都给自己气笑了了的程度那我劝你善良。

这是第一阶段,这个时候对于Java操作数据库仅仅是做了解,那时候我还是学的JavaWeb,比起数据库,更吸引我的还是炫酷的前端动画和框架,以及动态网页,至于数据库,那都是后话。得到了对于JDBC熟悉了之后,就开始接触另一个东西叫做JavaEE,然后就开始接触成熟的框架,那个时候才对数据源,持久化技术这种东西。

我在JDBC的代码中也表明了数据源和持久化技术的底层代码都是什么,数据源就是数据库连接对象,之前是你把数据库连接信息写在代码里自己手动生成数据源连接对象,然后操作SQL语句,数据源说你写的代码不严谨,我来帮你吧。

然后数据源这个东西就出现了,第一个接触的数据源就是Druid,然后顺便也开始使用框架去进行规范的开发流程,只不过那时候的框架还是原生的Spring,需要写的代码和配置文件还是不少。

从一开始的XML方式开发,到后来的纯注解式开发,数据源需要写的基本就只剩下用户名和密码以及url,直接就能获取一个现成的,完整的数据库连接对象,岂不美哉。

那么说回来,数据源的标准定义如下:

数据源,简单理解为数据源头,提供了应用程序所需要数据的位置。数据源保证了应用程序与目标数据之间交互的规范和协议,它可以是数据库,文件系统等等。其中数据源定义了位置信息,用户验证信息和交互时所需的一些特性的配置,同时它封装了如何建立与数据源的连接,向外暴露获取连接的接口。

当然是百度的,这么长一段我可记不住。

我用到现在也还停留在数据源就是我给他一组数据库连接信息他给我一个完美的数据库连接对象的程度,我承认,我不是一个好的程序员。

后来一个数据源不够用,当你的服务对外开放之后,你的数据库会被很多人访问,这时候单个的数据源肯定是不够用的,这时候就出现了数据库连接池,可以一次创建多个数据源供人使用,节省资源,这就是后话了。

持久化技术

持久化技术就是在JDBC中的后半部分,也就是我们在Java中执行SQL代码将数据写入数据库中或者说将数据库中的数据读取出来的过程。一开始的持久化技术非常的繁琐,你需要自己写SQL,自己写结果集的处理,自己将结果集的单个字段于Java对象建立连接,那时候做个开发很难,写这些SQL展示到自己的网页里就非常的麻烦,后来开始解除了另一种简单一些的持久化技术,JdbcTemplate。

这种技术之前已经演示过了,确实是节省了处理结果集的步骤,但是依然没有解决SQL的硬编码问题,在这个阶段开发舒服了一些,最直观的就是可以直接将数据集与Java对象关联起来。

后来开始接触Spring框架,然后是MyBatis,这时候的后端开发就很方便了,可以将SQL语句写在配置文件中,或者是直接以注释参数的方式写在接口中,然后直接通过方法返回一个对象,在Java里操作对象会方便很多。

后来进化到了MyBatis-Plus,更快更方便的制作数据层的持久化,与数据库的交互就更容易了。

关于持久化技术,他的官方定义是这样的:

将内存中的瞬时数据保存到存储设备中。

这个我努努力能记得住,但是讲真的,我用到现在的持久化基础除了写道数据库里就是写在文件里,其他的使用场景,还真的挺少,果然,我是一个FW程序员。

尽管现在的开发速度越来越快,开发流程越来越成熟,但是偶尔我还是会写一些JDBC的东西,去体验一下最底层,最单纯的美好。 

相关文章:

SpringBoot——数据层三组件之间的关系

简单介绍 在之前的文章中&#xff0c;我们介绍了一下SpringBoot中内置的几种数据层的解决方案&#xff0c;在数据层由三部分组成&#xff0c;分别是数据库&#xff0c;持久化技术以及数据源&#xff0c;但是我今天写着写着&#xff0c;突然就想不起来这三部分到底是干什么的了…...

LeetCode647.Palindromic-Substrings<回文子串>

题目&#xff1a; 思路&#xff1a; 错误代码&#xff1a;&#xff08;缺少部分判断&#xff09; 使用的是寻找回文子串的方法。以一个点为中心向两边扫描。但是有一点小问题。 因为回文子串是分奇偶的&#xff0c;所以需要两种判断方式。 看了下答案后发现我的代码距离答案一…...

React的hooks---useContext

Context 提供了一个无需为每层组件手动添加 props &#xff0c;就能在组件树间进行数据传递的方法&#xff0c;useContext 用于函数组件中订阅上层 context 的变更&#xff0c;可以获取上层 context 传递的 value prop 值 useContext 接收一个 context 对象&#xff08;React.…...

【Terraform学习】TerraformCloud入门介绍(快速入门)

TerraformCloud入门介绍 什么是 TerraformCloud&#xff1f; Terraform Cloud是Hashicorp Terraform的SaaS版本。 免费版功能 免费版功能包括版本控制集成、远程计划和实施远程计划和实施、通知及webhook、全http API驱动、状态管理、模拟计划、私有化模块注册器以及全HTTP界…...

linux实现运行java分包部署

1.打好包之后 找到bin文件夹下的 startup.sh文件 2.cd 进入bin文件夹下 3.执行 sh startup.sh 运行命令 4.如果出现此错误 是Windows和Linux的.sh脚本文件格式不同&#xff0c;如果在脚本中有空行&#xff0c;脚本是在Windows下进行编辑之后上传到linux上去执行的话&#xff0c…...

数据安全之全景图系列——数据分类分级落地实践

1、数据分类分级现状 我们正处于一个数据爆炸式增长的时代&#xff0c;随着产业数字化转型升级的推进&#xff0c;数据已被国家层面纳入生产要素&#xff0c;并且成为企业、社会和国家层面重要的战略资源。数据分类分级管理不仅是加强数据交换共享、提升数据资源价值的前提条件…...

C++实现MySQL数据库连接池

C实现MySQL数据库连接池 涉及技术 MySQL数据库编程、单例模式、STL容器、C11多线程&#xff08;线程互斥、线程互斥、线程同步通信和unique_lock&#xff09;、智能指针shared_ptr、lambda表达式、生产者-消费者线程模型。 项目背景 为了提升MySQL数据库&#xff08;基于C/…...

day4 驱动开发 c语言学习

不利用系统提供的register_chrdev&#xff0c;自己实现字符设备的注册 底层代码 led.c #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include <linux/io.h> #include "head.h…...

history命令:显示命令执行时间

1.修改配置文件 vim /etc/profile 添加内容 export HISTTIMEFORMAT"%Y-%m-%d %H:%M:%S " ​ #注意&#xff1a;在末尾的“引号”与“S”之间&#xff0c;加入一位空格&#xff0c;将日期时间和历史命令用空格相隔开来。 你也可以换一种清晰的形式&#xff0c;效果…...

Django接口返回JSON格式数据报文

目录 遇到问题 Django返回json结构报文 不可行方式python json 可行方式JsonResponseQuerySet.values()。 python的两个web框架&#xff0c;flask和django&#xff0c;两者都具有view 模板的章节&#xff0c;但是当前开发一个应用&#xff0c;大部分采用前后端分离的合作方式。…...

OBS 迁移--华为云

一、创建迁移i任务 1. 登录管理控制台。 2. 单击管理控制台左上角的 在下拉框中选择区域。 3. 单击“ 服务列表 ”&#xff0c;选择“ 迁移 > 对象存储迁移服务 OMS ”&#xff0c;进入“ 对象存储迁移服务 ”页面。 4. 单击页面右上角“ 创建迁移任务 ”。 5. 仔细阅读…...

【Docker consul的容器服务更新与发现】

文章目录 一、Consul 的简介&#xff08;1&#xff09;什么是服务注册与发现&#xff08;2&#xff09;什么是consul 二、consul 部署1、consul服务器1. 建立 Consul 服务2. 查看集群信息3. 通过 http api 获取集群信息 2、registrator服务器1. 安装 Gliderlabs/Registrator2. …...

MFC第二十天 数值型关联变量 和单选按钮与复选框的开发应用

文章目录 数值型关联变量数值型关联变量的种类介绍 单选按钮与复选框单选按钮的组内选择原理解析单选按钮和复选框以及应用数值型关联变量的开发CMainDlg.cppCInputDlg.hCInputDlg.cpp 附录 数值型关联变量 数值型关联变量的种类介绍 1、 数值型关联变量&#xff1a; a)控件型…...

服务器 Docker Alist挂载到本地磁盘(Mac版)夸克网盘

1.服务器下载alist 默认有docker环境 docker pull xhofe/alist2.生成容器 -v /home/alist:/opt/alist/data 这段意思是alist中的数据映射到docker 主机的文件夹&#xff0c;/home/alist就是我主机的文件夹&#xff0c;这个文件夹必须先创建 docker run -d --restartalways…...

EMP-SSL: TOWARDS SELF-SUPERVISED LEARNING IN ONETRAINING EPOCH

Recently, self-supervised learning (SSL) has achieved tremendous success in learning image representation. Despite the empirical success, most self-supervised learning methods are rather “inefficient” learners, typically taking hundreds of training epoch…...

注解和反射01--什么是注解

注解 什么是注解内置注解元注解自定义注解 什么是注解 1、注解是从JDK5.0开始引入的新技术 2、注解的作用 &#xff08;1&#xff09;不是程序本身&#xff0c;可以对程序做出解释&#xff08;和注释相同&#xff09; &#xff08;2&#xff09;可以被其他程序读取&#xff0c…...

虚拟机 RHEL8 安装 MySQL 8.0.34

目录 安装步骤一、清除所有残留的旧MySQL二、安装MySQL 报错问题1. 提示未找到匹配的参数&#xff1a; mysql-community-server2. 公钥问题 安装步骤 一、清除所有残留的旧MySQL 1. 关闭MySQL [rootlocalhost /]# service mysqld stop Redirecting to /bin/systemctl stop …...

kafka 总结宝典

...

跨平台力量:探索C++Qt框架的未来前景

卓越的跨平台支持&#xff1a;CQt可以在多个平台上运行&#xff0c;包括Windows、Mac、Linux、Android和iOS等。这使得开发者能够使用同一份代码构建跨平台的应用程序&#xff0c;从而显著降低了开发成本和时间投入。 丰富的类库和工具&#xff1a;CQt提供了广泛的类库和工具&…...

基于长短期神经网络LSTM的位移监测,基于长短期神经网络的位移预测,LSTM的详细原理

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 基于长短期神经网络LSTM的位移监测 完整代码: https://download.csdn.net/download/abc991835105/88098131 效果图 结果分析 展望 参考论文 背影 路径追踪预测,对实现自动飞行驾驶拥有重要意义,长短期神经网络是一种改进党的…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

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

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

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...

Pydantic + Function Calling的结合

1、Pydantic Pydantic 是一个 Python 库&#xff0c;用于数据验证和设置管理&#xff0c;通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发&#xff08;如 FastAPI&#xff09;、配置管理和数据解析&#xff0c;核心功能包括&#xff1a; 数据验证&#xff1a;通过…...

【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解

一、前言 在HarmonyOS 5的应用开发模型中&#xff0c;featureAbility是旧版FA模型&#xff08;Feature Ability&#xff09;的用法&#xff0c;Stage模型已采用全新的应用架构&#xff0c;推荐使用组件化的上下文获取方式&#xff0c;而非依赖featureAbility。 FA大概是API7之…...