后端(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中添加依赖即可

java 复制代码
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、注册驱动
java 复制代码
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进行实现,更安全,效率更高!

以下为示例代码:

java 复制代码
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的方法获取单列的数据,该方法为重载方法,支持索引和列名进行获取

相关推荐
励志不掉头发的内向程序员4 小时前
从零开始的python学习——文件
开发语言·python·学习
悠哉悠哉愿意5 小时前
【数学建模学习笔记】无监督聚类模型:分层聚类
笔记·python·学习·数学建模
UQI-LIUWJ5 小时前
unsloth 笔记;数据集
笔记
北冥电磁电子智能5 小时前
江协科技STM32学习笔记补充之004
笔记·科技·学习
一个响当当的名号6 小时前
c++primer 个人学习总结-模板和泛型编程
开发语言·c++·学习
落羽的落羽6 小时前
【C++】C++11的可变参数模板、emplace接口、类的新功能
开发语言·c++·学习
滴滴滴嘟嘟嘟.6 小时前
Qt对话框与文件操作学习
开发语言·qt·学习
乱飞的秋天6 小时前
IO学习
学习
Source.Liu6 小时前
【Python基础】 15 Rust 与 Python 基本类型对比笔记
笔记·python·rust