后端(JDBC)学习笔记(CLASS 1):基础篇(一)

一、引言

1、数据的存储

开发java程序的时候,数据都是存储在内存中,属于临时存储,当程序停止或重启时,内存中的数据就丢失了。为了解决数据的长期存储问题,有如下解决方案:

1、数据通过I/O流技术,存储在本地磁盘中,解决了持久化问题,但是没有结构和逻辑,不方便管理和维护。

2、通过关系型数据库,将数据按照特定的格式交由数据库管理系统维护。关系型数据库是通过库和表分隔不同的数据,表中存储的方式是行和列,区分相同格式不同值的数据

2、数据的操作

通过jdbc使用java程序对数据库进行(CRUD)操作

二、JDBC

1、概念

1、JDBC:Java DataBase Connectivity,意为java数据库连接

2、JDBC是java提供的一组独立于任何数据库管理系统的API

3、Java提供接口规范,由各个数据库厂商提供接口的实现,厂商提供的实现类封装成jar文件,也就是我们俗称的数据库驱动jar包

4、学习JDBC,充分体现了面向接口编程的好处,程序员只关心标准和规范,而无需关注实现过程 

2、JDBC的核心组成

接口规范:

1、为了项目代码的可移植性、可维护性,制定了Java程序连接各种数据库的统一接口规范。这样的话,不管是连接哪一种DBMS软件,Java代码可以保持一致性。

2、接口存储在java.sql和javax.sql包下

实现规范:

1、接口规范交由各个数据库厂商实现

2、将实现内容封装成jar文件,我们只需引入即可

三、JDBC快速入门

1、JDBC搭建步骤

1、准备数据库

2、官网下载数据库连接驱动jar包(使用mavan,不需下载)

3、创建Java项目,在项目下创建lib文件夹,将下载的驱动jar包复制到文件夹里

4、选中lib文件夹右键->Add as Library,与项目集成

5、编写代码

2、代码实现

1、以下为示例数据库的sql文件代码

-- 图书管理系统数据库(简化版)
CREATE DATABASE IF NOT EXISTS library_management;
USE library_management;-- 图书表
CREATE TABLE books (id INT PRIMARY KEY AUTO_INCREMENT,title VARCHAR(255) NOT NULL,author VARCHAR(100) NOT NULL,publisher VARCHAR(100) NOT NULL,publish_year YEAR NOT NULL,isbn VARCHAR(20) UNIQUE NOT NULL,category VARCHAR(50) NOT NULL,total_copies INT NOT NULL DEFAULT 1,available_copies INT NOT NULL DEFAULT 1,location VARCHAR(50) NOT NULL -- 书架位置
);-- 插入图书假数据
INSERT INTO books (title, author, publisher, publish_year, isbn, category, total_copies, available_copies, location) VALUES
('Python编程:从入门到实践', '埃里克·马瑟斯', '人民邮电出版社', 2016, '9787115428028', '编程', 5, 5, 'A区-1架'),
('数据结构与算法分析', '马克·艾伦·维斯', '机械工业出版社', 2019, '9787111641247', '计算机', 3, 3, 'A区-2架'),
('红楼梦', '曹雪芹', '人民文学出版社', 2018, '9787020002207', '文学', 4, 4, 'B区-1架'),
('三国演义', '罗贯中', '人民文学出版社', 2015, '9787020090008', '文学', 6, 6, 'B区-1架'),
('算法导论', '托马斯·H·科尔曼', '机械工业出版社', 2013, '9787111407010', '计算机', 2, 2, 'A区-3架'),
('人类简史', '尤瓦尔·赫拉利', '中信出版社', 2017, '9787508647357', '历史', 5, 5, 'C区-2架'),
('活着', '余华', '作家出版社', 2012, '9787506365437', '文学', 8, 8, 'B区-2架'),
('数学之美', '吴军', '人民邮电出版社', 2014, '9787115379320', '数学', 3, 3, 'D区-1架'),
('解忧杂货店', '东野圭吾', '南海出版公司', 2014, '9787544270878', '小说', 7, 7, 'B区-3架'),
('三体', '刘慈欣', '重庆出版社', 2008, '9787536692930', '科幻', 10, 10, 'E区-1架');

2、以下为java程序的实现,由于使用maven进行管理,无需导包等操作,只需要在pom.xml中添加依赖即可

package org.lib_mana;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;public class quickSQL {public static void main(String[] args) throws Exception {
//        1、注册驱动(由于使用maven进行管理则省去该步骤0//        2、获取连接对象
//        这是url的固定结构String url = "jdbc:mysql://localhost:3306/library_management";String username = "root";String password = "20050824";Connection connection = DriverManager.getConnection(url, username, password);//        3、获取执行sql语句的对象Statement statement = connection.createStatement();//        4、编写sql语句并执行ResultSet resultSet = statement.executeQuery("select id,title,author,isbn,location from books");while (resultSet.next()) {int id = resultSet.getInt("id");String title = resultSet.getString("title");String author = resultSet.getString("author");String isbn = resultSet.getString("isbn");String location = resultSet.getString("location");System.out.println(id+","+title+","+author+","+isbn+","+location);}//        5、释放资源resultSet.close();statement.close();connection.close();}
}

四、核心API理解

1、注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");

在Java中,当使用JDBC连接数据库时,需要加载数据库特定的驱动程序,以便与数据库进行通信

从JDK6开始,不需要显式地调用Class.forName()来加载JDBC驱动程序,只要在类路径中集成了对应的jar文件,会自动在初始化时注册驱动程序

2、Connection

1、Connection接口是JDBC API的重要接口,用于建立与数据库的通信通道。换而言之,Connection对象不为空,则代表一次数据库连接

2、在建立连接时,需要指定数据库URL、用户名、密码参数

URL:jdbc:mysql://localhost:3306/atguigu

jdbc:mysql://IP地址:端口号/数据库名?参数键值对1&参数键值对2

3、Connection接口还负责管理事务,接口提供了commit和rollback方法,用于提交事务和回滚事务

4、可以创建Statement对象,用于执行SQL语句并与数据库进行交互

5、在使用JDBC技术时,必须要先获取Connection对象,并且最后需要释放资源

3、Statement

1、Statement接口用于执行SQL语句并与数据库进行交互。它是JDBC API中一个重要接口。通过Statement对象,可以向数据库发送SQL语句并执行结果

2、结果可以是一个或多个结果

增删改:受影响行数单个结果

查询:单行单列、多行多列、单行多列结果

3、但是Statement接口在执行SQL语句时会产生SQL注入攻击问题:

当使用Statement执行动态构建的SQL查询时,往往需要将查询条件与SQL语句拼接在一起,直接将参数和SQL语句一并生成,让SQL的查询条件始终为true得到结果

4、PreparedStatement

1、preparedStatement是Statement接口的子接口,用于执行预编译的SQL查询,作用如下:

预编译的SQL语句:在创建PreparedStatement时,就会预编译SQL语句,也就是SQL语句以及固定

防止SQL注入:PreparedStatement支持参数化查询,将数据作为参数传递到SQL语句中,采用?占位符的方式。将传入的参数用一对单引号包裹起来,无论传递什么都作为值,有效防止传入关键字或值导致SQL注入问题

性能提升:PreparedStatement是预编译SQL语句,同一SQL语句多次执行的情况下,可以复用,不必每次重新编译和解析

2、后续的学习我们都是基于PreparedStatement进行实现,更安全,效率更高!

以下为示例代码:

package org.lib_mana;import java.sql.*;
import java.util.Scanner;public class quickSQL {public static void main(String[] args) throws Exception {
//        1、注册驱动(由于使用maven进行管理则省去该步骤0//        2、获取连接对象
//        这是url的固定结构String url = "jdbc:mysql://localhost:3306/library_management";String username = "root";String password = "20050824";Connection connection = DriverManager.getConnection(url, username, password);//        3、获取执行sql语句的对象String sql = "select * from books where id= ?";PreparedStatement statement = connection.prepareStatement(sql);//        4、编写sql语句并执行Scanner input = new Scanner(System.in);String book_id = input.nextLine();statement.setString(1,book_id);System.out.println(sql);ResultSet resultSet = statement.executeQuery();while (resultSet.next()) {int id = resultSet.getInt("id");String title = resultSet.getString("title");String author = resultSet.getString("author");String isbn = resultSet.getString("isbn");String location = resultSet.getString("location");System.out.println(id+","+title+","+author+","+isbn+","+location);}//        5、释放资源resultSet.close();statement.close();connection.close();}
}

此时输入的任何的值都会被解析为值,防止被sql注入

5、ResultSet

1、ResultSet是JDBC API中的一个接口,用于表示从数据库中执行查询语句所返回的结果集。它提供了一种用于遍历和访问查询结果的方式

2、遍历结果:ResultSet可以使用next()方法将游标移动到结果集的下一行,逐行遍历数据库查询的结果,返回值为boolean类型,true代表有下一行,false则代表没有

3、获取单列结果:可以通过getXxx的方法获取单列的数据,该方法为重载方法,支持索引和列名进行获取

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

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

相关文章

卷对卷(Roll-to-Roll,R2R)技术的应用领域和技术进展

目录:第一节:卷对卷技术及其应用领域和工艺要求一、卷对卷技术发展现概述二、卷对卷研发和规模化应用难点重点和发展趋势三、卷对卷工艺主要应用领域及工艺要求第二节:卷对卷生产工艺参数及质量控制四、卷对卷生产工艺控制参数和条件五、卷对…

【Ansible】管理变量和事实知识点

1.Ansible变量名由什么组成&#xff1f;答&#xff1a;变量名必须以字母开头&#xff0c;且只能含有字母、数字和下划线。2.定义变量的方法及变量的优先级&#xff1f;答&#xff1a;按优先级从低到高排列: 在清单中定义的组变量 < 在清单或playbook所在目录的group_vars子目…

基于SpringBoot的天气预报系统的设计与实现

源码链接&#xff1a;点击下载源码 相关文档&#xff1a;点击下载相关文档 摘 要 随着科技的飞速发展和人们生活水平的不断提高&#xff0c;天气预报已成为现代社会不可或缺的一部分。无论是日常生活出行、农业生产安排&#xff0c;还是航空、海运等交通领域&#xff0c;准确…

算法(keep learning)

基础算法 背模板加刷题 排序快排 主要思想&#xff1a;分治 第一步&#xff1a;确认一个分界点&#xff0c;比如起点&#xff0c;中间点&#xff08;分界点&#xff09;&#xff0c;末点第二步&#xff1a;调整区间&#xff0c;使得第一个区间的数都小于等于分界点&#xff0c;…

Django项目架构

背景&#xff1a;很多人写 Django 时容易“什么都往 views 里塞”&#xff0c;结果项目一大就乱套了。需要把 视图层 / 业务层 / 数据层 等职责清晰分出来。图解说明Client&#xff1a;浏览器 / App / 前端调用 API。urls.py&#xff1a;定义 API 路由&#xff0c;把请求分发到…

MySQL】从零开始了解数据库开发 --- 表的操作

永远记住&#xff0c;你的存在是有意义的&#xff0c; 你很重要&#xff0c; 你是被爱着的&#xff0c; 而且你为这个世界带来了无可取代的东西。 -- 麦克西 《男孩、鼹鼠、狐狸和马》-- 从零开始了解数据库开发创建数据表查看表结构修改数据表结构重命名表复制表删除表今天我们…

MySQL底层架构设计原理详细介绍

文章目录一、MySQL体系结构概览二、连接层&#xff08;Connection Layer&#xff09;1. 连接器&#xff08;Connectors&#xff09;2. 连接池&#xff08;Conncction Pool&#xff09;三、服务层&#xff08;Server Layer&#xff09;1. SQL接口组件&#xff08;SQL Interface&…

QB/T 4674-2021 汽车内装饰用聚氨酯束状超细纤维合成革检测

汽车内饰品聚氨酯束状超细纤维合成革是指以海岛型双组份或多组分纤维加工成飞织造布&#xff0c;再经水性聚氨酯树脂或溶剂型聚氨酯树脂浸渍、湿法凝固、溶剂或碱液萃取及后整理等工艺制成的汽车内装饰皮革。QB/T 4674-2021 汽车内装饰用聚氨酯束状超细纤维合成革检测项目测试项…

QML和Qt Quick

QML和Qt Quick QML 和 Qt Quick 是 Qt 框架中紧密相关但概念不同的两个部分&#xff0c;它们之间的关系可以用如下方式清晰说明&#xff1a; 核心区别概览​​特性​​​​QML​​​​Qt Quick​​​​本质​​声明式编程​​语言​​基于 QML 的​​框架/库​​​​作用​​定…

JavaScript 结构型设计模式详解

1. 代理模式1.1. 使用场景代理模式在不改变原始对象的前提下&#xff0c;通过代理对象控制对其访问&#xff0c;通常用于权限控制、延迟加载、远程调用等场景。在前端开发中&#xff0c;可以通过代理模式对网络请求、缓存机制等进行控制。1.2. 代码实现class ApiService {reque…

摄像头模块在运动相机中的特殊应用

运动相机作为记录高速运动场景的专用设备&#xff0c;其摄像头模块的设计与普通消费电子产品存在显著差异。根据行业资料和技术发展&#xff0c;摄像头模块在运动相机中的特殊应用主要体现在以下五个维度&#xff1a;一、极端环境适应性设计运动相机的摄像头模块针对户外运动场…

SpringBoot + MinIO/S3 文件服务实现:FileService 接口与 FileServiceImpl 详解

在企业项目中&#xff0c;文件上传和管理是非常常见的需求。本文基于 芋道源码 的实现&#xff0c;介绍如何封装一个通用的 文件服务 FileService&#xff0c;支持&#xff1a;文件上传&#xff08;保存数据库记录 存储文件到 S3/MinIO 等对象存储&#xff09;文件下载与删除文…

Oracle RAC认证矩阵:规避风险的关键指南

RAC Certification Matrix&#xff08;RAC认证矩阵&#xff09; 是Oracle官方发布的硬件、软件与操作系统兼容性清单&#xff0c;明确规定了哪些平台、组件和版本可以正式支持Oracle RAC&#xff08;Real Application Clusters&#xff09;的部署。它是搭建或升级RAC环境时必须…

【自然语言处理与大模型】如何通过微调来agent性能?

虽然大模型本身具备一定的指令理解和工具调用潜力&#xff0c;但在实际应用中&#xff0c;尤其是在复杂或专业领域&#xff0c;往往需要通过微调来提升Agent的工具调用能力。问题一&#xff1a;基座模型无法准确识别或选择特定领域的工具当Agent需要在医疗、金融、法律、工业控…

在 Keil 中将 STM32 工程下载到 RAM 进行调试运行

在 Keil 中将 STM32 工程下载到 RAM 进行调试运行 在使用 STM32 进行调试时&#xff0c;默认情况下代码会被烧写到 Flash 中运行。然而&#xff0c;Flash 写入速度较慢&#xff0c;擦写次数有限&#xff0c;且调试过程中频繁烧写可能影响开发效率。在某些场景下&#xff08;如快…

【51单片机】【protues仿真】基于51单片机宠物投食系统

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 一、主要功能 1、LCD1602液晶显示时间、温度、食物重量 2、按键手动投喂食物​ 3、称重模块检测当前食物重量 4、食物重量小于阈值会声光警报并自动投喂 二、使用步骤 基于51单片机的宠物投食…

腾讯云负载均衡增加访问策略后访问失败

为了测试&#xff0c;在负载均衡的安全组添加2条安全策略&#xff0c;限制办公室内IP可访问&#xff0c;其他IP地址拒绝所有访问。结果&#xff0c;访问失败。经过反复测试&#xff0c;主要是js问价加载失败&#xff0c;动态接口访问代码返回正常。再进行测试&#xff0c;发现去…

CSS的文本样式

1.文本样式的分类注意&#xff1a;必须先建立标签&#xff0c;再在head中修改1.1字体样式1.1.1字体颜色代码演示<head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title&g…

R语言读取excel文件数据-解决na问题

文章目录安装R语言运行环境实现代码遇到的问题总结安装R语言运行环境 安装教程连接, 包含国内镜像快速下载 实现代码 实现思路&#xff1a;使用python将文件的空字符的位置变成0&#xff0c;生成csv文件后交给R语言处理python实现代码如下&#xff1a; import pandas as pd…

【Nginx 运维实战】版本替换:强制 vs 平滑升级全解析

【Nginx 运维实战】版本替换&#xff1a;强制 vs 平滑升级全解析一&#xff1a;版本替换的两种思路二&#xff1a;使用场景对比三&#xff1a;实战1&#xff09;强制替换1.备份旧版本2.替换为新版本3.**赋予执行权限**4.**重启 Nginx**2&#xff09;平滑替换1.确认进程文件2.备…