JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名。
JDBC库包含的API为每个通常与数据库的使用相关联的任务:
(1)使得连接到数据库
(2)创建SQL或MySQL语句
(3)执行SQL或MySQL的查询数据库
JDBC API支持两层和三层处理模型进行数据库访问,但在一般的JDBC体系结构由两层组成:
(1)JDBC API: 提供了应用程序对JDBC的管理连接。
(2)JDBC Driver API: 支持JDBC管理到驱动器连接。
JDBC API的使用驱动程序管理器和数据库特定的驱动程序提供透明的连接到异构数据库。
JDBC驱动程序管理器可确保正确的驱动程序来访问每个数据源。该驱动程序管理器能够支持连接到多个异构数据库的多个并发的驱动程序。
以下是结构图,它显示了驱动程序管理器方面的JDBC驱动程序和Java应用程序的位置:
JDBC驱动程序实现JDBC API中定义的接口,用于与数据库服务器进行交互。
例如,使用JDBC驱动程序可以打开数据库连接,并通过发送SQL或数据库命令,然后在收到结果与Java进行交互。
java.sql包中附带的JDK包含定义各种类与他们的行为和实际实现在第三方驱动程序。第三方供应商实现了他们的数据库驱动程序的java.sql.Driver接口。
(1)JDBC-ODBC桥驱动
ODBC是由微软提供的编程接口,JDBC也是模仿了ODBC的设计
(2)JDBC-本地驱动
直接使用各个数据库生产商提供的JDBC驱动程序,因为只能应用在特定的数据库上,会丧失程序的可移植性,不过性能很高。
(3)JDBC-网络驱动
将JDBC转换为与DBMS无关的网络协议,之后又被某个服务器转换为一种DBMS协议,所用的具体协议取决于提供者,最为灵活。
(4)本地协议纯JDBC驱动
将JDBC转换为DBMS所使用的网络协议。
(5)主要操作类及接口
常用的类与接口就是DriverManager、Connection、Statement、Result、PreparedStatement
JDBC API提供了以下接口和类:
(1)DriverManager:这个类管理数据库驱动程序的列表。内容是否符合从Java应用程序使用的通信子协议正确的数据库驱动程序的连接请求。识别JDBC在一定子协议的第一个驱动器将被用来建立数据库连接。
(2)Driver:此接口处理与数据库服务器通信。很少直接与驱动程序对象。相反,使用DriverManager中的对象,它管理此类型的对象。它也抽象与驱动程序对象工作相关的详细信息
(3)Connection : 此接口与接触数据库的所有方法。连接对象表示通信上下文,即,与数据库中的所有的通信是通过唯一的连接对象。
(4)Statement : 可以使用这个接口创建的对象的SQL语句提交到数据库。一些派生的接口接受除执行存储过程的参数。
(5)ResultSet:这些对象保存从数据库后,执行使用Statement对象的SQL查询中检索数据。它作为一个迭代器,让您可以通过移动它的数据。
(6)SQLException:这个类处理发生在一个数据库应用程序的任何错误。
以下案例以mysql数据库做设计
(1)导入JDBC包: 添加import语句到Java程序导入所需的类在Java代码中。
(2)注册JDBC驱动程序:这一步会导致JVM加载所需的驱动程序实现到内存中,因此它可以实现JDBC请求。
使用它之前,必须注册你的驱动程序在程序。注册驱动程序是由Mysql驱动程序的类文件被加载到内存中以便它可以被用作JDBC接口的实现过程。
方法一:Class.forName()
注册一个驱动程序中最常用的方法是使用Java的Class.forName()方法来动态加载驱动程序的类文件到内存中,它会自动将其注册。这种方法是可取的,因为它允许使驱动注册配置,便于携带。
下面的示例使用Class.forName()来注册Mysql驱动程序:
try {
Class.forName("com.mysql.jdbc.Driver");
}
catch(ClassNotFoundException ex) {
System.out.println("Error: unable to load driver class!");
}
可以使用getInstance()方法来解决不兼容的JVM,但要编写了两个额外的例外情况如下:
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
}
catch(ClassNotFoundException ex) {
System.out.println("Error: unable to load driver class!");
catch(IllegalAccessException ex) {
System.out.println("Error: access problem while loading!");
catch(InstantiationException ex) {
System.out.println("Error: unable to instantiate driver!");
}
方法(二) - DriverManager.registerDriver()
可以用它来注册一个驱动程序的第二种方法是使用DriverManager.registerDriver()方法。
try {
Driver myDriver = new com.mysql.jdbc.Driver();
DriverManager.registerDriver( myDriver );
}
catch(ClassNotFoundException ex) {
System.out.println("Error: unable to load driver class!");
}
需要做这个注册只能在你的程序一次。可以通过以下两种方式之一注册一个驱动程序。
(3)数据库URL制定:这是创建格式正确的地址指向到要连接的数据库。
当加载的驱动程序,可以建立程序中使用DriverManager.getConnection()方法的连接。为方便参考,让列出了三个重载DriverManager.getConnection()方法:
1.getConnection(String url)
2.getConnection(String url, Properties prop)
3.getConnection(String url, String user, String password)
RDBMS | JDBC驱动程序的名称 | URL格式 |
---|---|---|
MySQL | com.mysql.jdbc.Driver | jdbc:mysql://hostname/ databaseName |
ORACLE | oracle.jdbc.driver.OracleDriver | jdbc:oracle:thin:@hostname:port Number:databaseName |
DB2 | COM.ibm.db2.jdbc.net.DB2Driver | jdbc:db2:hostname:port Number/databaseName |
Sybase | com.sybase.jdbc.SybDriver | jdbc:sybase:Tds:hostname: port Number/databaseName |
(4)创建连接对象:最后,代码调用DriverManager对象的getConnection()方法来建立实际的数据库连接。
getConnection()最常用形式要求传递一个数据库URL,用户名 username和密码 password。
对URL数据库部分databaseName的值:假设使用的是Mysql的驱动程序,需要指定一个主机:端口。
例如:
jdbc:mysql://localhost:3306/test
现在,必须调用适当的用户名和密码以及getConnection()方法来获得一个Connection对象,如下所示:
//连接地址是由各个数据库生产商单独提供的,所以需要单独记住
public static final String URL = "jdbc:mysql://localhost:3306/test";
//连接数据库的用户名
public static final String USER = "root";
//连接数据库的密码
public static final String PASS = "123456";
Connection conn = DriverManager.getConnection(URL, USER, PASS);
完整链接数据库实例:
//驱动程序就是之前在classpath中配置的JDBC的驱动程序的JAR 包中
public static final String DBDRIVER = "com.mysql.jdbc.Driver";
//连接地址是由各个数据库生产商单独提供的,所以需要单独记住
public static final String DBURL = "jdbc:mysql://localhost:3306/test";
//连接数据库的用户名
public static final String DBUSER = "root";
//连接数据库的密码
public static final String DBPASS = "123456";
public static void main(String[] args) {
Connection con = null; //表示数据库的连接对象
try {
Class.forName(DBDRIVER);//1、使用CLASS 类加载驱动程序
con = DriverManager.getConnection(DBURL,DBUSER,DBPASS); //2、连接数据库
System.out.println(con);
con.close(); // 3、关闭数据库
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try{
if(con!=null)
con.close();
}catch(SQLException se){
se.printStackTrace();
}
}
}