目录
一、JDBC
在web开发中,大量使用数据库来存储和管理数据。而使用java语言来控制数据库,则需要一种工具——“JDBC”
JDBC的全称是Java数据库连接(Java Database Connectivity),它是一套用于执行SQL语句的Java API。应用程序可通过这套API连接到关系数据库,并使用SQL语句来完成对数据库中数据的查询、更新和删除等操作。应用程序使用JDBC访问数据库的方式如下图所示:
使用JDBC访问特定的数据库,需要与不同的数据库驱动进行连接。
由于不同数据库厂商提供的数据库驱动不同,JDBC不仅需要提供访问数据库的API,还需要封装与各种数据库服务器通信API。如下图:
从上图分析,JDBC的实现主要为三部分:
(1)JDBC驱动管理器:负责注册特定的JDBC驱动器,主要通过java.sql. Driver Manager类实现。
(2)JDBC驱动器API:由Sun公司负责制定,其中最主要的接口是java.sql. Driver接口。
(3)JDBC驱动器:它是一种数据库驱动,由数据库厂商创建,也称为JDBC驱动程序JDBC驱动器实现了JDBC驱动器API,负责与特定的数据库连接,以及处理通信细节。(简单理解就是各个数据库专有连接驱动器,例如Mysql的驱动器)
二、JDBC常用API
JDBC API主要位于java.sql包中,该包定义了一系列访问数据库的接口和类,具体如下。
1. Driver接口
Driver接口是所有JDBC驱动程序必须实现的接口,该接口专门提供给数据库厂商使用。在编写JDBC程序时,必须要把指定数据库驱动程序或类库加载到项目的classpath中。
2. DriverManager类
Driver Manager类用于加载JDBC驱动并且创建与数据库的连接。在Driver Manager类中,定义了两个比较重要的静态方法。如表所示:
①registerDriver ,向 DriverManager中注册给定的JDBC驱动程程序
registerDriver(Driver driver)
②getConnection 用于建立和数据库的连接,并返回表示连接的 Connection对象
getConnection(String url,String user,String pwd)
3、Connection接口
Connection接口代表Java程序和数据库的连接,在Connection接口中,定义了一系列方法,具体如表所示。
常用的列举如下:
getMetaData()
该方法用于返回表示数据库的元数据的 DatabaseMetaData对象
createStatement()
用于创建一个Statement对象来将SQL语句发送到数据库
prepareStatement(String sql)
用于创建一个PreparedStatement对象来将参数化的SQL语句发送到数据库
prepareCall(String sql)
用于创建一个CallableStatement对象来调用数据库存储过程
4、Statement接口
Statement接口用于向数据库发送SQL语句,在Statement接口中,提供了三个执行SQL语句的方法,具体如表所示。
5. PreparedStatement接口
PreparedStatement是Statement的子接口,用于执行预编译的SQL语句。在PreparedStatement接口中,提供了一些基本操作的方法,具体如表下所示。
executeUpdate()
在此PreparedStatement对象中执行SQL语句,该语句必须是个DML语句或者是无返回内容的SQL语句,比如DDL语句。
DDL(Data Definition Language)数据库定义语言
CREATE
ALTER
DROP
TRUNCATE
COMMENT
RENAME
数据操纵语言(Data Manipulation Language, DML)是用于数据库操作
SELECT
INSERT
UPDATE
DELETE
MERGE
CALL
EXPLAIN PLAN
LOCK TABLE
executeQuery()
在此PreparedStatement对象中执行SQL查询,该方法返回的ResultSet对象
6、CallableStatement接口
CallableStatement是PreparedStatement的子接口,用于执行SQL存储过程。在Callablestatement按接口中,提供了一些基本操作的方法,具体下表所示:
7、ResultSet接口
ResultSet接口表示 select查询语句得到的结果集,该结果集封装在一个逻辑表格中。在 ResultSet接口内部有一个指向表格数据行的游标,ResultSet对象初始化时,游标在表格的第一行之前。下表中列举了ResultSet接口中的常用方法。
常见的 JDBC 组件
JDBC 的 API 提供了以下接口和类:
DriverManager :这个类管理一系列数据库驱动程序。匹配连接使用通信子协议从 JAVA 应用程序中请求合适的数据库驱动程序。识别 JDBC 下某个子协议的第一驱动程序将被用于建立数据库连接。
Driver : 这个接口处理与数据库服务器的通信。你将很少直接与驱动程序互动。相反,你使用 DriverManager 中的对象,它管理此类型的对象。它也抽象与驱动程序对象工作相关的详细信息。
Connection : 此接口具有接触数据库的所有方法。该连接对象表示通信上下文,即,所有与数据库的通信仅通过这个连接对象进行。
Statement : 使用创建于这个接口的对象将 SQL 语句提交到数据库。除了执行存储过程以外,一些派生的接口也接受参数。
ResultSet : 在你使用语句对象执行 SQL 查询后,这些对象保存从数据获得的数据。它作为一个迭代器,让您可以通过它的数据来移动。
SQLException : 这个类处理发生在数据库应用程序的任何错误。
三、实现第一个JDBC程序
(1) 加载并注册数据库驱动,具体方式如下。
DriverManager.registerDriver(Driver driver);
(2) 通过Driver Manager获取数据库连接,具体方式如下。
Connection conn= DriverManager.getConnection(String url, String user, String pass);
从上述方式可以看出,getConnection()方法中有三个参数,它们分别表示数据库url、登录数据库的用户名和密码。
Mysql数据库例子:jdbc:mysql://hostname:port/databasename
(3)通过Connection对象获取Statement对象。Connection创建Statement的方式有如下三种。
① createStatement(): 创建基本的Statement对象。
② prepareStatement(): 创建PreparedStatement对象。
③ preparCall(): 创建CallableStatement对象。
以创建基本的Statement对象为例,具体方式如下。
Statement stmt=conn.createStatement();
(4)使用Statement执行SQL语句。所有的Statement都有如下三种方法来执行语句。
①execute():可以执行任何SQL语句。
②executeQuery():通常执行查询语句,执行后返回代表结果集的Resultset对象。
③executeUpdate():主要用于执行DML和DDL语句。执行DML语句,如INSERT、UPDATE或 DELETE时,返回受SQL语句影响的行数,执行DDL语句返回0。
以executeQuer()方法为例,具体方式如下。
//执行SQL语句,获取结果集ResulSet
ResultSet rs=stmt.executQuery(sql);
(5)操作ResultSet结果集。如果执行的SQL语句是查询语句,执行结果将返回Resultset对象,该对象里保存了SQL语句查询的结果。程序可以通过操作该ResultSet对象来取出查询结果。 ResultSet对象提供的方法主要可以分为以下两类。
①next()、previous()、first()、last()、beforeFirst()、afterLast()、absolute()等移动记录指针的方法
②getXxx()获取指针指向行,特定列的值。
(6)回收数据库资源。关闭数据库连接,释放资源,包括关闭ResultSet、Statement和Connection等资源。
编写第一个JDBC程序,改程序从user表中读取数据,并将结果结果打印在控制台,具体步骤入戏所示。
package com.jdbc.example;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Date;
public class Example01 {
public static void main(String[] args) throws SQLException {
//1.注册数据库的驱动
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//Class.forName("com.mysqk.jdbc.Driver");
//2.通过 DriverManager获取数据库连接
String url="jdbc:mysql://localhost:3306/Example";
String usernames="root";
String password="xxxxxx";
Connection conn=DriverManager.getConnection(url, username, password);
//3.通过 Connection对象获取 Statement对象
Statement stmt= conn.createStatement();
//4.使用 Statement执行SQL语句
String sql="select * from users";
ResultSet rs=stmt.executeQuery(sql);
//5、操作 ResultSet结果集
while (rs.next()) {
//通过列名获取指定字段的值
int id=rs.getInt("id");
String name=rs.getString("name");
String psw=rs.getString("password");
String email=rs.getString("email");
System.out.println(id+"___"+name+"___"+psw+"___"+email);
}
//6.回收数据库 关闭连接
rs.close();
stmt.close();
conn.close();
}
}
1、注册驱动
在注册数据库驱动时,虽然DriverManager.registerDriver(new com. mysql.jdbc.Driver())方法可以完成,但会使数据库驱动被注册两次。这是因为Driver类的源码中,已经在静态代码块中完成了数据库驱动的注册。所以,为了避免数据库驱动被重复注册,只需要在程序中加载驱动类即可,具体加载方式如下所示。
Class.forName("com.mysqk.jdbc.Driver");
2、释放资源
由于数据库资源非常宝贵,数据库允许的并发访问连接数量有限,因此,当数据库资源使用完毕后,一定要记得释放资源。为了保证资源的释放,在Java程序中,应该将最终必须要执行的操作放在finally代码块中,具体方式如下。
if(rs!=null) {
try {
rs.close();
}catch (SQLException e) {
e.printStackTrace();
}
rs=null;
}
if(stmt!=null) {
try {
stmt.close();
}catch (SQLException e) {
e.printStackTrace();
}
stmt=null;
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn=null;
}