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.pswp.cn/bicheng/87805.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/87805.shtml

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

相关文章

[netty5: ChunkedInput ChunkedWriteHandler]-源码分析

ChunkedInput ChunkedInput<B> 是 Netty 中用于按块读取不定长数据流的接口&#xff0c;常配合 ChunkedWriteHandler 实现流式写入&#xff0c;支持如文件、流、HTTP 和 WebSocket 等多种数据源。 实现类简要说明ChunkedFile用于将常规文件按块传输&#xff08;使用传统…

QT 第十二讲 --- 控件篇 LineEdit,TextEdit与ComboBox

前言&#xff1a;欢迎进入 QT 控件世界的第十二讲&#xff01;在上一讲《QT 第十一讲 --- 控件篇 LCDnumber&#xff0c;ProgressBar与CalenderWidget》中&#xff0c;我们探索了用于信息展示和状态反馈的控件&#xff1a;精准的数字显示器 LCD Number、直观的进度指示器 Progr…

VSCode遇到的一些小毛病(自动保存、运行后光标不再处于编辑区)

1. 右键点击Run Code没有触发自动保存 1. 打开 VS Code 设置&#xff08;Ctrl ,&#xff09; 2. 搜索&#xff1a;code runner save 3. 勾选你需要的 2. 运行后光标仍然处于编辑区&#xff08;容易误输入&#xff09; 1. 打开 VS Code 设置&#xff08;Ctrl ,&#xff09; 2.…

Maixcam的使用2

1.单文件和项目&#xff08;多个 py 文件项目/模块化&#xff09;# 在编写代码时&#xff0c;一般两种模式&#xff0c;执行单个文件&#xff0c;或者执行一个完成项目&#xff08;包含多个 py 文件或者其它资源文件&#xff09;。 单文件模式&#xff1a;MaixVision 创建或者…

征信系统架构思想:打造商业信任基石_东方仙盟—仙盟创梦IDE

一、建设必要性在复杂的商业环境中&#xff0c;企业面临多元交易对象与业务场景&#xff0c;准确评估合作方信用状况及潜在价值的难度显著增加。传统经验判断和简单背景调查存在局限性&#xff0c;难以满足现代商业决策需求&#xff0c;因此构建科学的征信体系具有现实必要性。…

网安-XSS-pikachu

介绍 XSS&#xff0c;即跨站脚本攻击&#xff0c;是指攻击者利用Web服务器中的代码漏洞&#xff0c;在页面中嵌入客户端脚本&#xff08;通常是一段由JavaScript编写的恶意代码&#xff09;&#xff0c;当信任此Web服务器的用户访问 Web站点中含有恶意脚本代码的页面&#xff…

算法入门——字典树(C++实现详解)

字典树&#xff08;Trie&#xff09;是处理字符串匹配的高效数据结构&#xff0c;广泛应用于搜索提示、拼写检查等场景。本文将带你从零掌握字典树的原理与实现&#xff01; 一、什么是字典树&#xff1f; 字典树&#xff08;Trie&#xff09;是一种树形数据结构&#xff0c;…

SpringBoot整合SpringCache缓存

SpringBoot整合SpringCache使用缓存 文章目录SpringBoot整合SpringCache使用缓存1.介绍2.SpringBoot整合1.导入xml依赖2.配置yml3.使用EnableCaching启用SpringCache4.Cacheable5.CachePut6.CacheEvict7. Caching8.CacheConfig3.其他属性配置1.keyGenerator 属性2. cacheManage…

WPF学习笔记(20)Button与控件模板

Button与控件模板一、 Button默认控件模板详解二、自定义按钮模板一、 Button默认控件模板详解 WPF 中的大多数控件都有默认的控件模板。 这些模板定义了控件的默认外观和行为&#xff0c;包括控件的布局、背景、前景、边框、内容等。 官方文档&#xff1a;https://learn.mic…

蓝天居士自传(1)

蓝天居士何许人&#xff1f; 蓝天居士是我的笔名&#xff0c;也可以说是号。就好像李白号青莲居士、欧阳修号六一居士一样。笔者本名彭昊 —— 一个有不少重名重姓者的名字。 笔者小的时候上语文课&#xff0c;无论是小学、初中抑或是高中&#xff0c;都会有鲁迅&#xff08;…

短剧系统开发定制全流程解析:从需求分析到上线的专业指南

一、短剧行业数字化趋势与系统开发必要性在短视频内容爆发式增长的时代背景下&#xff0c;短剧作为一种新兴的内容形式正在迅速崛起。数据显示&#xff0c;2023年中国短剧市场规模已突破300亿元&#xff0c;用户规模达到4.5亿&#xff0c;年增长率超过200%。这一迅猛发展的市场…

getBoundingClientRect() 详解:精准获取元素位置和尺寸

getBoundingClientRect() 是 JavaScript 中一个强大的 DOM API&#xff0c;用于获取元素在视口中的精确位置和尺寸信息。它返回一个 DOMRect 对象&#xff0c;包含元素的坐标、宽度和高度等关键几何信息。 基本用法 const element document.getElementById(myElement); cons…

EXCEL 基础技巧

来源&#xff1a;WPS 官网 初步了解WPS表格-WPS学堂https://www.wps.cn/learning/course/detail/id/635.html 1、格式刷 1.1使用格式刷隔行填充颜色。 首先设置部分表格颜色&#xff0c;选中此区域&#xff0c;双击点击格式刷&#xff0c;然后选中其他表格区域。 这样就可以…

【RK3568 编译rtl8723DU驱动】

RK3568 编译rtl8723DU驱动 编译源码1.解压rtl8723du2.修改Makefile 验证1.加载模块2.开启wifi 在驱动开发中&#xff0c;驱动的编译与集成是实现设备功能的关键环节。本文聚焦于基于 RK3568 处理器平台编译 RTL8723DU WiFi/BT 二合一模块驱动的完整流程&#xff0c;涵盖源码编译…

基于Simulink的二关节机器人独立PD控制仿真

文章目录 理论模型仿真窗口控制函数目标函数仿真 本文是刘金琨. 机器人控制系统的设计与MATLAB仿真的学习笔记。 理论模型 对于二关节机器人系统&#xff0c;其动力学模型为 D ( q ) q C ( q , q ˙ ) q ˙ r D(q)\ddot qC(q,\dot q)\dot q r D(q)q​C(q,q˙​)q˙​r 式…

【技术架构解析】国产化双复旦微FPGA+飞腾D2000核心板架构

本文就一款基于飞腾D2000核心板与两片高性能FPGA的国产化开发主板进行技术解析&#xff0c;包括系统架构、主要硬件模块、关键接口及软件环境&#xff0c;重点阐述各子系统间的数据路径与协同工作方式&#xff0c;旨在为行业内同类产品设计与应用提供参考。 随着国产化要求的加…

Python 数据分析:计算,分组统计1,df.groupby()。听故事学知识点怎么这么容易?

目录1 示例代码2 欢迎纠错3 论文写作/Python 学习智能体1 示例代码 直接上代码。 def grpby1():xls "book.xls"df pd.DataFrame(pd.read_excel(xls, engine"xlrd"))print(df)"""序号 分类 销量0 1 文学 51 2 计算机…

【解决“此扩展可能损坏”】Edge浏览器(chrome系列通杀))扩展损坏?一招保留数据快速修复

引言 如果你想保留你的数据&#xff0c;敲重点&#xff1a;不要点击修复&#xff0c;不要修复&#xff0c;不要修复 在使用 Microsoft Edge 浏览器时&#xff0c;您可能会遇到扩展程序显示“此扩展程序可能已损坏”的提示&#xff0c;且启用按钮无法点击。这一问题让许多用户感…

AI专业化应用加速落地,安全治理挑战同步凸显

7月2日&#xff0c;2025全球数字经济大会在北京国家会议中心开幕。本届大会以“建设数字友好城市”为主题&#xff0c;聚焦数字技术对城市发展的影响。开幕式上&#xff0c;一首完全由AI生成的MV成为焦点——从歌词、谱曲、演唱到视频制作全流程AI生成&#xff0c;展现人工智能…

Python统一调用多家大模型API指南

随着大模型技术的快速发展&#xff0c;市场上出现了越来越多的LLM服务提供商&#xff0c;包括OpenAI、Anthropic、Google、百度、阿里云等。作为开发者&#xff0c;我们经常需要在不同的模型之间切换&#xff0c;或者同时使用多个模型来满足不同的业务需求。本文将详细介绍如何…