您好,欢迎访问三七文档
1JDBC(JavaDataBaseConnectivty)整理人:徐仕锋(Eric)版本号:v2009-1-202一、JDBC概述1概述JDBC从物理结构上说就是Java语言访问数据库的一套接口集合。从本质上来说就是调用者(程序员)和实现者(数据库厂商)之间的协议。JDBC的实现由数据库厂商以驱动程序的形式提供。JDBCAPI使得开发人员可以使用纯Java的方式来连接数据库,并进行操作。ODBC:基于C语言的数据库访问接口。JDBC也就是Java版的ODBC。JDBC的特性:高度的一致性、简单性(常用的接口只有4、5个)。2JDBC的发展没有JDBC之前java程序是这样连接各种数据库的。缺点:1、要求程序员必须熟悉编写java程序连接各种数据库的驱动。2、移植性很不好,更改数据库必须重新编写连接数据库的驱动程序。3用了JDBC以后java连接各种数据库方便多了!3JDBC的API介绍在JDBC中包括了两个包:java.sql和javax.sql。①java.sql基本功能。这个包中的类和接口主要针对基本的数据库编程服务,如生成连接、执行语句以及准备语句和运行批处理查询等。同时也有一些高级的处理,比如批处理更新、事务隔离和可滚动结果集等。②javax.sql扩展功能。它主要为数据库方面的高级操作提供了接口和类。如为连接管理、分布式事务和旧有的连接提供了更好的抽象,它引入了容器管理的连接池、分布式事务和行集(RowSet)等。主要对象和接口:注:除了标出的Class,其它均为接口。API说明java.sql.Connection与特定数据库的连接(会话)。能够通过getMetaData方法获得数据库提供的信息、所支持的SQL语法、存储过程和此连接的功能等信息。代表了数据库。java.sql.Driver每个驱动程序类必需实现的接口,同时,每个数据库驱动程序都应该提供一个实现Driver接口的类。java.sql.DriverManager(Class)管理一组JDBC驱动程序的基本服务。作为初始化的一部分,此接口会尝试加载在”jdbc.drivers”系统属性中引用的驱动程序。只是一个辅助类,是工具。java.sql.Statement用于执行静态SQL语句并返回其生成结果的对象。java.sql.PreparedStatement继承Statement接口,表示预编译的SQL语句的对象,SQL语句被预编译并且存储在PreparedStatement对象中。然后可以使用此对象高效地多次执行该语句。java.sql.CallableStatement用来访问数据库中的存储过程。它提供了一些方法来指定语句所使用的输入/输出参数。java.sql.ResultSet指的是查询返回的数据库结果集。java.sql.ResultSetMetaData可用于获取关于ResultSet对象中列的类型和属性信息的对象。4驱动程序工作分类驱动程序按照工作方式分为四类:1、JDBC-ODBCbridge+ODBC驱动JDBC-ODBCbridge桥驱动将JDBC调用翻译成ODBC调用,再由ODBC驱动翻译成访问数据库命令。优点:可以利用现存的ODBC数据源来访问数据库。缺点:从效率和安全性的角度来说的比较差。不适合用于实际项目。2、基于本地API的部分Java驱动我们应用程序通过本地协议跟数据库打交道。然后将数据库执行的结果通过驱动程序中的Java部分返回给客户端程序。4优点:效率较高。缺点:安全性较差。3、纯Java的网络驱动(中间协议)(本地协议)appJDBC纯Java中间服务器DB缺点:两段通信,效率比较差优点:安全信较好4、纯Java本地协议:通过本地协议用纯Java直接访问数据库。特点:效率高,安全性好。二、JDBC编程步骤1注册一个Driver注册驱动程序有三种方式:方式一:Class.forName(“oracle.jdbc.driver.OracleDriver”);JAVA规范中明确规定:所有的驱动程序必须在静态初始化代码块中将驱动注册到驱动程序管理器中。方式二:Driverdrv=neworacle.jdbc.driver.OracleDriver();DriverManager.registerDriver(drv);方式三:通过设置系统属性jdbc.drivers,编译时在虚拟机中加载驱动.javacxxx.java(要确保驱动包在classpath里)java–Djdbc.drivers=驱动全名类名使用系统属性名,加载驱动-D表示为系统属性赋值附:mysql的Driver的全名com.mysql.jdbc.DriverSQLServer的Driver的全名com.microsoft.jdbc.sqlserver.SQLServerDriverJDBC中驱动加载的时序图以上是JDBC中驱动加载的时序图。时序图主要有以下7个动作:必须掌握!51.客户调用Class.forName(“XXXDriver”)加载驱动。2.此时此驱动类首先在其静态语句块中初始化此驱动的实例。3.再向驱动管理器注册此驱动。4.客户向驱动管理器DriverManager调用getConnection方法,5.DriverManager调用注册到它上面的能够理解此URL的驱动建立一个连接,6.在该驱动中建立一个连接,一般会创建一个对应于数据库提供商的XXXConnection连接对象,7.驱动向客户返回此连接对象,不过在客户调用的getConnection方法中返回的为一个java.sql.Connection接口,而具体的驱动返回一个实现java.sql.Connection接口的具体类。2建立连接conn=DriverManager.getConnection(“jdbc:oracle:thin:@192.168.0.20:1521:tarena”,”User”,”Pasword”);Connection连接是通过DriverManager的静态方法getConnection(.....)来得到的,这个方法的实质是把参数传到实际的Driver中的connect()方法中来获得数据库连接的。OracleURL的格式:jdbc:oracle:thin:(协议)@XXX.XXX.X.XXX:XXXX(IP地址及端口号):XXXXXXX(所使用的库名)MySqlURL的写法例:jdbc:mysql://192.168.8.21:3306/test3获得一个Statement对象Statementstmt=conn.createStatement();4通过Statement执行Sql语句stmt.executeQuery(Stringsql);//返回一个查询结果集。stmt.executeUpdate(Stringsql);//返回值为int型,表示影响记录的条数。将sql语句通过连接发送到数据库中执行,以实现对数据库的操作。5处理结果集使用Connection对象获得一个Statement,Statement中的executeQuery(Stringsql)方法可以使用select语句查询,并且返回一个结果集ResultSet通过遍历这个结果集,可以获得select语句的查寻结果,ResultSet的next()方法会操作一个游标从第一条记录的前面开始读取,直到最后一条记录。executeUpdate(Stringsql)方法用于执行DDL和DML语句,比如可以update,delete操作。IP地址及端口号和数据库实例名用户名,密码6只有执行select语句才有结果集返回。例:Statementstr=con.createStatement();//创建StatementStringsql=”insertintotest(id,name)values(1,”+”’”+”test”+”’”+”)”;str.executeUpdate(sql);//执行Sql语句Stringsql=”select*fromtest”;ResultSetrs=str.executeQuery(Stringsql);//执行Sql语句,执行select语句后有结果集//遍历处理结果集信息while(rs.next()){System.out.println(rs.getInt(“id”));System.out.println(rs.getString(“name”))}6关闭数据库连接(释放资源)rs.close();stmt.close();con.close();ResultSetStatementConnection是依次依赖的。注意:要按先ResultSet结果集,后Statement,最后Connection的顺序关闭资源,因为Statement和ResultSet是需要连接时才可以使用的,所以在使用结束之后有可能其它的Statement还需要连接,所以不能现关闭Connection。图形演绎编写JDBC程序的一般过程三、JDBC中几个重要接口next()如果有下一条记录返回true,否则为false;有,则游标向下一条记录.DriverManagerConnectionStatementResultSetJDBC驱动程序通过Driver创建创建创建数据SQL已经建立到DB连接数据库DB①注册JDBC驱动程序;②建立到DB连接;③创建SQL语句;④执行SQL语句;⑤处理结果(有的话);⑥与数据库断开连接。71Statement——SQL语句执行接口Statement接口代表了一个数据库的状态,在向数据库发送相应的SQL语句时,都需要创建Statement接口或者PreparedStatement接口。在具体应用中,Statement主要用于操作不带参数(可以直接运行)的SQL语句,比如删除语句、添加或更新。扩展:如何进行模糊查询?----关键点:如何根据条件拼接SQL语句。2PreparedStatement——预编译的Statement第一步:通过连接获得PreparedStatement对象,用带占位符(?)的sql语句构造。PreparedStatementpstm=con.preparedStatement(“select*fromtestwhereid=?”);第二步:设置参数pstm.setString(1,“ganbin”);第三步:执行sql语句Rs=pstm.excuteQuery();statement发送完整的Sql语句到数据库不是直接执行而是由数据库先编译,再运行。而PreparedStatement是先发送带参数的Sql语句,再发送一组参数值。如果是同构的sql语句,PreparedStatement的效率要比statement高。而对于异构的sql则两者效率差不多。同构:两个Sql语句可编译部分是相同的,只有参数值不同。异构:整个sql语句的格式是不同的注意点:1、使用预编译的Statement编译多条Sql语句一次执行2、可以跨数据库使用,编写通用程序3、能用预编译时尽量用预编译3ResultSet——结果集操作接口ResultSet接口是查询结果集接口,它对返回的结果集进行处理。ResultSet是程序员进行JDBC操作的必需接口。4ResultSetMetaData——元数据操作接口ResultSetMetaData是对元数据进行操作的接口,可以实现很多高级功能。Hibernate运行数据库的操作,大部分都是通过此接口。可以认为,此接口是SQL查询语言的一种反射机制。8ResultSetMetaData接口可以通过数组的形式,遍历数据库的各个字段的属性,对于我们开发者来说,此机制的意义重大。JDBC通过元数据(MetaData)来获得具体的表的相关信息,例如,可以查询数据库中有哪些表,表有哪些字段,以及字段的属性等。MetaData中通过一系列getXXX将这些信息返回给我们。数据库元数据Databa
本文标题:JDBC学习手册
链接地址:https://www.777doc.com/doc-3888317 .html