JDBCJDBCJDBCJDBC第一天2007200720072007年6666月4444日一、JDBC原理概述1,JDBC是一套协议,是JAVA开发人员和数据库厂商达成的协议,也就是由Sun定义一组接口,由数据库厂商来实现,并规定了JAVA开发人员访问数据库所使用的方法的掉用规范。2,JDBC的实现是由数据库厂商提供,以驱动程序形式提供。3,JDBC在使用前要先加载驱动。JDBC对于使用者要有一致性,对不同的数据库其使用方法都是相同的。4、driver开发必须要实现Driver接口。JDBC驱动程序的类型目前比较常见的JDBC驱动程序可分为以下四个种类:(1)JDBC-ODBC桥加ODBC驱动程序JavaSoft桥产品利用ODBC驱动程序提供JDBC访问。注意,必须将ODBC二进制代码(许多情况下还包括数据库客户机代码)加载到使用该驱动程序的每个客户机上。因此,这种类型的驱动程序最适合于企业网(这种网络上客户机的安装不是主要问题),或者是用Java编写的三层结构的应用程序服务器代码。(2)本地API这种类型的驱动程序把客户机API上的JDBC调用转换为Oracle、Sybase、Informix、DB2或其它DBMS的调用。注意,象桥驱动程序一样,这种类型的驱动程序要求将某些二进制代码加载到每台客户机上。(3)JDBC网络纯Java驱动程序这种驱动程序将JDBC转换为与DBMS无关的网络协议,之后这种协议又被某个服务器转换为一种DBMS协议。这种网络服务器中间件能够将它的纯Java客户机连接到多种不同的数据库上。所用的具体协议取决于提供者。通常,这是最为灵活的JDBC驱动程序。有可能所有这种解决方案的提供者都提供适合于Intranet用的产品。为了使这些产品也支持Internet访问,它们必须处理Web所提出的安全性、通过防火墙的访问等方面的额外要求。几家提供者正将JDBC驱动程序加到他们现有的数据库中间件产品中。(4)本地协议纯Java驱动程序这种类型的驱动程序将JDBC调用直接转换为DBMS所使用的网络协议。这将允许从客户机机器上直接调用DBMS服务器,是Intranet访问的一个很实用的解决方法。由于许多这样的协议都是专用的,因此数据库提供者自己将是主要来源,有几家提供者已在着手做这件事了。据专家预计第(3)、(4)类驱动程序将成为从JDBC访问数据库的首方法。第(1)、(2)类驱动程序在直接的纯Java驱动程序还没有上市前会作为过渡方案来使用。对第(1)、(2)类驱动程序可能会有一些变种,这些变种要求有连接器,但通常这些是更加不可取的解决方案。第(3)、(4)类驱动程序提供了Java的所有优点,包括自动安装(例如,通过使用JDBC驱动程序的appletapplet来下载该驱动程序)。5、JDBC的APIjava.sql包和javax.sql包DriverManager类(驱动管理器),它可以创建连接,它本身就是一个创建Connection的工厂(Factory)。Driver接口入口Connection接口,会根据不同的驱动产生不同的连接Statement接口,发送sql语句ResultSet接口(结果集),是用来接收select语句返回的查寻结果的。其实质类似于集合。以上的资源都需要释放,释放的是数据库的资源JDBC应用步骤1,注册加载一个driver驱动2,创建数据库连接(Connection)3,创建一个Statement(发送sql)4,执行sql语句5,处理sql结果(select语句)6,关闭Statement7,关闭连接Connection。注意:6,7两个步骤势必须要做的,因为这些资源是不会自动释放的,必须要自己关闭访问Oracle的数据库的驱动名字叫o加到环境变量PATH中。jdbc14.jar,这个jar文件中出访的驱动程序的.class文件要使用这个驱动程序,要先将他一,注册加载驱动driver,也就是强制类加载1、Class.forName(driver);driver=oracle.jdbc.driver.OracleDriver;2、Driverd=newDriver类();Driverd=neworacle.jdbc.driver.OracleDriver();DriverManager.registerDriver(d);3、编译时利用虚拟机的系统属性java-Djdbc.drivers=oracle.jdbc.driver.OracleDriver类名(文件)Oracle的Driver的全名oracle.jdbc.driver.OracleDrivermysql的Driver的全名com.mysql.jdbc.DriverSQLServer的Driver的全名com.microsoft.jdbc.sqlserver.SQLServerDriver二,创建连接DriverManager.getConnection(Stringurl,Stringusername,Stringpassword);Connection连接是通过DriverManager的静态方法getConnection(.....)来得到的,这个方法的实质是把参数传到实际的Driver中的connect()方法中来获得数据库连接的。Oracle的URL值是由连接数据库的协议和数据库的IP地址及端口号还有要连接的库名(DatebaseName)OracleURL的格式jdbc:oracle:thin:(协议)@XXX.XXX.X.XXX:XXXX(IP地址及端口号):XXXXXXX(所使用的库名)例:jdbc:oracle:thin:@192.168.0.39:1521:TARENADBMySqlURL的写法例:jdbc:mysql://192.168.8.21:3306/testSQLServerURL的写法例:jdbc:microsoft:sqlserver://192.168.8.21:1433java-Djdbc.drivers=驱动全名类名使用系统属性名,加载驱动-D表示为系统属性赋值使用Connection对象获得一个Statement,Statement中的executeQuery(Stringsql)方法可以使用select语句查询,并且返回一个结果集ResultSet通过遍历这个结果集,可以获得select语句的查寻结果,ResultSet的next()方法会操作一个游标从第一条记录的前边开始读取,直到最后一条记录。executeUpdate(Stringsql)方法用于执行DDL和DML语句,可以update,delete操作。注意:要按先ResultSet结果集,后Statement,最后Connection的顺序关闭资源,因为Statement和ResultSet是需要连接是才可以使用的,所以在使用结束之后有可能起他的Statement还需要连接,所以不能现关闭Connection。作业:修改StudentDao的设计以及实现和测试程序,来完成从命令行传递学生的信息。JDBCJDBCJDBCJDBC第二天2007200720072007年6666月5555日一、提问如何进行代码复用继承复用、组合复用私有复用:一个方法在一个类的内部使用工具方法:使用静态方法,使用类名直接调用二、Statementexecute(sql);当不知道执行的SQL语句是什么类型的时候执行,返回值是booleanexecuteQuery(sql);执行查询语句executeUpdate(sql);执行更新语句三、PreparedStatement可以使用参数替代sql语句中的某些参数使用?代替,他先将带参数的sql语句发送到数据库,进行编译,然后PreparedStatement会将参数发送给数据库。在使用PreparedStatement时,在设置相应参数时,要指明参数的位置和类型,以及给出参数值根据不同的参数类型使用不同的setXXX(参数的位置,参数值)来设置参数例:publicvoidinsert(Students){Connectioncon=ConnectionFactory.getConnection();//建立连接Stringsql=insertintostudent(id,name)values(?,?);PreparedStatementps=null;try{ps=con.prepareStatement(sql);//创建一个PreparedStatementintindex=1;ps.setInt(index++,s.getStuId());//为参数赋值ps.setString(index++,s.getName());ps.executeUpdate();}catch(SQLExceptione){e.printStackTrace();}finally{if(ps!=null)try{ps.close();}catch(SQLExceptione){e.printStackTrace();}if(con!=null)try{con.close();}catch(SQLExceptione){e.printStackTrace();}}}CallableStatement是可以用非sql语句来访问数据库,他是通过调用存储过程(PL/SQL)来访问数据库的。可以直接使用连接来调用prepareCall(...)方法,来执行这个存储过程,...是存储过程的名字。对于系统时间要去数据库时间TimeStamp和Date都可以保存时间TimeStamp可以保存时、分、秒的数据,Date只保存日期年月的信息。SQLException是检查异常必须处理要么throws,要么try{}catch(){}getErrorCode()可以获得错误码,可以对错误进行查询。四、源数据JDBC中有两种源数据,一种是数据库源数据,另一种是ResultSet源数据。源数据就是描述存储用户数据的容器的数据结构。ResultSetrs=ps.executeQuery(sql);ResultSetMetaDatam=rs.getMetaData();getColumnCount(),获得实际列数getColumnName(intcolnum),获得指定列的列名getColumnType(intcolnum),获得指定列的数据类型getColumnTypeName(intcolnum),获得指定列的数据类型名//打印结果集publicstaticvoidprintRS(ResultSetrs)throwsSQLException{ResultSetMetaDatarsmd=rs.getMetaData();while(rs.next()){for(inti=1;i=rsmd.getColumnCount();i++){StringcolName=rsmd.getColumnName(i);StringcolValue=rs.getString(i);if(i1){System.out.print(,);}System.out.print(name+=+value);}System.out.println();}}五、数据库源数据DatabaseMetaDatagetURL(),获得连接数据库的URLgetDatabaseProductName()获得数据库产品的名称getDriverVersion()获得JDBC驱动程序的String形式的版本号getTables()获得数据库中该用户的所有表getUserName()获得数据库用户名。六、事务(Transaction)事务是针对原子操作的,要求原子操作不可再分,要求原子操作必须同时成功同时失败。事务是捆绑的原子操作的边界。JDBC中使用事务,先要使用连接调用setAutoCommite(false)方法,把自动提交(commit)置为false。打开事务就