JDBC 基础知识(二)

时间:2021-08-06 12:02:41
注册驱动程序有多种方法,Class.forName(); 是一种显式地加载。当一个驱动程序类被 ClassLoader 装载后,在溶解的过程中,DriverManager 会注册这个驱动类的实例。这个调用是自动发生的,也就是说 DriverManager.registerDriver() 方法被自动调用了,当然我们也可以直接调用 DriverManager.registerDriver() 来注册驱动程序。但是,以我的经验,MS 的浏览器中 Applet 在调用这个方法时不能成功,也就是说 MS 在浏览器中内置的 JVM 对该方法的实现是无效的。

另外我们还可以利用系统属性 jdbc.drivers 来加载多个驱动程序:
System.setProperty("jdbc.drivers","driver1:driver2:...:drivern");
多个驱动程序之间用“:”隔开,这样在连接时 JDBC 会按顺序搜索,直到找到第一个能成功连接指定 URL 的驱动程序。在这里我们就不介绍 DataSource 的高级特性了。

在成功注册驱动程序后,我们就可以用 DriverManager 的静态方法 getConnection 来得到和数据库连接的引用:
Connection conn = DriverManager.getConnection(url);
如果连接是成功的,则返回 Connection 对象 conn,如果为 null 或抛出异常,则说明没有和数据库建立连接。

对于 getConnection() 方法有三个重载的方法,一种是最简单的只给出数据源即:
getConnection(url)
另一种是同时给出一些数据源信息即:
getConnection(url, Properties)
另外一种就是给出数据源,用户名和密码:
getConnection(url, user, passwod)
对于数据源信息,如果我们想在连接时给出更多的信息可以把这些信息压入到一个 Properties,当然可以直接压入用户名密码,别外还可以压入指定字符集,编码方式或默认操作等一些其它信息。

在得到一个连接后,也就是有了和数据库打交道的通道,我们就可以做我们想要的操作了。还是先来介绍一些一般性的操作。

如果我们要对数据库中的表进行操作,要先绑定一个语句:

JDBC 基础知识(二)Statement sm  =  conn.createStatement();

然后利用这个语句来执行操作。根据操作目的,可以有两种结果返回,如果执行的查询操作,返回为结果集 ResultSet,如果执行更新操作,则返回操作的记录数 int。
【注意】SQL 操作严格区分只有两个,一种就是读操作(查询操作),另一种就是写操作(更新操作)。所以,create、insert、update、drop、delete 等对数据有改写行为的操作都是更新操作。

JDBC 基础知识(二)ResultSet rs  =  sm.executeQuery( " select * from table where ... " );
JDBC 基础知识(二)
int  x  =  sm.executeUpdate( " delete from table where ... " );

如果你硬要用 executeQuery 执行一个更新操作是可以的,但不要把它赋给一个句柄,当然稍微有些经验的程序员是不会这么做的。
至于对结果集的处理,我们后面再讨论。因为它是可操作的可选项,只有查询操作才返回结果集。
对于一次操作过程的完成,一个非常必要的步骤是关闭数据库连接,在你没有了解更多的 JDBC 知识这前,你先把这一步骤作为 JDBC 操作中最最重要的一步,在以后的介绍中我会不断地提醒你去关闭数据库连接!

按上面介绍的步骤,一个完整的例子是这样的:(注意,为了按上面的步骤介绍,这个例子不是最好的)

JDBC 基础知识(二)JDBC 基础知识(二)try   ... {
JDBC 基础知识(二)    Class.forName(
"org.gjt.mm.mysql.Driver");
JDBC 基础知识(二)JDBC 基础知识(二)}
catch (Exception e)  ... {
JDBC 基础知识(二)    System.out.println(
"没有成功加载驱动程序:"+e.toString());
JDBC 基础知识(二)    
return;
JDBC 基础知识(二)}
  //  对于经验丰富的人, 可以直接从 e.toString() 的简单的几个字判
JDBC 基础知识(二)  
//  断出异常原因. 如果你是一个新手应该选捕获它的子类, 如何知
JDBC 基础知识(二)  
//  道要捕获哪几个异常呢? 一个简单的方法就是先不加 try{}, 直接
JDBC 基础知识(二)  
//  Class.forName("org.gjt.mm.mysql.Driver"), 编译器就会告诉你
JDBC 基础知识(二)  
//  要你捕获哪几个异常了, 当然这是投机取巧的方法, 最好还是自
JDBC 基础知识(二)  
//  己去看 JDK 文档,它会告诉你每个方法有哪些异常要你捕获.
JDBC 基础知识(二)
Connection conn  =   null ;
JDBC 基础知识(二)JDBC 基础知识(二)
try   ... {
JDBC 基础知识(二)    conn 
= DriverManager.getConnection(
JDBC 基础知识(二)        
"jdbc:mysql://host:3306/mysql",
JDBC 基础知识(二)        
"user",
JDBC 基础知识(二)        
"passwd");
JDBC 基础知识(二)    Statement sm 
= conn.createStatement();
JDBC 基础知识(二)    ResultSet rs 
= sm.executeQuery("select * from table");
JDBC 基础知识(二)    
// ResultSet 处理
JDBC 基础知识(二)
    [rs.close();]
JDBC 基础知识(二)    [sm.close();]
JDBC 基础知识(二)JDBC 基础知识(二)}
catch (Exception e)  ... {
JDBC 基础知识(二)    System.out.println(
"数据库操作出现异常:"+e.toString());
JDBC 基础知识(二)JDBC 基础知识(二)}
finally   ... {
JDBC 基础知识(二)JDBC 基础知识(二)    
try ...{
JDBC 基础知识(二)        conn.close();
JDBC 基础知识(二)JDBC 基础知识(二)    }
catch(Exception) ...{
JDBC 基础知识(二)    }

JDBC 基础知识(二)}
  //  不管你以前学习到的关于数据库流程是如何操作的
JDBC 基础知识(二)  
//  如果你相信我, 从现在开始, 请你一定要把数据库关
JDBC 基础知识(二)  
//  闭的代码写到 finally 块中, 切记!