日期:2014-05-16  浏览次数:20467 次

JDBC备忘录1_JDBC入门

?

JDBC全称 Java Data Base Connectivity

Java数据库连接

?

JDBC API由两部分构成:

java.sql.*和javax.sql.*

java.sql.*提供JDBC基本操作的API,包括数据库连接,增删改查之类的基础API

javax.sql.*提供JDBC的高级操作,为通过Java进行服务器数据源访问和处理提供的API

?


JDBC连接数据库的基本步骤:

(1)注册驱动(只做一次);

(2)建立连接 Connection

(3)创建执行SQL的语句的对象 Statement和PreparedStatement

(4)执行sql语句

(5)处理结果集 ResultSet

(6)释放资源,关闭数据库连接

?

注册驱动的方式:

(1)Class.forName("com.mysql.jdbc.Driver")

将class转载到虚拟机中,但是并不创建实例(newInstance才创建实例)

推荐采用这种方式,不会对具体的驱动类产生依赖;

这种方式没有显示注册驱动,而是在载入虚拟机的时候通过静态代码块的方式来实现驱动注册。详见 mysql Driver类的实现

?

??? ??? //将class装载到虚拟机中,并不创建实例
??? ??? //Class.forName("com.mysql.jdbc.Driver");

?

??????? //创建实例
??? ??? //Class.forName("com.mysql.jdbc.Driver").newInstance();

?

(2)DriverManager.registerDriver(new com.mysql.jdbc.Driver());

会造成DriverManager中产生两个一样的驱动(mysql Drive的实现类),并会对具体的驱动类产生依赖,因为你需要new一个具体的驱动类。

?

????? DriverManager.registerDriver(new com.mysql.jdbc.Driver());

?

(3)System.setProperty("jdbc.drivers", "driver1:driver2");

虽然不会对具体的驱动类产生依赖,但注册不方便,所以很少使用。

?

//System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");

环境变量名是“jdbc.drivers”,可以注册多个驱动,多个驱动以冒号分割,多个驱动类使用Vector保存

?

DriverManager类

    private static void loadInitialDrivers() {
        String drivers;
	
        try {
	    drivers = (String) java.security.AccessController.doPrivileged(
		new sun.security.action.GetPropertyAction("jdbc.drivers"));
        } catch (Exception ex) {
            drivers = null;
        }
        
        // If the driver is packaged as a Service Provider,
        // load it.
        
        // Get all the drivers through the classloader 
        // exposed as a java.sql.Driver.class service.
	
	 DriverService ds = new DriverService();

	 // Have all the privileges to get all the 
	 // implementation of java.sql.Driver
	 java.security.AccessController.doPrivileged(ds);		
	        
         println("DriverManager.initialize: jdbc.drivers = " + drivers);
        if (drivers == null) {
            return;
        }
        while (drivers.length() != 0) {
            int x = drivers.indexOf(':');
            String driver;
            if (x < 0) {
                driver = drivers;
                drivers = "";
            } else {
                driver = drivers.substring(0, x);
                drivers = drivers.substring(x+1);
            }
            if (driver.length() == 0) {
                continue;
            }
            try {
                println("DriverManager.Initialize: loading " + driver);
                Class.forName(driver, true,
			      ClassLoader.getSystemClassLoader());
            } catch (Exception ex) {
                println("DriverManager.Initialize: load failed: " + ex);
            }
        }
    }

?

四种驱动类型:

?

1、 JDBC-ODBC bridge plus ODBC driver:????????JDBC-ODBC桥驱动程序,将JDBC调用转换为ODBC的调用。( This combination provides JDBC access via ODBC drivers. ODBC binary code--and in many cases, database client code-- must be loaded on each client machine that uses a JDBC-ODBC Bridge. Sun provides a JDBC-ODBC Bridge driver, which is appropriate for experimental use and for situations in which no other driver is available.)注意, 必须将ODBC二进制代码(许多情况下还包括数据库客户机代码)加载到使用该驱动程序的每个客户机上。这种类型的驱动程序最适合于企业网(这种网络上客户 机的安装不是主要问题),或者是用Java编写的三层结构的应用程序服务器代码。

2、Native-API partly-Java driver:??将JDBC调用转换为对数据库客户端API的调用。(A native-API partly Java technology-enabled dr