SpringBoot——数据层三组件之间的关系
简单介绍
在之前的文章中,我们介绍了一下SpringBoot中内置的几种数据层的解决方案,在数据层由三部分组成,分别是数据库,持久化技术以及数据源,但是我今天写着写着,突然就想不起来这三部分到底是干什么的了,所以特意作文回忆一下我们这一路到底是用到现在的数据层模式的,以及我们一开始的数据模式是什么,主要还是想理一下这个三个组成部分的关系。
一切的开始
第一次接触数据库编程,基础的是MySQL,作为一款市场最广,最好上手的一款开源数据库,使用MySQL开局确实不错,但是第一次看到MySQL,他是这个样子的:
很好,很符合我对程序员的想象,就是一个朴实无华的黑框,没有任何的花里胡哨的作用,就是单纯的执行SQL语句,甚至有时候你换个行都会导致语句报错。
后来接触到了第一个数据可视化软件,这个因人而异,我第一次接触是NaiCat,有一些人是SQLyog,但是无论哪一个,猛地从小黑框换成一个可编程的界面多少还是有一点小惊喜的:
到了后来,除了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——数据层三组件之间的关系
简单介绍 在之前的文章中,我们介绍了一下SpringBoot中内置的几种数据层的解决方案,在数据层由三部分组成,分别是数据库,持久化技术以及数据源,但是我今天写着写着,突然就想不起来这三部分到底是干什么的了…...

LeetCode647.Palindromic-Substrings<回文子串>
题目: 思路: 错误代码:(缺少部分判断) 使用的是寻找回文子串的方法。以一个点为中心向两边扫描。但是有一点小问题。 因为回文子串是分奇偶的,所以需要两种判断方式。 看了下答案后发现我的代码距离答案一…...
React的hooks---useContext
Context 提供了一个无需为每层组件手动添加 props ,就能在组件树间进行数据传递的方法,useContext 用于函数组件中订阅上层 context 的变更,可以获取上层 context 传递的 value prop 值 useContext 接收一个 context 对象(React.…...

【Terraform学习】TerraformCloud入门介绍(快速入门)
TerraformCloud入门介绍 什么是 TerraformCloud? 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脚本文件格式不同,如果在脚本中有空行,脚本是在Windows下进行编辑之后上传到linux上去执行的话,…...

数据安全之全景图系列——数据分类分级落地实践
1、数据分类分级现状 我们正处于一个数据爆炸式增长的时代,随着产业数字化转型升级的推进,数据已被国家层面纳入生产要素,并且成为企业、社会和国家层面重要的战略资源。数据分类分级管理不仅是加强数据交换共享、提升数据资源价值的前提条件…...
C++实现MySQL数据库连接池
C实现MySQL数据库连接池 涉及技术 MySQL数据库编程、单例模式、STL容器、C11多线程(线程互斥、线程互斥、线程同步通信和unique_lock)、智能指针shared_ptr、lambda表达式、生产者-消费者线程模型。 项目背景 为了提升MySQL数据库(基于C/…...
day4 驱动开发 c语言学习
不利用系统提供的register_chrdev,自己实现字符设备的注册 底层代码 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 " #注意:在末尾的“引号”与“S”之间,加入一位空格,将日期时间和历史命令用空格相隔开来。 你也可以换一种清晰的形式,效果…...
Django接口返回JSON格式数据报文
目录 遇到问题 Django返回json结构报文 不可行方式python json 可行方式JsonResponseQuerySet.values()。 python的两个web框架,flask和django,两者都具有view 模板的章节,但是当前开发一个应用,大部分采用前后端分离的合作方式。…...

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

【Docker consul的容器服务更新与发现】
文章目录 一、Consul 的简介(1)什么是服务注册与发现(2)什么是consul 二、consul 部署1、consul服务器1. 建立 Consul 服务2. 查看集群信息3. 通过 http api 获取集群信息 2、registrator服务器1. 安装 Gliderlabs/Registrator2. …...

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

服务器 Docker Alist挂载到本地磁盘(Mac版)夸克网盘
1.服务器下载alist 默认有docker环境 docker pull xhofe/alist2.生成容器 -v /home/alist:/opt/alist/data 这段意思是alist中的数据映射到docker 主机的文件夹,/home/alist就是我主机的文件夹,这个文件夹必须先创建 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、注解的作用 (1)不是程序本身,可以对程序做出解释(和注释相同) (2)可以被其他程序读取,…...

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

kafka 总结宝典
...

跨平台力量:探索C++Qt框架的未来前景
卓越的跨平台支持:CQt可以在多个平台上运行,包括Windows、Mac、Linux、Android和iOS等。这使得开发者能够使用同一份代码构建跨平台的应用程序,从而显著降低了开发成本和时间投入。 丰富的类库和工具:CQt提供了广泛的类库和工具&…...
基于长短期神经网络LSTM的位移监测,基于长短期神经网络的位移预测,LSTM的详细原理
目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 基于长短期神经网络LSTM的位移监测 完整代码: https://download.csdn.net/download/abc991835105/88098131 效果图 结果分析 展望 参考论文 背影 路径追踪预测,对实现自动飞行驾驶拥有重要意义,长短期神经网络是一种改进党的…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...

手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...

软件工程 期末复习
瀑布模型:计划 螺旋模型:风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合:模块内部功能紧密 模块之间依赖程度小 高内聚:指的是一个模块内部的功能应该紧密相关。换句话说,一个模块应当只实现单一的功能…...

实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...

如何在Windows本机安装Python并确保与Python.NET兼容
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...

leetcode_69.x的平方根
题目如下 : 看到题 ,我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历,我们是整数的平方根,所以我们分两…...