?
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