简单的说JDBC主要完成三件事:
›第一与数据库建立连接;
›第二向数据库发送SQL语句;
›第三处理数据库返回结果。
具体步骤如下:
›第一步:向驱动程序管理器加载、注册JDBC驱动程序。
›第二步:获得特定 的数据库连接。
›第三步:得到SQL语句容器,并发送SQL语句。
›第四步:如果SQL语言有结果集返回的话,处理结果集。
›第五步:关闭数据库连接,这一步非常重要,因为数据库连接是一种非常宝贵的资源,在使用完毕后,必须关闭数据库连接,应放在finally语句中。
注册驱动程序
v向驱动程序管理器加载注册驱动程序时,有一个类和一个接口与之有关,即DriverManager类和Driver接口。

     (1) DriverManager类:DriverManager类代表驱动程序管理器,提供了一批static方法负责驱动程序的调入以及得到特定的数据库连接。这个类中的静态方法如下:

›public static void registerDriver(Driver driver) throws SQLException

  向驱动程序管理器注册一个驱动程序。

›public static void deregisterDriver(Driver driver)throws SQLException

  删除驱动程序管理器中的一个驱动程序。

›public static Connection getConnection(String url)throws SQLException

  获得一个特定的数据库连接,url与上面的格式一样。

›public static Connection getConnection(String url,String user,String password )throws SQLException

  获得一个数据库连接,并且指定用户名和密码。

     (2) Driver接口:接口代表一个驱动程序的对象。

  注册一个odbc的驱动器

  DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());

 

v另外,java.lang包的Class类中有一个静态方法也可以完成这个工作:

  public static ClassforName (String className) throws  ClassNotFoundException

v注册一个odbc的驱动器:

  Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);

v其他驱动器的注册:这两者都会抛异常,注意异常处理

  Oracle驱动:

  Class.forName(“oracle.jdbc.driver.OracleDriver”) ;

  DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());

 

v这个时候要求要找到驱动程序所在的程序库,比如Oracle的JDBC驱动程序在classes12.zip或classes12.jar,必须将该驱动程序的完整路径名放在类路径上,另一种做法是修改classpath环境变量,为其配置上classes12.jar,使用时还要将包导入:

  import oracle.jdbc.driver.*;

连接数据库

vDriverManager类的静态方法getConnection()方法可以连接一个指定的数据库,如:

//连接odbc

   Connection con1 = DriverManager.getConnection(“jdbc:odbc:school”);

//连接Oracle

  String url = “jdbc:oracle:thin:@localhost:1521:myoracle”;

  String userName = “scott”;

  String password = “tiger”;

  Connection conn3 = DriverManager.getConnection(url,userName,password);

v注意异常处理

得到SQL语句容器,并向数据库发送SQL语句

获得SQL语句容器的方法定义在Connection接口中,通过Connection接口我们

可以得到三种类型的容器,如下所示:

(1) public Statement createStatement()throws SQLException

获得SQL语句的容器结果不可滚动不可更新。

(2)public PreparedStatementpreparedStatement(String sql) throws SQLException

获得预编译的SQL语句容器,可以出现?占位符,然后设置,只能是in参数。

(3) public CallableStatementpreparedCall(String sql) throws SQLException

获得调用数据库存储过程或函数的一个对象,占位符?可以是in参数也可以

是out参数。

查看类库掌握3种SQL容器中的方法:后面章节还要详细讲解,先了解一下:

(1)Statement

(2)PreparedStatement

(3)CallableStatement

向数据库发送SQL语句:发送SQL语句在Statment接口中,如下所示:

(1)public intexecuteUpdate(String sql) throws SQLException

向数据库发送SQL语句,注意不能是select语句,返回结构应该是影响的行数。

(2)public ResultSetexcuteQuery(String sql) throws SQLException

向数据库发送select语句,返回结果集。

如:

 try{

  Statement stat = conn.createStatement();

  String sql = “insetr into ……”//省略

  int rows = stat .excuteUpdate(sql);

  System.out.println(rows);

}

Catch(SQLException e){}

处理查询结果

通常对数据库操作最多的就是查询操作,使用executeQuery()方法发送查询语句并返回一个ResultSet对象。例如:

ResultSetrs = stmt.executeQuery(“select * from emp”);

ResultSet是一个以列组织的数据行,默认行指针在第一行前面的位置。

方法如下:

(1)booleannext() throws SQLException

(2)void close() throws SQLException

(3)不同的get方法,对应返回数据库中不同类型

 

下面是开发过程中经常要用到的遍历结果集常用的格式:

 ResultSetrs = stat.executeQuery(“select * from student”);

 while(rs.next()){

   Stirng name = rs.getString(“stud_name”);

   int id = rs.getInt(“stud_id”);

   java.sql.Date birthday = rs.getDate(“stud_birthday”);

   ……

}

关闭数据库连接

由于数据库连接是一种非常宝贵的资源,所以在处理结束后要关闭连接,为此Connection对象提供了简单的close()方法关闭连接。

除了要关闭数据库连接,还要用close方法关闭所有的Statement和ResultSet对象。

代码实例如下:

 try{

  

}

 catch(SQLException e){……}

 finally{

   try{

  if(conn!=null){

  rs.close();

   stat.close();

  conn.close();

  }

  }

   catch(SQLException e){……}

}

 编写数据库连接的工具类

v前面的连接方法是在程序中编写的,是一种人工的方式,象这样的形式我们称为硬编码,使用起来不是十分灵活,如果需要更改数据库,那么就要更改代码,为了避免这种情况的发生,我们也可以通过另外的一种方式来实现数据库的连接,即编写一个数据库连接的通用程序,称为软编码,在软编码过程中我们要使用属性文件或者XML文件来设定数据库的驱动程序、具体连接的URL,用户名和口令。当连接发生改变时我们直接改动属性文件或XML文件就行了。

  (1)准备属性文件或XML文件,在这两个文件中保存连接信息,如:

db.properties:

drivers=oracle.jdbc.OracleDriver

url=jdbc:oracle:thin:@localhost:1521:myoracle

username=scott

password=tiger

import java.io.*;
import java.sql.*;
import java.util.*;
public class DBUtil {
public static Connection getConnection(String fileName) {
Properties p = new Properties();
FileInputStream in = null;
try {
in = new FileInputStream(fileName);
p.load(in);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return createConnection(p);
}
private static Connection createConnection(Properties p) {
Connection conn = null;
String driver = p.getProperty("driver");
String url = p.getProperty("url");
String user = p.getProperty("user");
String password = p.getProperty("password");
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
}


 v事务处理的步骤:

(1)调用Connection的setAutoCommit方法将自动提交设为false;

(2)执行事务中的所有SQL语句;

(3)调用Connection的commit方法提交;

(4)catch语句中执行Connection的rollback方法。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐