您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > JDBC经典攻坚学习笔记
JDBC(JavaDataBaseConnectivity,java数据库连接),由一些接口和类构成的API。JDBC是J2SE的一部分,由java.sql.javax.sql包组成。JDBC的核心是接口,Driver实现了JDBC的接口。SUN公司设计接口(或者规范、标准),生产厂商来实现这些接口,即它们各自的Driver。JAVA程序包括JAVA应用程序和小应用程序,主要是根据JDBC方法实现对数据库的访问和操作。完成的主要任务有:请求与数据库建立连接;向数据库发送SQL请求;为结果集定义存储应用和数据类型;查询结果;处理错误;控制传输、提交及关闭连接到呢个操作。JDBC管理器为我们提供了一个“驱动程序管理器”,它能够动态地管理和维护数据库查询所需要的所有驱动程序对象,实现JAVA程序与特定驱动程序的连接,从而体现JDBC的“与平台无关”这一特点。它完成的主要任务有:为特定数据库选择驱动程序;处理JDBC初始化调用;为每个驱动程序提供JDBC功能的入口;为JDBC调用执行参数等。驱动程序处理JDBC方法,想特定数据库发送SQL请求,并为JAVA程序获取结果。在必要的时候,驱动程序可以翻译或优化请求,使SQL请求符合DBMS支持的语言。驱动程序可以完成下列任务:建立与数据库的连接;向数据库发送请求;用户程序请求时,执行翻译;将错误代码格式化成标准的JDBC错误代码等。JDBC是独立于数据库管理系统的,而每个数据库系统均有自己的协议与客户机通信,因此,JDBC利用数据库驱动程序来使用这些数据库引擎。JDBC驱动程序有数据库软件商和第三方的软件商提供,因此,根据编程所使用的数据库系统不同,所需要的驱动程序也有所不同。四类JDBC驱动程序尽管存在数据库语言标准SQL-92,但由于数据库技术发展的原因,各公司开发的SQL存在着一定的差异。因此,当我们想要连接数据库并存取其中的数据时,选择适当类型的JDBC驱动程序是非常重要的。目前JDBC驱动程序可细分为四种类型,如下图所示。不同类型的JDBC驱动程序有着不一样的特性和使用方法。下面将说明不同类型的JDBC驱动程序之间的差异。类型1:JDBC-ODBCBridge。这类驱动程序的特色是必须在我们的计算机上事先安装好ODBC驱动程序,然后通过JDBC-ODBCBridge的转换,把JAVA程序中使用的JDBCAPI转换成ODBCAPI,进而通过ODBC来存取数据库。类型2:JDBC-NativeAPIBridge。同类型1一样,这类驱动程序也必须在我们的计算机上先安装好特定的驱动程序(类似ODBC),然后通过JDBC-NativeAPIBridge的转换,把JAVA程序中使用的JDBCAPI转换成NativeAPI,进而存取数据库。应用程序JDBCMySQLDriverOracleDriverDB2DriverOracleDB2MySQL类型3:JDBC-Middleware。必须在安装数据库管理系统的服务器端加装软件(Middleware),中介软件会负责所有存取数据库时必要的转换。类型4:PureJDBCDriver。使用这类驱动程序时无需安装任何附加的软件,所有存取数据库的操作都直接有JDBC驱动来完成。用JDBC连接Oracle数据库方法一:在Tomcat中配置Oracle的驱动程序OracleJDBC驱动程序的位置:H:\Oracle\jdbc\lib\classes12.jar将此驱动程序拷贝到Tomcat的安装目录的lib文件之中:C:\ProgramFiles\apache-tomcat-6.0.14\lib此时Tomcat就可以连接到oracle驱动程序Oracle驱动名称:使用Class.forName()方法加载相应的数据库驱动程序:Class.forName(oracle.jdbc.driver.OracleDriver);oracle.jdbc.driver.OracleDriver我们不必死记,在Oracle驱动程序classes12.jar下面的oralce.jdbc.dreiver包中就可找到相应OracleDriver.class。Oracle连接地址:StringURL=”jdbc:oracle:thin:@127.0.0.1:1521:myOracle”;或者:StringURL=”jdbc:oracle:thin:@localhost:1521:myOracle”;Connectionct=DriverManager.getConnection(URL);其中jdbc是协议,1521是Oracle默认的端口号,myOracle是数据库的名称与使用JDBC-ODBC类似,只是连接的驱动名称和驱动地址改变。方法二:JDBC-ODBCBridge方法Oracle驱动名称:使用Class.forName()方法加载相应的数据库驱动程序:Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);Oracle连接地址:StringURL=”jdbc:odbc:odbcName”;Connectionct=DriverManager.getConnection(URL);其中odbcName是我们设置的要创建的数据源。连接数据库的步骤:1、注册驱动(只做一次)Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);2、建立连接(Connection)StringURL=”jdbc:odbc:odbcName”;Connectionct=DriverManager.getConnection(URL,”scott”,”tiger”);数据库连接(Connection)是非常稀有的资源,用完后必须马上释放,如果Connection不能及时正确的关闭或释放将导致系统脱机。Connection的使用原则是尽量晚的创建,尽量早的释放。3、创建执行SQL的语句(Statement)Statementst=ct.createStatement();4、执行语句(ResultSet)ResultSetrs=st.executeQuery(“select*fromemp”);5、处理执行结果While(rs.next()){System.out.println(“用户名:”+rs.getString(2));}6、关闭和释放资源rs.close();sm.close();ct.close();为了确保JDBC资源不在出现异常或错误等情况下被不正常关闭,我们应该在用完JDBC资源之后关闭且释放他们。JDBC连接池提供了JDBC连接定义和数目有限的连接,如果数量不够,就需要长时间等待。不正常关闭JDBC连接会导致等待回收无效的JDBC连接。只有正常的关闭和释放JDBC连接,JDBC资源才可以被快速的重用,使性能得到改善。为了确保构建的代码在所有的情况下,甚至是异常和错误条件下,都能关闭和释放JDBC资源。一下代码显示了JDBC资源的获得和使用都封装在“Try-Catch-Finally”结构中。其中,在finally子句中处理JDBC资源的关闭,使所有情况下关闭都将发生。为了简洁,此代码中只把异常抛出并为对异常进行处理。publicstaticvoidmain(String[]args)throwsException{Stringurl=jdbc:oracle:thin:@localhost:1521:myOracle;Connectionct=null;Statementst=null;ResultSetrs=null;try{//1.加载驱动Class.forName(oracle.jdbc.driver.OracleDriver);//2.得到连接ct=DriverManager.getConnection(url,scott,tiger);//创建执行的SQL语句st=ct.createStatement();//执行语句rs=st.executeQuery(select*fromemp);//处理执行结果while(rs.next()){//用户名System.out.println(用户名:+rs.getString(2));}}finally{try{if(rs!=null)rs.close();}finally{try{if(st!=null)st.close();}finally{if(ct!=null)ct.close();}}}}代码优化:新建一个(publicfinal)工具类JdbcUtils,把优化后的代码都放在这个类里面。由于这个类不需要构造实例,因此我们我们定义一个private的构造方法,这样别人就无法new一个对象了。访问这个类有两种方式:一种是单例模式,但是比较复杂;另一种是提供一些静态方法。1、由于驱动只需要注册一次,我们知道静态代码块只有类被装载到虚拟机的时候才被执行一次,因此,我们把注册驱动语句放在一个静态的代码块中。static{try{Class.forName(jdbc:odbc:wanghao);}catch(ClassNotFoundExceptione){thrownewExceptionInInitializerError(e);}}2、当我们的增、删、改、查的操作很多时,如果程序中每个方法都有URL、用户名和密码,我们修改起来就会很麻烦。我们也需要对这一块优化,把他们放到JdbcUtils中,这样就可以实现“一改全改”。privatestaticStringurl=sun.jdbc.odbc.JdbcOdbcDriver;privatestaticStringuser=scott;privatestaticStringpassword=tiger;3、建立连接语句我们也可以把它放在JdbcUtils的一个静态方法中,当我们需要链接时,我们就到JdbcUtils中去取。publicstaticConnectiongetConnection()throwsSQLException{returnDriverManager.getConnection(url,user,password);}4、对释放资源部分进行优化。publicstaticvoidfree(ResultSetrs,Statementst,Connectionct){try{if(rs!=null)rs.close();}catch(SQLExceptione){e.printStackTrace();}finally{try{if(st!=null)st.close();}catch(SQLExceptione){e.printStackTrace();}finally{if(ct!=null)try{ct.close();}catch(SQLExceptione){e.printStackTrace();}}}}完整程序代码如下所示:packagecom.wanghao.jdbc;importjava.sql.Connection;importjava.sql.ResultSet;importjava.sql.Statement;publicclassBase{/***@paramargs*@throwsException*/publicstaticvoidmain(String[]args)throwsException{//TODOAuto-generatedmethodstubtest();}staticvoidtest()throwsException{Connectionct=null;Statementst=null;ResultSetrs=null;try{//2.得到连接ct=JdbcUtils.getConnection();//创建执行的SQL语句st=ct.createStatement();//执行语句rs=st.executeQuery(select*fr
本文标题:JDBC经典攻坚学习笔记
链接地址:https://www.777doc.com/doc-3780150 .html