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

Java JDBC的初步了解

文章目录

    • 基本流程
    • 注册驱动的两种方法
    • DriverManager
      • DriverManager 的核心作用
      • 核心原理
      • 自动注册驱动的机制
      • 关键方法
    • 示例代码: 连接Mysql数据库
      • Statement
      • PreparedStatement

JDBC全称Java DataBase Connectivity。

定义: JDBC 是 Java 语言中用于连接和执行 SQL 操作的标准接口。

功能: 提供统一的方式访问关系型数据库(如 MySQL、Oracle、PostgreSQL 等)。

核心包: java.sql 和 javax.sql。

基本流程

  1. 加载并注册驱动
  2. 建立数据库连接
  3. 创建 Statement 对象
  4. 执行sql语句
  5. 处理结果集 (ResultSet)
  6. 释放资源 (直接close)

注册驱动的两种方法

以mysql为例

第一种:

DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
  • 手动创建一个驱动实例,并显式注册到 DriverManager
  • DriverManager 会将这个驱动添加到它的驱动列表中,以便后续用 getConnection() 建立数据库连接。

第二种(推荐)

Class.forName("com.mysql.cj.jdbc.Driver")
  • 利用 Java 的反射机制加载这个类,并执行它的静态代码块
  • com.mysql.cj.jdbc.Driver 的静态代码块中已经调用了
DriverManager.registerDriver(new Driver());
所以自动完成了驱动注册。  

DriverManager

DriverManager 是 Java JDBC(Java Database Connectivity)API 的核心类之一,它负责管理数据库驱动并协调应用程序与数据库之间的连接。

DriverManager 的核心作用

功能说明
驱动注册接受驱动类注册(DriverManager.registerDriver()
驱动管理内部维护一个已注册驱动的列表
获取连接通过 getConnection() 方法,找到能处理特定 JDBC URL 的驱动并返回连接

核心原理

驱动注册机制

  • JDBC 驱动类实现了 java.sql.Driver 接口
  • 驱动类的静态代码块中通常会调用:
DriverManager.registerDriver(new Driver());

这就把该驱动对象注册到 DriverManager 的内部驱动列表中。

  • 也可以手动注册:
DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());

驱动列表

  • DriverManager 内部维护了一个 List<Driver>,用于存储所有注册的 JDBC 驱动
  • 这个列表是线程安全的(使用了同步机制)

获取连接

getConnection() 的调用

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db", "user", "pass");

执行流程如下:

    1. 遍历内部注册的驱动列表
    2. 每个驱动调用 acceptsURL(url) 判断是否支持这个 URL
    3. 找到支持的驱动后,调用它的 connect() 方法返回一个 Connection 对象
    4. 如果没有任何驱动支持这个 URL,会抛出 SQLException

自动注册驱动的机制

从 JDBC 4.0 开始(Java 6 起),支持SPI 自动注册机制

  • 驱动 JAR 包中包含 META-INF/services/java.sql.Driver 文件
  • 文件内容为驱动的全限定类名,如:com.mysql.cj.jdbc.Driver
  • 当类加载器加载驱动 jar 时,JDK 会自动加载并注册驱动类,无需显式写 Class.forName(...)

所以可以直接写:

Connection conn = DriverManager.getConnection(...);

关键方法

方法说明
getConnection(String url, String user, String password)根据 URL、用户名、密码获取数据库连接
getDrivers()获取当前已注册的所有驱动
registerDriver(Driver driver)手动注册驱动(通常不需要直接调用)
deregisterDriver(Driver driver)从注册列表中移除驱动
getDrivers()获取所有已注册的驱动实例
setLogWriter(PrintWriter)设置日志输出流
setLoginTimeout(int seconds)设置连接超时时间

示例代码: 连接Mysql数据库

package JDBC;import java.sql.*;public class demo1 {public static void main(String[] args) {String url="jdbc:mysql://localhost:3307/test";String user="root";String password="root";try{//1.加载驱动Class.forName("com.mysql.cj.jdbc.Driver");//2.建立连接Connection conn= DriverManager.getConnection(url,user,password);//3.创建StatementStatement stmt = conn.createStatement();//4.执行sql语句ResultSet rs = stmt.executeQuery("select * from users");//5.处理结果集while(rs.next()){String username = rs.getString("user");//列名的方式String pass = rs.getString(2);//列下标的方式System.out.println("username:"+username+" password:"+pass);}//6.关闭资源rs.close();stmt.close();conn.close();}catch (Exception e){e.printStackTrace();System.out.println(e.getMessage());}}
}

在这里插入图片描述

Statement

Statement sql语句的主要操作函数有三个

executeQuery() //执行select查询语句
executrupdate() //可以执行insert,update,delect,CREATE 之类的
execute() //执行任意语句

PreparedStatement

PreparedStatement其sql语句是在其获取命令执行对象时就以及写入了预编译语句。其要进行sql执行只要对其参数进行传入即可

PreparedStatement pstmt = conn.prepareStatement("select * from users where user=?");
pstmt.setString(1,"xpw");
ResultSet rs2 = pstmt.executeQuery();
rs2.next();
System.out.println("预编译查询\t用户名:"+rs2.getString("user")+" 密码:"+rs2.getString("password"));//预编译查询	用户名:xpw 密码:123

需要注意的是所得到的ResultSet类的实例,其初始的索引是不在第一行的,我们想获取内容需要先使用next使得索引内移

http://www.dtcms.com/a/267892.html

相关文章:

  • 力扣网编程45题:跳跃游戏II之正向查找方法(中等)
  • 【深度学习新浪潮】AI在材料力学领域的研究进展一览
  • 基于51单片机智能婴儿床
  • SQL 一键生成 Go Struct!支持字段注释、类型映射、结构体命名规范
  • 从前端转go开发的学习路线
  • 3、Configuring Topics
  • I-Cache、D-Cache 和 SRAM 的区别与联系
  • 系统架构设计师论文分享-论软件体系结构的演化
  • Docker容器中安装MongoDB,导入数据
  • nvm常用指令汇总
  • Spark流水线数据质量检查组件
  • 【认知】如何在高强度工作中保持心理健康和情绪稳定?
  • WizTree v4.2.5 x86 x64 单文件版
  • 让你的asp.net网站在调试模式下也能在局域网通过ip访问
  • Java 双亲委派机制笔记
  • GitCode项目创建指南
  • 一文掌握Qt Quick数字图像处理项目开发(基于Qt 6.9 C++和QML,代码开源)
  • 【黑马点评】(二)缓存
  • PyTorch 2.7深度技术解析:新一代深度学习框架的革命性演进
  • Python作业1
  • 实现Spring MVC登录验证与拦截器保护:从原理到实战
  • Jiraph​ 简介
  • React 各颜色转换方法、颜色值换算工具HEX、RGB/RGBA、HSL/HSLA、HSV、CMYK
  • AcWing--873.欧拉函数
  • ARMv8 创建1、2、3级页表代码与注释
  • 【C++基础】内存管理四重奏:malloc/free vs new/delete - 面试高频考点与真题解析
  • Windows 11 Enterprise LTSC 转 IoT
  • C++ i386/AMD64平台汇编指令对齐长度获取实现
  • LangChain:构建一个Agent(入门篇四)
  • [leetcode] C++ 并查集模板