当前位置:   article > 正文

JDBC概述

JDBC概述

1.简介

JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

Java 具有坚固、安全、易于使用、易于理解和可从网络上自动下载等特性,是编写数据库应用程序的杰出语言。所需要的只是 Java应用程序与各种不同数据库之间进行对话的方法。

JDBC可以在各种平台上使用Java,如Windows,Mac OS和各种版本的UNIX。

JDBC库包括通常与数据库使用相关的下面提到的每个任务的API。

  • 连接数据库。
  • 创建SQL或MySQL语句。
  • 在数据库中执行SQL或MySQL查询。
  • 查看和修改生成的记录。

2.JDBC体系结构

JDBC支持用于数据库访问的两层和三层处理模型,但通常,JDBC体系结构由两层构成:
-JDBC API:这提供了应用程序到JDBC管理器连接
-JDBC驱动程序API:这支持JDBC管理器到驱动程序连接
JDBC API使用驱动程序管理器和特定于数据库的驱动程序来提供与异构数据库的透明连接。

3.JDBC核心组件

•DriverManager:此类管理数据库驱动程序列表。使用通信子协议将来自Java应用程序的连接请求与适当的数据库驱动程序匹配。

•Driver:此接口处理与数据库服务器的通信,我们很少会直接与Driver对象进行交互。而是使用riverManager对象来管理这种类型的对象。

•Connection:该界面具有用于联系数据库的所有方法。连接对象表示通信上下文,即,数据库的所有通信仅连接对象。

•Statement:使用从此接口创建的对象将SQL语句提交到数据库。除了执行存储过程之外,一些派生接口还接收参数。

•ResultSet:在使用Statement对象执行SQL查询后,这些对象保存从数据库检索的数据。它作为一个迭代器,允许我们移动其数据。

•SQLException:此类处理数据库应用程序中发生的任何错误。

4.使用步骤

构建JDBC应用程序涉及以下六个步骤:
•导入包:需要包含数据库编程所需的JDBC类的包。大多数情况下,使用import java.sql.*就足够了。
•注册JDBC驱动程序:要去初始化驱动程序,以便可以打开与数据库的通信通道。
•打开连接:需要使用DriverManager.getConnection()方法创建一个Connection对象,该对象表示与数据库的物理连接。
•执行查询:需要使用类型为Statement的对象来构建和提交SQL语句到数据库。
•从结果集中提取数据:需要使用相应的ResultSet.getXXX()方法从结果集中检索数据。
•释放资源:需要明确地关闭所有数据库资源,而不依赖于JVM的垃圾收集。

5.JDBC连接步骤

•导入JDBC包:将Java语言的import语句添加到Java代码中导入所需的类。
•注册JDBC驱动程序:此步骤将使JVM所需的驱动程序实现加载到内存中,以便它可以满足您的JDBC请求。
•数据库URL配置:这是为了创建一个格式正确的地址,指向要连接到的数据库。
•创建连接对象:最后,调用DriverManager对象的getConnection()方法来建立实际的数据库连接。

Class.forName()
注册驱动程序最常见的方法是使用Java的Class.forName()方法,将驱动程序的类文件动态加载到内存中,并将其自动注册。

try {
	Class.forName("com.mysql.cj.jdbc.Driver");
}catch(ClassNotFoundException ex) {
	System.out.println("Error: unable to load driver class!");
	System.exit(1);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

DriverManager.registerDriver()
第二种方法是使用静态DriverManager.registerDriver()方法

try {
	Driver myDriver = new com.mysql.cj.jdbc.Driver();
	DriverManager.registerDriver( myDriver );
}catch(ClassNotFoundException ex) {
	System.out.println("Error: unable to load driver class!");
	System.exit(1);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

数据库URL配置
加载驱动程序后,可以使用DriverManager.registerDriver()方法建立连接。
以下列出三个重载的DriverManager.getConnection()方法:

  • getConnection(String url)
  • getConnection(String url,Properties prop)
  • getConnection(String url,String user,String password)
    在这里插入图片描述
    创建数据库连接地址
String URL = "jdbc:mysql://localhost:3306/yhp2?serverTimezone=UTC";
String USER = "username";
String PASS = "password" ;
Connection conn = DriverManager.getConnection(URL, USER, PASS);
  • 1
  • 2
  • 3
  • 4

完整的连接地址:
版本1:

jdbc:mysql://localhost:3306/数据库名?
useSSL=false&useUnicode=true&characterEncoding=UTF-8
  • 1
  • 2

版本2:

jdbc:mysql://localhost:3306/yhp2?serverTimezone=UTC
  • 1

使用数据库URL和属性对象
DriverManager.registerDriver()方法的第三种形式需要一个数据库URL和一个Properties对象

DriverManager.getConnection(String url, Properties info);
  • 1
import java.util.*;
String URL = "jdbc:mysql://localhost:3306/yhp2?serverTimezone=UTC";
Properties info = new Properties( );
info.put( "user", "username" );
info.put( "password", "password" );
Connection conn = DriverManager.getConnection(URL, info);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

关闭数据库连接
为确保连接关闭,可以在代码中提供一个“finally”块。一个finally块总是执行,不管是否发生异常。
要关闭上面打开的连接,应该调用close()方法如下:

conn.close();
  • 1

5.1 Statement

创建语句对象
在使用Statement对象执行SQL语句之前,需要使用Connection对象的createStatement()方法创建一个,例:

Statement stmt = null;
try {
	stmt = conn.createStatement( );
	. . .
}catch (SQLException e) {
	 . . . 
}finally { 
. . .
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

创建Statement对象后,可以使用它来执行一个SQL语句,其中有三个执行方法。

  • boolean execute(String SQL):如果检索到ResultSet对象,则返回一个布尔值true;否则返回false。使用此方法执行SQL DDL语句或需要使用真正的动态SQL时。
  • int executeUpdate(String SQL):返回受SQL语句执行影响的行数。使用此方法执行预期会影响多个行的SQL语句,例如INSERT,UPDATE或DELETE语句。
  • ResultSet executeQuery(String SQL):返回一个ResultSet对象。当您希望获得结果集时,请使用此方法,就像使用SELECT语句一样。
    关闭Statement对象
    就像关闭一个Connection对象以保存数据库资源一样,由于同样的原因,还应该关闭Statement对象。
    一个简单的调用close()方法将执行该作业。如果先关闭Connection对象,它也会关闭Statement对象。但是,应始终显式关闭Statement对象,以确保正确清理。
Statement stmt = null;
try {
	stmt = conn.createStatement( );
	 . . . 
}catch (SQLException e) {
	 . . .
}finally {
	stmt.close();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

5.2 SQL注入

就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。比如先前的很多影视网站泄露VIP会员密码大多就是通过Web表单递交查询字符爆出的,这类表单特别容易受到SQL注入式攻击。

String username ="admin";
String password=" 'abc' or 1=1 "; 
String sql="select * from users where username= '"+username+"' and password= "+password;
  • 1
  • 2
  • 3

6. PreparedStatement(预状态通道)

该PreparedStatement的接口扩展了Statement接口,它为您提供了一个通用的Statement对象有两个优点附加功能。
此语句使您可以动态地提供参数。

PreparedStatement pstmt = null;
try {
	String SQL = "Update Employees SET age = ? WHERE id = ?";
	pstmt = conn.prepareStatement(SQL);
	. . . 
}catch (SQLException e) {
	. . . 
}finally { 
	. . . 
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

JDBC中的所有参数都由?符号,这被称为参数标记。在执行SQL语句之前,必须为每个参数提供值。
所述的setXXX()方法将值绑定到所述参数,其中XXX代表要绑定到输入参数的值的Java数据类型。如果忘记提供值,将收到一个SQLException。
每个参数标记由其顺序位置引用。第一个标记表示位置1,下一个位置2等等。该方法与Java数组索引不同,从0开始。

关闭PreparedStatement对象
就像关闭Statement对象一样,由于同样的原因,还应该关闭PreparedStatement对象。
一个简单的调用close()方法将执行该作业。如果先关闭Connection对象,它也会关闭
PreparedStatement对象。但是,应始终显式关闭PreparedStatement对象,以确保正确清理。

PreparedStatement pstmt = null;
try {
	String SQL = "Update Employees SET age = ? WHERE id = ?";
	pstmt = conn.preparedStatement(SQL);
	. . . 
}catch (SQLException e) {
	. . . 
}finally {
	pstmt.close();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

对比statement和PreparedStatement:
(1)statement属于状态通道,PreparedStatement属于预状态通道
(2)预状态通道会先编译sql语句,再去执行,比statement执行效率高
(3)预状态通道支持占位符?,给占位符赋值的时候,位置从1开始
(4)预状态通道可以防止sql注入,原因:预状态通道在处理值的时候以字符串的方式处理

7. ResultSet

SELECT语句是从数据库中选择行并在结果集中查看行的标准方法。该java.sql.ResultSet中的接口表示结果集数据库查询。
ResultSet对象维护指向结果集中当前行的游标。术语“结果集”是指包含在ResultSet对象中的行和列数据。
如果没有指定任何ResultSet类型,您将自动获得一个TYPE_FORWARD_ONLY。
在这里插入图片描述

try {
	Statement stmt = conn.createStatement( 
				ResultSet.TYPE_FORWARD_ONLY, 
				ResultSet.CONCUR_READ_ONLY);
}catch(Exception ex) {
	...
}finally {
	...
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/847988
推荐阅读
相关标签
  

闽ICP备14008679号