JDBC简介

JDBC是Java数据库连接(Java DataBase Connectivity)技术的简称。由一组使用Java语言编写的类和接口组成,可以为多种关系数据库提供统一访问。Sun公司提供了JDBC的接口规范-JDBC API,而数据库厂商或者第三方中间件厂商根据该接口规范提供针对不同数据库的具体实现—JDBC驱动

 

JDBC的工作原理

1.JDBC API

JDBC API 由Sun公司提供,提供了Java应用程序与各种不同数据库交互的标准接口,如Connection (连接)接口,Statement接口,ResultSet(结果集)接口、PreparedStatement接口等。

2.JDBC Driver Manager

JDBC Driver Manager 由Sun公司提供,它负责管理各种不同的JDBC驱动,位于JDK的Java.sql包中

3.JDBC驱动

由各个数据库厂商或者第三方中间件厂商提供,负责连接各种不同的数据库

 

JDBC API介绍

主要做三件事:连接数据库、发送SQL语句、处理结果

DriverManager类:依据数据库不同,管理相应的JDBC驱动

Connection接口:负责连接数据库并担任传送数据的任务

Statement接口:由Connection产生,负责执行SQL语句

ResultSet接口:负责保存和处理Statememt执行后所产生的查询结果

PreparedStatement接口:Statement的子接口,也有Connection产生,统一负责执行SQL语句,但是比Statement相比,具有更好的安全性,高性能,可读性,可维护性。

 

JDBC访问数据库的步骤

1.加载JDBC驱动

使用Class.forName()方法将给定的JDBC驱动类加载到Java虚拟机中。若是系统不存在给定的类,则会引发异常,异常类型为ClassNotFoundExceprion。

Class.forName("JDBC驱动类的名称");

 

2.与数据库建立连接

DriverManager类是JDBC的管理层,作用于用户和驱动程序之间。DriverManager类跟踪可用的驱动程序,并在数据库和相应的驱动程序之间建立连接。当调用getConnection()方法时,DriverManager类首先从已经加载的驱动程序列表中找到一个可以接收该数据库URL的驱动程序,然后请求该驱动程序使用相关的URL、用户名和密码连接到数据库中,于是就建立了与数据库的连接。创建了连接对象并返回引用

Connection con = DriverManager.getConnection(数据库连接字符串,数据库用户名,密码);

3.发送SQL语句,并得到返回结果

一旦建立连接,就使用该连接创建Statement接口的对象,并将SQL语句传递给它所连接的数据库。如果是查询操作,将返回类型为ResultSet的结果集,它包含执行SQL查询的结果。如果是其他操作,将根据调用方法的不同返回布尔值或操作影响的记录数目

Statement stmt = con.createStatement();

ResultSet rs = stme.executeQuery("SELECT id ,name FROM master");

 

4.处理返回结果

主要是针对查询操作的结果集,通过循环取出结果集中每条记录并做相应处理。

while(rs.next){

int id = rs.getInt("id");

String name =rs.getString("name");

System.out.println(id+" "+name);

}

一定要明确使用JDBC的四个基本步骤

Connection接口

两种常用的驱动方式

第一种是JDBC-ODBC桥接方式,适用于个人开发和测试,它通过ODBC与数据库进行连接

第二章是纯Java驱动方式,它直接同数据库进行连接,在生产型开发中,推荐使用纯Java驱动方式

 

使用JDBC-ODBC桥接方式连接数据库

JDBC-ODBC桥接就是将对JDBC API的调用转换为对另一组数据库连接(ODBC)API 的调用

使用JDBC-ODBC桥接方式连接数据库:

JDBC驱动类是“sun.jdbc.odbc.JdbcOdbcDriver”数据库连接字符串以jdbc.odbc开始,后面跟随数据源名称。

需要注意的是,虽然通过JDBC-ODBC桥接方式可以访问所有ODBC可以访问的数据库,但是JDBC-ODBC桥接方式不能提供非常好的性能,一般不适合在实际系统中使用

 

使用纯Java方式连接数据库

虽然连接速度快,具备夸平台的优点,但是这类JDBC驱动一般只能由数据库厂商自己提供,即这类JDBC驱动只对应一种数据库,甚至只对应某个版本的数据库,如果数据库更换了或版本升级,一般需要更换JDBC驱动程序

如果我们使用纯Java驱动方式连接方式,首先下载数据库厂商提供的驱动程序.jar包,引入工程中

注意:

JDBC驱动类的名称书写错误,会出现ClassNotFoundException异常

数据连接字符串,数据库用户名、密码书写错误、出现SQLException异常

数据库操作结束后,没有关闭数据库连接、导致仍旧占有系统资源

关闭数据库连接语句没有放到finally语句块中,导致语句可能没有被执行

 

Statement 接口和Resultet接口

执行SQL语句。Statement接口包换很多基本数据库操作方法,

ResultSet executeQuery(String sql):可以执行SQL查询并获取ResultSet对象

int executeUpdate(String sql):可以执行插入、删除、更新的操作,返回值是执行该操作所影响的行数

boolean execute(String sql):可以执行任意SQL语句。若结果是ResultSet对象,返回trun。若其为更新计数或者不存在任何结果,则返回false

 

ResultSet接口常用方法及作用

方法名 作用

boolean next() 将光标从当前位置向下移动一行

boolean previous() 将光标从当前位置往上移一行

void close() 关闭ResultSet对象

int getInt(int columnIndex) 以int的形式获取结果集当前行指定的列号的值

int getInt(String columnLabel) 以Int的形式获取结果集当前行指定列名的值

float getFloat(int columnIndex) 以float 的形式获取结果集当前行指定的列号的值

float getFloat(int columnLabel) 以float 的形式获取结果集当前行指定列名的值

String getString(int columnIndex) 以String的形式获取结果集当前行指定的列号的值

String getString(String columnLabel) 以String的形式获取结果集当前行指定列名的值

int getRow() 得到光标当前所指行的行号

boolean absolute(int row) 光标一定到row指定的行

 

注意:

我们应该在不需要ResultSet对象、State对象和Connection对象时现实的关闭他们

public void close() throws SQLException

要按先ResultSet结果集,后Statement,最后Connection的顺序关闭资源,因为ResultSet是通过Statement执行SQL命令得到的,而Statement是需要在创建连接后才可以使用的,所以三者之间存在相互依存的关系,关闭时也必须按照依存关系进行

用户如果不关闭ResultSet当Statement关闭、重新执行或用于从多个结果序列中获取下一个结果是,该ResultSet将被自动关闭

 

 

PreparedStatement接口

继承接口来自Statement接口,PreparedStatement比普通Statement对象使用起来更加灵活,更有效率

使用的三个步骤

1.创建PreparedStatement对象

通过Connection接口的PreparedStatement(String sql)方法来创建PreparedStatement对象,SQL语句可具有一个或者多个参数

多个参数要用?隔开

2.设置每个输入参数的值

3.执行SQL语句

ResultSet executeQuery();执行SQL语句查询并获取到ResultSet对象

int executeUpdate();可以执行插入、删除和更新语句。返回值是执行该操作所影响的行数

boolean execute(); 可以执行任意SQL语句,若结果为ResultSet对象,返回true,若其为更新计数或者不存在任何结果,返回flase

 

PreparedStatement 比 Statement 的好处

提高了代码的可读性和可维护性

虽然使用了PreparedStatement代替会多几行代码,但避免繁琐麻烦又容易出错的SQL语句连接

提高了SQL语句执行的性能

创建Statement对象时不使用SQL语句做参数。创建PreparedStatement对象时用SQL语句做参数

提高了安全性

PreparedStatement使用预编译语句,传入的任何数据都不会和已经预编译的SQL语句进行连接,防止SQL注入攻击

 

每一次认真,都是对自己的提升

10-04 18:53