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

Oracle JDBC 入门之深入浅出

一、JDBC概述

什么是JDBC
JDBC:JAVA DataBase Connction,同时也是SUN的注册的一个商标。JDBC是JAVA访问各种数据库的事实标准。
对于SUN:JDBC是规定的一套接口和类,对于厂商:必须提供JDBC实现,又叫“驱动”。

简单的说,SUN提供了一套接口和类,规定了JAVA连数据库的一整套接口和类。而各数据库应用厂商,必须实现JDBC相应接口以便采用统一的方法来操作数据库。进行CRUD的操作。

二、Oracle JDBC 相关介绍

本遍介绍java如何连接Oracle 11g数据库,关于Oracle11g 数据库的下载安装方法,请参照Oracle 11g 安装 图文 攻略http://blog.csdn.net/chenshufei2/article/details/7905335  。

安装后,Oracle11g后,必须找到Oracle的jdbc包,即ojdbc.jar。这里使用ojdbc6.jar。  其实这个jar包,可以在Oracle安装目录的:Oracle基目录\product\11.2.0\dbhome_1\jdbc\lib,找到相应的jdbc jar包。若使用Txt文本连接数据库的朋友,可以将此路径配置到环境变量中。使用IDE的朋友可以将此jar包复制到Referenced Libraries中。

通常,java要进行连接数据库,必须提供 JDBC的Driver类和URL数据库的连接实例用户名密码及端口号,然后由此Driver来管理得到Connection进行对数据库的操作。

Oracle 11g中, JDBC Driver类是:oracle.jdbc.OracleDriver。而URL是jdbc:oracle:thin:@主机名或IP:1521:orcl 其中orcl是默认的数据库实例,若项目有自定义的数据库实例,应该将orcl改成XXXX自定义新建的数据库。

三、示例代码分析:

String dbUrl = "jdbc:oracle:thin:@127.0.0.1:1521:orcl" ;
		Connection con = null ;
		Statement statm = null;
		String sql = "Select UserName, Age From temp_1";
		try{
			/*OracleDriver od = (OracleDriver)DriverManager.getDriver(dbUrl);
			System.out.println("------oracel main start---");
			od.main(args);
			System.out.println("------oracel main end---");*/
			Class.forName("oracle.jdbc.OracleDriver");  //这里也可以去掉,因为getConnection方便中,没有注册会根据URL进行loadInitialDrivers呢。
			con = DriverManager.getConnection(dbUrl, "scott", "chen"); 
			//底层原理,若未进行Class.forName注册:
 			/**
			 * 1.先执行到 loadInitialDrivers()方法中,而此方法中有  DriverService ds = new DriverService();java.security.AccessController.doPrivileged(ds);
			 * 上面的doPrivileged是本地方法,可以调用DriverService类中的run方法。类似Thread中run方法被调用原理。			                 * 2. DriverService类的run方法Iterator  ps = Service.providers(java.sql.Driver.class);,这个ps是个底层产生个很特殊的迭代器,因为providers方法执行后,
			 * 它后面的while可以循环两个两个不同的oracle,且在next时,这个自定义的迭代器,又会回调 DriverManager类的registerDriver(java.sql.Driver driver)方法。
			 * 来把需要进行的驱动类进行注册。
			 * 
			 * 当然也可以直接进行注册比如在getConnection前面进行  class.forName("oracle.jdbc.OracleDriver"),而可以明确的是forName加载时会加载类的静态代码块。
			 * 而OracleDriver类有如下静态块,类装配时将会初始化如下代码块:
			 * 
				  static{
						    try
						    {
						      if (defaultDriver == null)
						      {
						        defaultDriver = new oracle.jdbc.OracleDriver();
						        DriverManager.registerDriver(defaultDriver);  //注意这里就进行了注册了。告诉JVM要使用的驱动Driver是OracleDriver的呢。
						      }
						
						      AccessController.doPrivileged(new PrivilegedAction()
						      {
						        public java.lang.Object run()
						        {
						          OracleDriver.registerMBeans();
						          return null;
						        }
						
						      });
						      Timestamp localTimestamp = Timestamp.valueOf("2000-01-01 00:00:00.0");
					        }catch(...){
					          ...
					        }
					        
					        ...
					   }
				而这种方式,肯定会把上面没有写。直接在DriverMananger.getCon..时,再loadInitialDrivers()遍历查找url相符的jdbc driver.
			 * 
			 */
			//registerDriver(java.sql.Driver driver)
			System.out.println(6456081.0/1024);
			statm = con.createStatement();
			ResultSet rs = statm.executeQuery(sql);
			while(rs.next()){
				String UserName = rs.getString("UserName");
				int Age = rs.getInt("Age");
				System.out.println("UserName="+UserName+",Age="+Age);
			}
			
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			try {
				if (null != statm)
					statm.close();
				if (null != con)
					con.close();
			} catch (Exception e) {
				e.printStackTrace();
				System.out.println("关流失败哦");
			}
			
			
		}
		
	}


上面提到,其实也可以不用显示的进行注册Driver,即不用Class.forName("oracle.jdbc.OracleDriver");进行显示注册的。也可以通过getConnection方法在进行loadInit