深入理解JDBC

深入理解Java JDBC:从基础到实践 JDBC是Java语言与各种关系型数据库进行交互的桥梁,它由一组用Java语言编写的接口和类组成。通过JDBC,Java程序可以执行SQL语句,实现对数据库的增删改查等操作,而无需关心具体数据库的底层实现细节。这种抽象机制使得Java应用程序具有良好的可移植性,能够轻松适配不同的数据库系统,如MySQL、Oracle、SQL Server等。:驱动管理类,用于加载数据库驱动程序,并建立与数据库的连接。它是应用程序与数据库驱动程序之间的桥梁,负责管理不同数据库的驱动程序。Connection。 阅读详情

很早之前就学过JDBC了,但是工作之后都是使用的对JDBC封装好的ORM框架。基本没有手写过JDBC相关的代码了,但是为了对使用的框架底层有更加深入的理解,所以重新复习总结一下JDBC技术。其实JDBC本身并不复杂,这里使用倒序的方式,先将完整步骤写出来,再对每一步进行分析讲解。个人觉得这种方式更加容易理解。

1、是什么?

JDBC是sun公司提供一套用于数据库操作的接口,java程序员只需要面向这套接口编程即可。 不同的数据库厂商,需要针对这套接口,提供不同实现。不同的实现的集合,即为不同数据库的驱动。 — 面向接口编程

2、为什么?

如果不提供JDBC接口,而直接使用各个数据库产商的实现,那么程序员就必须熟悉不同产商的数据库实现,每种数据库的实现各不相同,也不便于切换。简单说就是为了解耦和可移植性。

3、怎么用?

以连接 Mysql 数据库为例,使用 JDBC 执行的步骤大体上分为7步,分别是:

// 1.导入数据库驱动的jar包(mysql-connector-java-5.1.37-bin.jar)
public static void main(String[] args) {
	Connection conn = null;
	PreparedStatement ps = null;
	ResultSet rs = null;
	try {
		// 2.加载驱动
		Class.forName("com.mysql.jdbc.Driver");
		// 3.获取连接connection
		String url = "jdbc:mysql://localhost:3306/test";
		String user = "root";
		String password = "root";
		conn = DriverManager.getConnection(url, user, password);
		// 4.写SQL语句
		String sql = "SELECT id, name, age FROM users WHERE id = ?";
		// 5.创建statement
		ps = conn.prepareStatement(sql);
		ps.setInt(1, 2);
		// 6.执行SQL语句
		rs = ps.executeQuery();
		if (rs.next()) {
			int id = rs.getInt(1);
			String name = rs.getString(2);
			int age = rs.getInt(3);
			System.out.println(new User(id, name, age));
		}
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		// 7.关闭资源
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (ps != null) {
			try {
				ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

下面,分别对每一步进行详细讲解:

(1)第一步:导入jar包:JDBC本身只是提供了一套操作数据库的接口,并没有具体的实现,要想使用某一种数据库,必须先导入该数据库的相关实现(这里即:jar包)。

(2)第二步:加载驱动:应用程序启动时,利用反射加载将对应数据库的驱动类加载到内存中。进入源码可以看到 Mysql 的驱动类中有一段静态代码块(其他数据库的驱动实现类中不一定有),当该类【com.mysql.jdbc.Driver 】被加载时,会自动加载该静态代码块的内容,从而将该驱动【com.mysql.jdbc.Driver】注册到 java 提供的驱动管理类【java.sql.DriverManager】中。

package com.mysql.jdbc;

import java.sql.SQLException;

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
	
	static {
		try {
                         //注册 com.mysql.jdbc.Driver 驱动到 java.sql.DriverManager 中
			java.sql.DriverManager.registerDriver(new Driver());
		} catch (SQLException E) {
			throw new RuntimeException("Can't register driver!");
		}
	}
     ...
 }

 进入 java.sql.DriverManager 类的源码可以看到,其底层使用的是一个写时复制的成员变量 registeredDrivers 集合 【CopyOnWriteArrayList<DriverInfo> 底层使用的还是数组Object[] 保存】来封装成DriverInfo并保存所有的数据库驱动。

package java.sql;

import java.util.Iterator;
import java.util.ServiceLoader;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.concurrent.CopyOnWriteArrayList;
import sun.reflect.CallerSensitive;
import sun.reflect.Reflection;

public class DriverManager {
    
    // 存储所有JDBC驱动的集合
    private final static CopyOnWriteArrayList<DriverInfo> registeredDrivers = new CopyOnWriteArrayList<>();
    
    public static synchronized void registerDriver(java.sql.Driver driver)
        throws SQLException {
        //注册驱动
        registerDriver(driver, null);
    }
    
    public static synchronized void registerDriver(java.sql.Driver driver,
            DriverAction da)
        throws SQLException {
                
        //如果不存在就添加到驱动集合中。即:registeredDrivers 【CopyOnWriteArrayList<DriverInfo>】类中的 Object[] array数组中
        if(driver != null) {
            registeredDrivers.addIfAbsent(new DriverInfo(driver, da));
        } else {
            // This is for compatibility with the original DriverManager
            throw new NullPointerException();
        }
        
        println("registerDriver: " + driver);
    }
   ...
 }   

 (3)获取连接 Connection :传入url、user、password 参数遍历 DriverManager 中注册的所有驱动,来获取对应的数据库连接。

package java.sql;

import java.util.Iterator;
import java.util.ServiceLoader;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.concurrent.CopyOnWriteArrayList;
import sun.reflect.CallerSensitive;
import sun.reflect.Reflection;

public class DriverManager {

    private final static CopyOnWriteArrayList<DriverInfo> registeredDrivers = new CopyOnWriteArrayList<>();
    
    @CallerSensitive
    public static Connection getConnection(String url,
        String user, String password) throws SQLException {
        java.util.Properties info = new java.util.Properties();

        if (user != null) {
            info.put("user", user);
        }
        if (password != null) {
            info.put("password", password);
        }

        return (getConnection(url, info, Reflection.getCallerClass()));
    }
    
    private static Connection getConnection(
        String url, java.util.Properties info, Class<?> caller) throws SQLException {
                
        ClassLoader callerCL = caller != null ? caller.getClassLoader() : null;
        synchronized(DriverManager.class) {
            // synchronize loading of the correct classloader.
            if (callerCL == null) {
                callerCL = Thread.currentThread().getContextClassLoader();
            }
        }

        if(url == null) {
            throw new SQLException("The url cannot be null", "08001");
        }

        println("DriverManager.getConnection(\"" + url + "\")");

        SQLException reason = null;
        //核心逻辑:通过遍历来获取对应的数据库连接
        for(DriverInfo aDriver : registeredDrivers) {
            // If the caller does not have permission to load the driver then
            // skip it.
            if(isDriverAllowed(aDriver.driver, callerCL)) {
                try {
                    println("    trying " + aDriver.driver.getClass().getName());
                    Connection con = aDriver.driver.connect(url, info);
                    if (con != null) {
                        // Success!
                        println("getConnection returning " + aDriver.driver.getClass().getName());
                        return (con);
                    }
                } catch (SQLException ex) {
                    if (reason == null) {
                        reason = ex;
                    }
                }
            } else {
                println("    skipping: " + aDriver.getClass().getName());
            }
        }

        // if we got here nobody could connect.
        if (reason != null)    {
            println("getConnection failed: " + reason);
            throw reason;
        }

        println("getConnection: no suitable driver found for "+ url);
        throw new SQLException("No suitable driver found for "+ url, "08001");
    }
    ...
}

 此时,返回的 connection 就是 Mysql 提供的 Connection 接口的实现类。【数据库连接被用于向数据库服务器发送命令和 SQL 语句,并接受数据库服务器返回的结果。其实一个数据库连接就是一个Socket连接。】

(4)写SQL语句:定义想要操作的数据库SQL语句。

(5)创建Statement:通过获取到的Connection来创建 prepareStatement【Statement】。这里注意的是通常都是使用PrepareStatement,而不是 Statement。两者的本质区别就是:PreparedStatement 是预编译的。这样可以防止SQL注入、批量执行时不需要重复编译,提高语句执行效率。

(6)执行SQL:Statement 是真正执行命令对象,把Sql语句发送给数据库执行。并可以处理返回的结果集 ResultSet。

(7)关闭资源:数据库连接(Connection)是非常稀有的资源,用完后必须马上释放, 如果Connection不能及时正确的关闭将导致系统宕机。Connection的使 用原则是尽量晚创建,尽量早的释放。

 

总结:JDBC核心就是通过 Java 提供的一套标准的 API 来屏蔽到不同数据库实现的细节,简化和加快开发过程,并且可以方便的切换不同的数据库,体现的是面向接口的编程思想。无论是JDBC 还是JAVA WEB,都是一个应用程序通过网络连接另一个应用程序,一般都会提供连接地址URL、用户名user、密码password来登录,然后获取对应的权限来执行对应的操作。

 

相关文章推荐:

JDBC模型—深入理解JDBC设计思想(探究Class.forName("DBDriver")): https://blog.youkuaiyun.com/daijin888888/article/details/50969621

JDBC要点总结、SQL注入示例(Statement和PreparedStatement):https://blog.youkuaiyun.com/daijin888888/article/details/50965232

深入理解JDBC:数据类型与异常处理 本文深入探讨了JDBC中数据类型的定义和异常处理机制。通过分析JDBC驱动程序如何处理字符、二进制和数值数据类型,以及如何使用SQLException、SQLWarning和DataTruncation等异常类型来管理错误和警告,读者将获得对数据库编程更深层次的理解。 阅读详情

相关推荐

JDBC编程深入理解与实践

本篇博客深入探讨了Java数据库编程中的JDBC接口和类的使用,包括如何利用JDBC驱动程序连接数据库、执行SQL语句、处理结果集等核心操作。通过对不同接口和类方法的详细解析,提供了一个实际操作数据库的完整视角。

weixin_36122351的博客 411

【Java 进阶篇】深入理解 JDBC:Java 数据库连接详解

JDBC 是 Java Database Connectivity 的缩写,它是 Java 用于与关系型数据库进行交互的标准 API。JDBC 允许 Java 应用程序连接到不同的数据库管理系统(如MySQL、Oracle、PostgreSQL等),执行 SQL 查询和更新,以及处理结果集。连接到数据库发送 SQL 查询处理查询结果更新数据库数据管理数据库连接JDBC 是 Java 与数据库交互的标准 API,允许您连接到不同的数据库管理系统,执行 SQL 查询和更新数据。

繁依Fanyi的博客 662

JDBC与数据库连接:深入理解JDBC架构和SQL

本文深入探讨了JDBC(Java Database Connectivity)的架构及其与ODBC(Open Database Connectivity)的关系,并详细阐述了SQL的基本概念、数据类型映射、以及如何通过JDBC连接和操作数据库。文章通过对行业数据库供应商列表的分析,揭示了JDBC的广泛应用前景,并讨论了JDBC驱动程序的灵活性及其与遗留数据库系统的兼容性。同时,文章也对SQL的关键概念进行了介绍,包括关系模型、表、列、行、键以及数据定义语言(DDL)的使用。

weixin_36122351的博客 387

JDBC深度封装的工具类 (具有高度可重用性)

JDBC深度封装的工具类 (具有高度可重用性) (2012-10-06 23:58:50) 转载▼ 标签: jdbc工具类 高度重用性 杂谈 分类:JavaSE 首先介绍一下Dbutils:      CommonDbutils是操作数据库的组件,对传统操作数据库的类进行二次封装,可以把结果集转化成List。  补充一下,传统操作数据

zl1582330223的专栏 591

饥荒联机版Mod开发——modmain环境与API深度解析

本文深入解析饥荒联机版Mod开发中的modmain.lua环境与核心API,详细讲解环境表构建原理、API注册与调用时机,并提供高级开发技巧与最佳实践。通过源码分析和实际案例,帮助开发者掌握Mod开发核心技术,解决常见问题,提升开发效率与代码质量。

weixin_30312563的博客 432

如何在huggingface上申请下载使用llama2/3模型

huggingface-cli download --resume-download 模型名称 --local-dir 存放模型的位置 --local-dir-use-symlinks False --resume-download --token token序列号xxxxxxx。登录huggingface,在模型详情页面上,找到这个表单,填写内容,提交申请。需要使用梯子,country填写梯子的位置吧(比如美国)等待一小时左右,会有邮件通知。

a61022706的博客 1万+

javaweb实训第四天下午——JDBC深入理解

JDBC深入理解1.课程介绍2. PreparedStatement查询2.1 回顾jdbc2.2 PreparedStatement的引入2.2.1 PreparedStatement介绍2.3 PreparedStatement使用2.4 完善功能2.5 为什么选择PreparedStatement2.5.1思路清楚,使用方便2.5.2 速度,效率更高,更快2.5.3 防SQL注入2.6小结3.完成登录功能3.1 登录方式比较3.2 登录方式二实现![在这里插入图片描述](https://img-blo

dearQiHao的博客 1383

Maxwell参数化建模

MAXWELL 2019 R3 参数化建模 参数化建模的优势 所谓参数化,就是在电机本体设计中涉及到的各类参数变量化,而每个变量之间又存在一定的制约关系,这样只需修改其中某个或者某些变量就可以做到对整个电机模型合理地改动。 参数化举例 以表贴式电机为例,先画电机定子,如上所示,依次进行后会弹出下面的选项框 上图就是描述电机尺寸的各类参数,接下来进行参数化。 回车ENTER,并给变量ds赋值。 赋值好后,回车ENTER 左下角properties里面就有我们新建立的变量ds了。 继续将剩余的参数

qq_41387280的博客 1万+

对JDBC的深度封装

对JDBC的封装 连接的公共方法 package com.zhj.dao.common; import java.lang.reflect.Method; import java.math.BigDecimal; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMe

zhj52666的博客 309

【数据集介绍】MVTec 3D AD数据集介绍

MVTec AD(MVTec Anomaly Detection)数据集是用于异常检测的计算机视觉数据集。该数据集包含来自工业生产中不同材料和产品的图像,包括玻璃、塑料、纺织品等。每个类别都包含正常样本和异常样本。这些异常样本包括各种常见的生产缺陷,如划痕、裂纹、凹陷等。MVTec AD数据集旨在帮助研究人员和从业者开发和评估用于检测工业制造中物体缺陷的算法和系统。

原来也有北瓜 7748

Siemens SIMATIC软件二次开发:使用C#进行SIMATIC软件二次开发

通过使用OPC-UA通信协议和S7通信库,可以有效地在C#应用程序中与Siemens SIMATIC软件进行数据交换。OPC-UA提供了一个标准化的平台,而S7通信库则提供了直接访问PLC数据的能力。掌握这两种通信方式,将极大地增强在工业自动化领域的二次开发能力。在Siemens SIMATIC软件中,自定义功能块开发是实现二次开发的关键步骤之一。通过C#,可以创建高度定制化的功能块,以满足特定的控制需求。下面,我们将通过一个示例来展示如何使用C#开发一个自定义功能块。OPC-UA通信。

kkchenjj的博客 1414

jdbc programming

jdbc programming1 transation  performance it is not easy to say , turn off auto-commiting it will cut down on the number of commits.decreasse the comunication between  client and the dbserver and bu

victorpgx的专栏 746

27、视网膜血管识别与分类的数据集和验证过程

本文介绍了视网膜血管自动识别与分类方法所使用的数据集及其验证过程。通过30张高分辨率的近红外反射视网膜图像,结合专业医生的手动标注结果,构建了包含597个血管段的基准数据集。研究采用准确率、召回率、F1分数和混淆矩阵等评估指标对模型进行验证,并提出了特征增强和分类器优化策略以提升性能。实验结果显示,该方法在复杂区域具有较强的鲁棒性和较高的准确性,为临床应用提供了可靠的依据。

i7j8k9l的博客 148

深入理解 JDBC 的超时

转载地址:https://www.jianshu.com/p/2deaf51bf715 深入理解 JDBC 的超时 这是最近读到的讲关于 JDBC 的超时问题最透彻的文章,原文是http://www.cubrid.org/blog/understanding-jdbc-internals-and-timeout-configuration ,网址需要翻墙才能打开,已转载到另外一篇文章。网上现有...

weixin_40805079的博客 1186

到底什么是指令集?什么是微架构?他们是什么关系?

指令集、处理器架构、芯片厂商、ARM、x86,其间关系还在迷糊吗?一文迅速理清!!

车载系统攻城狮 7811

SAP物料主数据中的销售视图。这是一个在销售与分销模块中至关重要的核心主数据,直接关系到从报价到交货的整个销售流程

SAP物料主数据的销售视图是销售流程的核心基础,它定义了物料如何被销售、定价、开票和交付。销售视图包含五个关键控制点:1)基本销售数据控制物料销售状态;2)销售组织数据决定销售渠道和产品分类;3)通用物料数据管理销售描述和税务分类;4)交货计划控制交付参数;5)开票计划管理定价规则。这些设置直接影响销售流程顺畅度、数据准确性、客户满意度、财务合规性和业务灵活性。建议将销售视图创建纳入新产品引入流程,并建立规范的维护机制,确保业务变化时及时更新配置。

金牌架构师 666

深入理解JDBC的超时设置

http://www.importnew.com/2466.html

hsjemail的专栏 552

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

深入理解 JDBC

1. JDBC 1.1 什么是 JDBC? JDBC 是什么?来看看文档说明: The Java Database Connectivity (JDBC) API provides universal data access from the Java programming language. Using the JDBC API, you can access virtually any data source, from relational databases to spreadsheets an

菩提小猿的博客 465

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

JDBC深入理解

再次认识JDBCJDBC概念JDBC设计的目的JDBC组成使用DriverManager获取指定Driver使用DriverManager注册和取消注册驱动Driver使用DriverManager创建 Connection 连接对象收获点 JDBC概念 Java DataBase Connectivity(Java数据库连接技术) 它是将Java与SQL结合且独立于特定的数据库系统的应用程序编程接口(API-它是一种可用于执行SQL语句的Java API,即由一组用Java语言编写的类与接口所组成) JD

wjval的博客 307

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

深入理解servlet jdbc 数据库连接池

深入理解servlet  jdbc  数据库连接池

ccecwg的专栏 915

5.1 深入理解JDBC

5.1 JDBC        JDBC是Java Database Connectivity的简称,是Java数据库连接的规范,关于JDBC的内容定义在java.sql包下。需要明确JDBC只是一种规则集,并不是实现,具体数据库的连接实现是由各个数据库厂商实现的,通过JDBC规范,保证了不同数据库之间可以通过一套规则来进行连接(关系型数据库)。 5.1.1 JDBC的作用 JDBC API 能够实现Java程序连接关系型数据库,如

刘滨浩的博客 2950

A029_jdbc深入理解

JDBC深入理解 1.内容介绍 1.PreparedStatement介绍(了解) 2.PreparedStatement使用(掌握) 3.登录方式介绍(掌握) 4.登录方式实现(掌握) 5.事务介绍(了解) 同生共死 6.事务认识(掌握) 7.事务使用(掌握) 8.拿到主键(了解) 认识一下[理解人家的框架(代码)可以做到] 9.连接池(理解) 10.抽取BaseDao:增删改,可以写成一个方法 2. PreparedStatement查询 2.1 回顾jdbc 通过jdbc完成一

窗外有风景,笔下有前途,低头是题海,抬头是未来 391

JDBC的深入理解

1. 数据的持久化: 持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。 2. JDBC的理解: JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API) 简单理解为:JDBC,是SUN提供的一套 API,使用这套API可以实现对具体数据库的操作(获取连接、关闭连接、DML、DDL、DCL) 3.图示理解: ...

weixin_45943192的博客 579

【JDBC-54.2】深入理解SQL注入攻击及JDBC防护方案

SQL注入(SQL Injection)是当今Web应用程序中最常见、最危险的安全漏洞之一。它利用了应用程序对用户输入数据处理不当的缺陷,攻击者通过在输入字段中插入恶意的SQL代码片段,欺骗服务器执行非预期的SQL命令。SQL注入是一个严重但可预防的安全威胁。在JDBC编程中,采用PreparedStatement进行参数化查询是最有效的防护手段。结合输入验证、最小权限原则和其他安全措施,可以构建坚固的数据库访问层防御。记住,安全不是一次性工作,而是需要持续关注和实践的开发习惯。

weixin_39033358的博客 1027

2-【JavaWeb】深入理解JDBC

使用 Maven 或 Gradle 管理 JDBC 依赖。如何使用 JDBC 连接数据库,执行 DML(数据操作语言)和 DQL(数据查询语言)操作。实现批处理和,以避免 SQL 注入攻击。如何使用事务确保数据操作的原子性和一致性。

weixin_44329069的博客 1596

深入理解JDBC的timeout

转载自:http://blog.youkuaiyun.com/kobejayandy/article/details/46916063 恰当的JDBC超时设置能够有效地减少服务失效的时间。本文将对数据库的各种超时设置及其设置方法做介绍。 真实案例:        在遭到DDos攻击后,整个服务都垮掉了,当屏蔽了所有的DDos攻击,并恢复了网络后,业务系统却还是无法工作。通过分析系统的th

ZERO 1万+
上一篇: Java比较器:Comparable和Comparator
下一篇: 数据源和连接池的关系
ProgrammingWay
博客等级 码龄9年 58粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值