Java之JDBC技术详解

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: JDBC (Java Date Base Connectivity),指 Java 数据库连接,是一种标准Java应用编程接口 (Java API),用来连接Java编程语言和广泛的数据库。

一、简介


1. 什么是JDBC

JDBC (Java Date Base Connectivity),指 Java 数据库连接,是一种标准Java应用编程接口 (Java API),用来连接Java编程语言和广泛的数据库。

JDBC API 库包含下面提高的每个任务,都是与数据库相关的常用用法。

  • 制作到数据库的连接
  • 创建 SQL 或 MySQL 语句
  • 创建 SQL 或 MySQL 查询数据库
  • 查看和修改所产生的记录

从根本上来说,JDBC 是一种规范,它提供了一套完整的接口,允许便携式访问到底层数据库,因此可以用 Java 编写不同类型的可执行文件,例如:

  • Java 应用程序
  • Java Applets
  • Java Servlets
  • Java ServerPages (JSPs)
  • Enterprise JavaBeans (EJBs)

所有这些不同的可执行文件就可以使用JDBC驱动程序来访问数据库,这样可以方便的访问数据。

JDBC 具有 ODBC 一样的性能,允许 Java 程序包含与数据库无关的代码。

2. 先决条件

为了更好的理解本教程,需要对以下两个主题内容很好的理解:

  • 核心 Java 编程
  • SQL 或 MySQL 数据库

3. JDBC 架构

JDBC 的 API 支持两层和三层处理模式进行数据库访问,但一般的 JDBC 架构由两层处理模式组成:

  • JDBC API:提供了应用程序对 JDBC 管理器的连接
  • JDBC DRIVER API:提供了 JDBC 管理器对驱动程序连接

JDBC API 使用驱动程序管理器和数据库特定的驱动程序来提供异构 (heterogeneous) 数据库的透明连接。

JDBC 驱动程序管理器可确保正确的驱动程序来访问每个数据源。该驱动程序管理器能够支持连接到多个异构数据库的多个并发的驱动 程序。

以下是结构图,其中显示了驱动程序管理器相对于在 JDBC 驱动程序和 Java 应用程序所处的位置。

网络异常,图片无法展示
|

以上引自 JDBC 简介_w3cschool

二、常用接口


在开发 JDBC 程序前,首先了解一下 JDBC 常用的 API。JDBC API主要位于 java.sql 包中,该包定义了一系列访问数据库的接口和类,具体如下:

  1. Driver 接口

Driver 接口由数据库厂家提供,作为 Java 开发人员,只需要使用 Driver 接口就可以了。在编程中要连接的数据库,必须先装载特定厂商的数据库驱动程序,不同的数据库有不同的装载方法。如:

装载 MySQL 驱动:Class.forName ( "ciom.mysql.jdvc.Driver" );

装载 Oracle 驱动:Class.forName ( "oracle.jdbc.driver.OracleDriver" );

  1. Connection 接口

Connection 与特定数据库的连接(会话),在连接上下文中执行 sql 语句并返回结果。

DriverManager.getConnection ( url ,user ,password )方法建立在 JDBC URL 中定义的数据库 Connection 连接上。

连接 MySQL 数据库:

Connection conn = DriverManager.getConnection ( "jdbc:mysql://host:port/database" , "user" , "password");

连接 Oracle 数据库:

Connection conn = DriverManager.getConnection ( "jdbc:oracle:thin:@host:port:database" , "user" , "password");

连接 SqlServer 数据库:

Connection conn = DriverManager.getConnection ( "jdbc:microsoft:sqlsever://host:port;DatabaseName=database" , "user" , "password");

常用方法:

  • createStatement():创建向数据库发送 sql 的 statement 对象。
  • prepareStatement (sql):创建向数据库发送预编译 sql 的 PrepareSatement 对象。
  • prepareCall (sql):创建执行存储过程的 callableStatement 对象。
  • setAutoCommit (boolean autoCommit):设置事物是否自动提交。
  • commit():在链接上提交事物。
  • rollback():在此链接上回滚事物。
  1. Statement 接口

用于执行静态 SQL 语句并返回它所生成结果的对象

三种 Statement 类:

  • Statement:由 createStatement 创建,用于发送简单的 SQL 语句 (不带参数)。
  • PreparedStatement:继承自Statement接口,由 preparedStatement 创建,用于发送含有一个或多个参数的 SQL 语句。PreparedStatement 对象比 Startement 对象的效率更高,并且可以防止 SQL 注入,所以一般我们都使用 PreparedStatement
  • CallableStatement:继承自 PreparedStatement 接口,由方法 prepareCall 创建,用于调用 存储过程。

常用Statement 方法:

  • execute (String sql):运行语句,返回是否有结果集
  • executeQuery (String sql):运行select语句,返回 ResultSet 结果集。
  • executeUpdate (String sql):运行insert/update/delete操作,返回更新的行数。
  • addBatch (String sql):把多条 sql 语句放到一个批处理中。
  • executeBatch():向数据库发送一批 sql 语句并执行。
  1. ResultSet 接口

ResulttSet 提供检索不同类型字段的方法,常用的有:

  • getString (int index)、getString (String columnName):获得在数据库里是varchar、char等类型的数据对象。
  • getFloat (int index)、getFloat (String columnName):获得在数据库里是Float类型的数据对象。
  • getDate (int index)、getDate (String columnName):获得在数据库里是Date类型的数据。
  • getBoolean (int index)、getBoolean (String columnName):获得在数据库里是Boolean类型的数据。
  • getObject(int index)、getObject(String columnName):获取在数据库里任意类型的数据。

ResultSet还提供了对结果集进行滚动的方法:

  • next ():移动到下一行
  • Previous ():移动到前一行
  • absolute (int row):移动到指定行
  • beforeFirst ():移动resultSet的最前面。
  • afterLast ():移动到resultSet的最后面。

使用后依次关闭对象及连接:ResultSet → Statement →Connection

三、使用JDBC的步骤

加载JDBC驱动程序 → 建立数据库连接Connection → 创建执行SQL的语句Statement → 处理执行结果ResultSet → 释放资源

  1. 注册驱动 (只做一次)

方式一:Class.forName(“com.MySQL.jdbc.Driver”);

  推荐这种方式,不会对具体的驱动类产生依赖。

方式二:DriverManager.registerDriver(com.mysql.jdbc.Driver);

  会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖。

  1. 建立连接
Connection conn = DriverManager.getConnection(url, user, password);

URL用于标识数据库的位置,通过URL地址告诉JDBC程序连接哪个数据库,URL的写法为:

  image.png

其他参数如:useUnicode=true&characterEncoding=utf8

  1. 创建执行SQL语句的statement
//Statement  
String id = "5";
String sql = "delete from table where id=" +  id;
Statement st = conn.createStatement();  
st.executeQuery(sql);  
//存在sql注入的危险
//如果用户传入的id为“5 or 1=1”,那么将删除表中的所有记录
//PreparedStatement 有效的防止sql注入(SQL语句在程序运行前已经进行了预编译,当运行时动态地把参数传给PreprareStatement时,即使参数里有敏感字符如 or '1=1'也数据库会作为一个参数一个字段的属性值来处理而不会作为一个SQL指令)
String sql = “insert into user (name,pwd) values(?,?)”;  
PreparedStatement ps = conn.preparedStatement(sql);  
ps.setString(1, "col_value");  //占位符顺序从1开始
ps.setString(2, "123456");     //也可以使用setObject
ps.executeQuery();
  1. 处理执行结果(ResultSet)
ResultSet rs = ps.executeQuery();  
While(rs.next()){  
    rs.getString("col_name");  
    rs.getInt(1);  
    //…
}
  1. 释放资源
// 数据库连接(Connection)非常耗资源,尽量晚创建,尽量早的释放 //都要加try catch 以防前面关闭出错,后面的就不执行了  
try {
     if (rs != null) {
         rs.close();
     }
} catch (SQLException e) {
     e.printStackTrace();
} finally {
    try {
         if (st != null) {
             st.close();
         }
     } catch (SQLException e) {
         e.printStackTrace();
     } finally {
         try {
             if (conn != null) {
                 conn.close();
             }
         } catch (SQLException e) {
             e.printStackTrace();
         }
     }
}

上文引自 JDBC详解 - ErBing - 博客园 (cnblogs.com) ,如有侵权请通知。

三、PreparedStatement 接口的解释和用法


PreparedStatement 是 Statement 接口的子接口

优点:

  1. 使用 PreparedStatement 接口可以防止 SQL 注入
  2. PreparedStatement 是预编译(Statement 每次执行sql语句,都要执行相关数据库的编译,而 PreparedStatement 的sql是一个模板 (可以类比函数),编译过程与执行是分开的,当为其参数赋予值时,实际上只是将值给传入进去,放进模板中,需要时取出插入数据即可,不需要继续编译。)的,对于批量处理可以大大提高效率。总的来说,区别在于前者编译执行一体化,后者属于先编译后执行。
  3. 可以重复使用同一SQL模板,给予其不同的参数来重复的使用。

第二点也就是为什么预编译能够防止SQL注入。

创建 PreparedStatement 对象

PreparedStatement ps = null;
try{
    ……
    String sql = "select studentNo from student where studentName = ?";
    ps = connection.prepareStatement(sql);
    ……
} catch (SQLException e) {
    ……
} finally {
    ps.close();
}

在使用 PreparedStatement 对象的同时,所有的参数都被用 ?符号表示,而为其参数赋值则需要用到 setXXX() 方法将值绑定到参数,其中 XXX 表示参数的数据类型

当你没有给参数赋予值,你会收到一个 SQLException

setXXX (int parementerIndex , XXX类型变量) ,每个参数的起始下标为1。

Statement 和 PreparedStatement 执行SQL语句方法的区别

PreparedStatement对象独有的executeQuery()方法是没有参数的,而Statement的executeQuery()是需要参数(SQL语句)的。因为在创建PreparedStatement对象时已经让它与一条SQL模板绑定在一起了,所以在调用它的executeQuery()和executeUpdate()方法时就不再需要参数了。

总结


  • JDBC 由一组使用 Java 语言编写的类和接口组成,可以为多种关系型数据库提供统一的访问方式。
  • JDBC API 是一套接口规范,数据库厂商或第三方中间件厂商根据这套接口规范提供针对不同数据库的数据库驱动
  • JDBC操作步骤
  • 加载JDBC驱动
  • 获取数据库连接
  • 创建SQL语句集,发送SQL语句,并得到返回结果
  • 处理返回结果
  • 每个JDBC驱动只对应一种数据库,甚至只对应某个版本的数据库
  • 数据库操作结束后,应该关闭数据库连接,释放系统资源。为了确保程序的执行,关闭数据库连接语句要放到 finally 语句块中
  • Connection 接口负责连接数据库并担任传达数据库的任务
  • Statement 接口负责执行 SQL 语句
  • ResultSet 接口负责保存和处理 Statement 接口执行后所产生的查询结果
  • SQL 注入是通过提交一段 SQL 代码,执行超出用户权限的数据库操作的攻击行为
  • PreparedStatement 接口能够提高代码的可读性、可维护性、SQL语句的执行性能和安全性
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
存储 监控 安全
单位网络监控软件:Java 技术驱动的高效网络监管体系构建
在数字化办公时代,构建基于Java技术的单位网络监控软件至关重要。该软件能精准监管单位网络活动,保障信息安全,提升工作效率。通过网络流量监测、访问控制及连接状态监控等模块,实现高效网络监管,确保网络稳定、安全、高效运行。
80 11
|
2月前
|
XML Java 编译器
Java注解的底层源码剖析与技术认识
Java注解(Annotation)是Java 5引入的一种新特性,它提供了一种在代码中添加元数据(Metadata)的方式。注解本身并不是代码的一部分,它们不会直接影响代码的执行,但可以在编译、类加载和运行时被读取和处理。注解为开发者提供了一种以非侵入性的方式为代码提供额外信息的手段,这些信息可以用于生成文档、编译时检查、运行时处理等。
83 7
|
2天前
|
JavaScript 安全 Java
智慧产科一体化管理平台源码,基于Java,Vue,ElementUI技术开发,二开快捷
智慧产科一体化管理平台覆盖从备孕到产后42天的全流程管理,构建科室协同、医患沟通及智能设备互联平台。通过移动端扫码建卡、自助报道、智能采集数据等手段优化就诊流程,提升孕妇就诊体验,并实现高危孕产妇五色管理和孕妇学校三位一体化管理,全面提升妇幼健康宣教质量。
28 12
|
28天前
|
SQL Java 关系型数据库
使用 JDBC 实现 Java 数据库操作
JDBC(Java Database Connectivity)是 Java 提供的数据库访问技术,允许通过 SQL 语句与数据库交互。本文详细介绍了 JDBC 的使用方法,包括环境准备、编程步骤和完整示例。
102 7
|
28天前
|
SQL Java 数据库连接
【潜意识Java】Java中JDBC过时方法的替代方案以及JDBC为什么过时详细分析
本文介绍了JDBC中一些常见过时方法及其替代方案。
41 5
|
2月前
|
Java 数据库连接 数据库
springboot java.lang.ClassNotFoundException: dm.jdbc.driver.DmDriver应该如何解决
通过上述步骤,可以有效解决Spring Boot项目中遇到的 `java.lang.ClassNotFoundException: dm.jdbc.driver.DmDriver`问题。确保在项目中正确添加达梦数据库的JDBC驱动依赖,并在配置文件中正确配置数据源信息,是解决此问题的关键。通过这些方法,可以确保Spring Boot项目能够正确连接达梦数据库并正常运行。
320 31
|
2月前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
1333 1
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
1月前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
|
2月前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
127 1
|
3月前
|
监控 前端开发 Java
【技术开发】接口管理平台要用什么技术栈?推荐:Java+Vue3+Docker+MySQL
该文档介绍了基于Java后端和Vue3前端构建的管理系统的技术栈及功能模块,涵盖管理后台的访问、登录、首页概览、API接口管理、接口权限设置、接口监控、计费管理、账号管理、应用管理、数据库配置、站点配置及管理员个人设置等内容,并提供了访问地址及操作指南。