Java之JDBC链接数据库

1.JDBC简介

(1)什么是JDBC

JDBC是Sun开发的一套数据库访问编程接口,是一种SQL级别的API。它由Java语言编写完成,所以具有很好的跨平台特性。使用JDBC编写的数据库应用程序可以在任何支持Java的平台上运行,而不必在不同的平台上编写不同的应用程序。

(2)JDBC如何实现数据库的平台无关性

为了让JDBC与平台无关,JDBC设计了“驱动程序管理类”,该类会动态维护目前所有数据库产品的驱动程序对象,通过加载相应的数据库驱动程序就可以实现对数据库的访问,这里的“驱动程序管理器”就是DriverManager类。

DriverManager类存在已注册的Driver类的清单。当调用方法getConnection()时,它将检查清单中的每个驱动程序,直到找到可与URL中指定的数据库进行链接的驱动程序为止。

Driver的方法connect()使用这个URL来建立实际的链接。

2.JDBC中常用的类和接口

在数据库操作时所调用的类和接口都符合人的逻辑思维,如链接到数据库(Connection)、建立操作指令(Statement)、执行查询指令(executeQuery)、获得查询结果(ResuleSet)等。JDBC的功能基本上归结为3件事,即建立数据库链接、发送SQL语句和处理查询结果。这些任务的完成都基于JDBC API。下面依次介绍常用的JDBC API

(1)驱动程序管理类(DriverManager)

DriverManager类是JDBC的管理层,作用于用户和驱动程序之间。它跟踪可用的驱动程序,并在数据库和相应驱动程序之间建立链接。DriverManager类也处理诸如驱动程序登录时间限制及登录和跟踪消息的显示等事务。对于简单的应用程序,一般程序员需要在此类中直接使用的唯一方法是DriverManager.getConnection(),该方法将建立与数据库的链接。

JDBC允许用户调用DriverManager类的方法getDriver()、getDrivers()和registerDriver()及Driver类的方法connect()。但多数情况下,还是首先考虑让DriverManager类管理数据库链接的细节。

用驱动程序建立链接:

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//加载驱动程序

String url="jdbc: odbc: fred";

DriverManager.getConnection(url,"userID","password");//建立数据库链接

说明:

首先使用Class.forName()方法强行注册数据库驱动程序,url定位一个数据源,其中jdbc为协议,odbc为子协议,fred为数据源名。

1》注册JDBC驱动有三种方式

Class.forName("com.mysql.jdbc.Driver"); 推荐这种方式,不会对具体的驱动类产生依赖。

DriverManager.registerDriverI(com.mysql.jdbc.Driver);会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖。

System.setProperty("jdbc.drivers","driver1:driver2");虽然不会对具体的驱动类产生依赖,但注册不太方便,所以很少使用。

Java之JDBC链接数据库

Java之JDBC链接数据库

Java之JDBC链接数据库


2》建立Connection

Connection conn = DriverManager.getConnection(url,user,password);

url格式:JDBC:子协议:子名称//主机名:端口/数据库名?属性名=属性值&...

User,password可以用“属性名=属性值”方式告诉数据库;

其他参数如:useUnicode=true&characterEncoding=GBK.

Java之JDBC链接数据库

(2)声明类(Statement)

Statement对象用于将SQL语句发送到数据库中,实际上有3种Statement对象,它们都作为在给定链接上执行SQL语句的包容器:Statement、PreparedStatement(从Statement继承而来)和CallableStatement(从PreparedStatement继承而来)。它们都专用于发送特定类型的SQL语句,Statement对象用于执行不带参数的简单SQL语句,PreparedStatement对象用于执行带或不带IN参数的预编译SQL语句,Callable-Statement对象用于执行对数据库已存储过程的调用。Statement接口提供了执行语句和获取结果的基本方法,PreparedStatement接口添加了处理IN参数的方法,而CallableStatement添加了处理OUT参数的方法。

创建并执行Statement对象:

//建立数据库链接,用户名为“linzi”,密码为“helloworld”

Connection con= DriverManager.getConnection(url,"linzi","helloworld");

//创建Statement对象

Statement tmt=con.createStatement();

//通过Statement对象执行select语句在表Table2中选择属性为a、b、c的值集合

ResultSet rs=stmt.executeQuery("Select a,b,c from table2");

说明:

建立了到特定数据库的链接之后,就可以用该链接发送SQL语句。Statement对象用Connection的createStatement()方法创建,而为了执行Statement对象的executeQurey()方法,发送到数据库的SQL语句将被作为参数提供给executeQuery()方法。

(3)数据库链接类(Connection)

 Connection对象代表与数据库的链接。链接过程包括所执行的SQL语句和在该链接上所返回的结果。一个应用程序可以与单个数据库有一个或多个链接,也可以与多个数据库有链接。与数据库建立链接的标准方法是调用DriverManager.getConnection()方法,该方法接受含有某个URL的字符串。DriverManager类(即所谓的JDBC管理层)将尝试找到可与那个URL所代表的数据库进行链接的驱动程序。DriverManager类存有已注册的Driver类的清单。当调用getConnection()方法时,它将检查清单中的每个驱动程序,直到找到可与URL中指定的数据库进行链接为止。

(4)结果集合类(ResultSet)

ResultSet包含符合SQL语句中条件的所有记录,并且它通过一套get方法(这些get方法可以访问当前行中的不同列)提供了对这些行中数据的访问。ResultSet.next()方法用于移动到ResultSet中的下一行,使下一行成为当前行。

代码示例:

java.sql.Statement stmt=conn.createStatement();

//获得查询结果集合

ResultSet r=stmt.excuteQuery("Select a,b,c from table1");

while(r.next())//如果结果集合中有数据则打印相应的数据

{ int i=r.getInt("a");//打印当前行的值

String s=r.getString("b");

float f=r.getFloat("c");

System.out.println("ROW="+i+""+s+""+f);

}

3.如何实现数据库的链接

(1)加载合适的数据库驱动程序

使用JDBC首先要理解如何正确装载JDBC驱动程序,这样才可以保证数据库应用程序可以在你的系统上正常运行。

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//加载驱动程序

这段代码的作用是装载jdbc-odbc驱动程序,如果装载指令无法正常执行,需要重新查找该Java版本的文档说明,看这个名称("sun.jdbc.odbc.JdbcOdbcDriver")是否变了。

在编写这段代码时,最好捕获该异常,即把这行代码放在try块中,在catch块中捕获该异常。如果程序没有抛出异常,则代表驱动程序加载成功,代码修改如下:

try{

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//强行加载数据库驱动程序

}

catch(ClassNotFoundException ex){

System.out.println("加载数据库驱动程序异常");

}

(2)数据库配置问题

如果希望链接数据库首先要完成数据库的配置,这里我们假设用户使用32位Windows操作系统(其他方式需要自己研究相应的文档,找出适用于自己平台的方法)。

依次打开“控制面板”|“管理工具”|“数据源(ODBC)”,会看到如下对话框:

Java之JDBC链接数据库

其中选项卡包括“用户DSN”、“系统DSN”、“文件DSN”等。这里DSN是指“Data Souce Name”(数据源名称)。对JDBC-ODBC而言,唯一重要的是设定系统DSN。如果想测试

配置,并希望查询数据,就有必要在上图所示的对话框中点击“添加”按钮,添加一个数据库驱动程序,并通过单击“配置”按钮,加载一个相应的数据库文件,这里以Microsort Access为例。具体操作步骤如下:

1》设置数据源。如上图所示

2》创建数据源。单击上图所示对话框中右侧“添加”按钮,弹出对话框如下:

Java之JDBC链接数据库

从中选择合适的数据库驱动程序。当然具体加载什么样的驱动程序应该事先了解数据库应用程序使用什么数据库,如果是Access则加载“Driver do Microsoft Access(*.mdb)”驱动程序,若是其他选项,则拖动上下滚动条选择。这里以加载Access数据库驱动程序为例。

3》安装Access数据库。单击下图中的完成按钮

Java之JDBC链接数据库

再单击图中的“配置”按钮,弹出如下对话框

Java之JDBC链接数据库


其中,数据源名可以任意输入。在“数据库”选项中选择合适的数据库,在这里选择的是“D:\phone\phonenew\MobileDB.mdb”数据库。数据源名为“test”.

这样就完成了数据库的配置。

(3)建立数据库链接并获得Statement对象

我们已经完成了数据库的配置,如果需要以某种方式检查数据库查询程序是否能够正确访问数据库的内容,需要执行一下代码,如果没有异常抛出,说明配置正确,可以正确连接数据库并访问了。

测试是否能够正确访问数据库:
String url="jdbc:odbc:test"://test为数据源名

try{

 conn=DriverManager.getConnection(url);//获得Connection对象

stmt = conn.createStatement();//获得Statement对象

}catch(SQLException ex){

ex.printStackTrace();//抛出异常

}

注意:url指定了一个数据源,链接到一个该数据源指定的数据库。如果成功获得Connection对象和Statement对象,则说明数据库配置正确且成功建立了数据库链接。因为在建立数据库链接中可能会出现异常,所以一定要捕获且处理该异常,以增强程序的健壮性。

(4)执行数据库查询语句

测试数据库链接成功之后,经常需要进行数据库操作。这里我们以查询数据库为例说明如何使用Statement对象的方法实现数据查询。

rs=stmt.executeQurey("select * from dual");

说明:

方法executeQuery("select语句") 实现了对数据库的操作,参数为标准的select语句

(5)获得查询结果

通过Statement对象stmt多的的对象rs是个集合对象,所以获得的结果是满足select语句条件的一个集合。调用ResultSet的next()函数,该函数返回布尔值false或true。如果结果集中有数据,则返回true;如果没有则返回false.开始时扫描指针指向结果集中的第一个数据行之前的位置。

//判断该行集合是否还有记录

if(rs.next()){

//如果有记录,则获得该记录中列名称为aa的值

getresult=rs.getString("aa");

}

(6)关闭数据库链接

为了防止内存泄漏,最后一定要关闭数据库链接,关闭步骤依次结果集合对象、声明对象和数据库链接对象。

rs.close();

stmt.close();

conn.close();

注意:

牢记数据库的关闭顺序,以及最后一定要关闭数据库链接,释放操作系统的内存资源,以防止内存泄漏。

(7)完整的示例过程

//导入数据库操作需要的类
import java.sql.*;
//定义一个类
public class ReadAndWriteUserPasswordDB {
private Connection conn;//定义一个数据库链接对象
private Statement stmt;//定义一个声明对象
private ResultSet rs;//定义一个结果集对象
private String getresult=null;
private boolean passFlag=false;
//定义并实现一个方法,该方法完成数据库驱动程序的加载和完成数据库的链接
public ReadAndWriteUserPasswordDB(){
try{
Class.forName("oracle.jdbc.driver.OracleDriver");//加载数据库驱动程序
}catch(ClassNotFoundException ex){
ex.printStackTrace();
}
String url="jdbc:oracle:thin:@127.0.0.1:1521:orcl";//获得数据库链接对象
try{
conn=DriverManager.getConnection(url,"scott","tiger");//获得数据库链接对象
stmt=conn.createStatement();//通过数据库链接对象建立数据库声明对象
}catch(SQLException ex){//捕获异常并处理异常
ex.printStackTrace();
}
}
//定义并实现一个方法,该方法读数据库,并搜索与用户名匹配的密码,如果用户名不存在或该用户的密码输入不正确,则设置标志passFlag
//为false
public String readDB(String username,String password) throws Exception{
getresult=null;
//执行select语句,返回与username相同的用户密码
rs=stmt.executeQuery("select password from userlogin where username="+username+"");
if(rs.next()){
getresult=rs.getString("password");
if(getresult.equals(password)){
this.passFlag=true;
}
else
this.passFlag=false;
}
else
this.passFlag=false;

//如果没有找到数据,则返回null
return getresult;
}
//关闭数据库的链接
public void close() throws Exception{
rs.close();
stmt.close();
conn.close();
}
}

//定义程序主类
public class Test {  
public static void main(String[] args) throws Exception { 
ReadAndWriteUserPasswordDB rw = new ReadAndWriteUserPasswordDB();
String aa=rw.readDB("'liu'", "111");
rw.close();
System.out.println(aa);
}
}

注意:

《1》 加载数据库驱动程序 Class.forName("oracle.jdbc.driver.OracleDriver");

需要在eclipse中引入Oracle 11g自带的JDBC包,否则报错:java.lang.ClassNotFoundException.

导入步骤:在eclipse中右击java项目,选择“Build Path”、“Configure Build Path”,单击“Add External JARs”按钮,选择你的ojdbc6.jar;

ojdbc6.jar在oracle的安装目录D:\ruanjian\oracle\product\11.2.0\dbhome_1\jdbc\lib下

《2》报错:无效的Oracle URL

thin的后面要加冒号

Java之JDBC链接数据库

《3》String aa=rw.readDB("'liu'", "111");传参的时候,如果是字符串 ‘’单引号要带上。