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

news2024/11/16 20:35:59

简单介绍

在之前的文章中,我们介绍了一下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的东西,去体验一下最底层,最单纯的美好。 

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

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

相关文章

助你丝滑过度到 Vue3 生命自定义hooktoRef ②⑥

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; VUE3~TS &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f449;…

TCP状态转换图

TCP状态转换图 了解TCP状态转换图可以帮助开发人员查找问题. 说明: 上图中粗线表示主动方, 虚线表示被动方, 细线部分表示一些特殊情况, 了解即可, 不必深入研究. 对于建立连接的过程客户端属于主动方, 服务端属于被动接受方(图的上半部分) 而对于关闭(图的下半部分), 服务端…

JVM内存的变化

我举得&#xff0c;从空间的角度去理解java的运行&#xff0c;能更深刻的帮助我们学习后面“面向对象”的知识。因此&#xff0c;单独拿出一章&#xff0c;来解释内存的变化。以程序为实例进行判断。 需要一点JVM运行时的内存状态知识点基础。 参考博客&#xff1a; 这种是不…

ubuntu20.04 安装 Qt5.15

目录 安装前工作 选择安装QT的哪个版本 安装时候选择哪些组件 安装Qt5.15 在线安装 我选择的组件 源码包安装 测试 安装前工作 ubuntu20.04.3安装Qt6.22操作步骤_ubuntu安装qt6_sonicss的博客-CSDN博客 # 安装g、gcc编译器 sudo apt-get install build-essential 安装l…

leetcode 455. 分发饼干

2023.7.27 今天起福州要刮台风了&#xff0c;不过还是在宿舍坚持每日一题。 今天开始刷的系列属于贪心算法系列。本题是贪心算法的一个入门题。 贪心算法总体思路就是先找局部最优&#xff0c;在一步步的找出全局最优。 本题很明显全局最优就是 需要尽可能多投喂更多的孩子。…

「双指针技巧解决一些数组问题」

文章目录 0 分类1 快慢指针刷题1.1 删除有序数组中的重复项题解Code结果 1.2 删除排序链表中的重复元素题解Code结果 1.3 移除元素题解Code结果 1.4 移动0题解Code 2 左右指针刷题2.1 二分查找2.2 两数之和 II - 输入有序数组题解Code结果 2.3 反转字符串题解Code结果 2.4 最长…

品牌渠道管理的逻辑

无规矩不成方圆&#xff0c;规则确定了&#xff0c;接下来就是推行这个规则并且执行落地就可以&#xff0c;所以明确问题制定规则就非常重要。这个原则也适用于品牌渠道管理工作&#xff0c;品牌面对经销商低价乱价等问题时&#xff0c;如果仅用打击一种方式去管理&#xff0c;…

Component template should contain exactly one root element

在vue中报错&#xff1a; Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead报错的大致意思是&#xff1a;组件的模板应该只能包含一个根元素&#xff0c;也就是是说作为元素的直…

科技项目验收测试:验证软件产品功能与性能的有效手段

科技项目验收测试是验证软件产品功能与性能的重要手段&#xff0c;在项目开发中起到了至关重要的作用。本文将从产品质量、需求验证、性能测试等方面&#xff0c;探讨科技项目验收测试的有效手段。 1、产品质量保证是验收测试的核心 科技项目验收测试的核心目标是验证软件产品…

DFS()

DFS之连通性模型 dfs 与 bfs都能判断连通性 而且bfs可以得出最短距离 而dfs不可以 dfs 代码比较简洁 迷宫 一天Extense在森林里探险的时候不小心走入了一个迷宫&#xff0c;迷宫可以看成是由 n∗nn∗n 的格点组成&#xff0c;每个格点只有2种状态&#xff0c;.和#&#xff0…

【小尘送书-第三期】Python机器学习:基于PyTorch和Scikit-Learn 》

大家好&#xff0c;我是小尘&#xff0c;欢迎关注&#xff0c;一起交流学习&#xff01;欢迎大家在CSDN后台私信我&#xff01;一起讨论学习&#xff0c;讨论如何找到满意的实习&#xff01; 本文目录 一、前言二、作者简介三、内容简介四、抽奖方式 一、前言 近年来&#xff0…

Vue-resource 实现 get, post请求

Vue-resource是Vue高度集成的第三方包&#xff0c;能很方便的发送请求。 注意Vue-resource依赖于Vue&#xff0c;只能在Vue环境下使用。 导包 //依赖于Vue <script src"./js/vue.js"></script> <script src"./js/elementui.js"></…

ROS与STM32通信-rosserial

文章目录 硬件接线 软件STM32CubeMX配置 rosserial移植上位机订阅-下位机发布上位机订阅下位机发布通信 上位机发布-下位机订阅上位机发布下位机订阅通信 硬件 STM32F103c8t6OLED(I2C)USB2TTLStlink 接线 OLED(GPIO模拟I2C) 硬件引脚OLEDSCLPA4OLEDSDAPA5 USART1 硬件引脚…

SwipeDelMenuLayout失效:Could not find SwipeDelMenuLayout-V1.3.0.jar

一、问题描述 最近在工作上的项目中接触到SwipeDelMenuLayout这个第三方Android开发库&#xff0c;然后我就根据网上的教程进行配置。这里先说一下我的开发环境&#xff1a;Android Studio版本是android-studio-2020.3.1.24-windows&#xff0c;gradle版本是7.0.2。 首先是在se…

LeetCode53.Maximum-Subarray<最大子数组和>

题目&#xff1a; 思路&#xff1a; 这题不会啊...然后发现题解如此简单, 逐层判断.得到最大值. 每次取得当前的最大值.并且更新结果最大值,结果循环扫描后得到结果 代码是&#xff1a; //codeclass Solution { public:int maxSubArray(vector<int>& nums) {int p…

【HarmonyOS】ArkTS自定义组件如何调用通用属性?

【关键词】 ArkTS、通用属性、 BuilderParam 【问题背景】 有个开发者使用ArkTS自定义了一个子组件AnimationButton&#xff0c;里面用到了装饰器 BuilderParam&#xff0c;在父页面中引用的时候使用自定义组件时&#xff0c;使用以下方式调用&#xff1a; 就报了这个错 【问…

基于双 STM32+FPGA 的桌面数控车床控制系统设计

桌 面数控 设 备 对 小 尺寸零件加工在成 本 、 功 耗 和 占 地 面 积等方 面有 着 巨 大 优 势 。 桌 面数控 设 备 大致 有 3 种 实 现 方 案 : 第 一种 为 微 型 机 床搭 配 传统 数控系 统 &#xff0c; 但 是 桌 面数控 设 备 对 成 本 敏感 ; 第二 种 为 基 于 PC…

《TCP IP网络编程》第十一章

第 11 章 进程间通信 11.1 进程间通信的基本概念 通过管道实现进程间通信&#xff1a; 进程间通信&#xff0c;意味着两个不同的进程中可以交换数据。下图是基于管道&#xff08;PIPE&#xff09;的进程间通信的模型&#xff1a; 可以看出&#xff0c;为了完成进程间通信&…

React入门学习笔记1

前言 React是一个用来动态构0建用户界面的JavaScript库&#xff08;只关注于视图&#xff09;。它可以帮助开发人员轻松地创建复杂的交互式界面&#xff0c;以及管理与用户交互的状态。相比于其他的JavaScript框架&#xff0c;React采用了一种不同的编程模型&#xff0c;称为“…