Java网络编程精解讲义12.ppt
《Java网络编程精解讲义12.ppt》由会员分享,可在线阅读,更多相关《Java网络编程精解讲义12.ppt(90页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Java网络编程精解作者:孙卫琴作者:孙卫琴作者:孙卫琴作者:孙卫琴参考书籍:参考书籍:参考书籍:参考书籍:技术支持网址:技术支持网址:技术支持网址:技术支持网址:www.javathinker.orgwww.javathinker.org第12章 通过JDBC API访问数据库参考Java网络编程精解的第12章n12.1 JDBC的实现原理n12.2 安装和配置MySQL数据库n12.3 JDBC API简介n12.4 JDBC API的基本用法n12.5 可滚动以及可更新的结果集n12.6 行集n12.7 调用存储过程n12.8 处理Blob和Clob类型数据n12.9 控制事务n12.1
2、0 数据库连接池第12章 通过JDBC API访问数据库nJDK提供了JDBC API。JDBC是Java DataBase Connectivity的缩写。nJDBC的实现封装了与各种数据库服务器通信的细节。Java程序通过JDBC API来访问数据库,有以下优点:n(1)简化访问数据库的程序代码,无需涉及与数据库服务器通信的细节。n(2)不依赖于任何数据库平台。同一个Java程序可以访问多种数据库服务器。第12章 通过JDBC API访问数据库12.1 JDBC的实现原理nJDBC的实现包括三部分:nJDBC驱动管理器:java.sql.DriverManger类,由SUN公司实现,负责注
3、册特定JDBC驱动器,以及根据特定驱动器建立与数据库的连接。nJDBC驱动器API:由SUN公司制定,其中最主要的接口是java.sql.Driver接口。nJDBC驱动器:由数据库供应商或者其他第三方工具提供商创建,也称为JDBC驱动程序。JDBC驱动器实现了JDBC驱动器API,负责与特定的数据库连接,以及处理通信细节。JDBC驱动器可以注册到JDBC驱动管理器中。12.1 JDBC的实现原理12.1 JDBC的实现原理nSUN公司制定了两套API:nJDBC API:Java应用程序通过它来访问各种数据库。nJDBC驱动器API:当数据库供应商或者其他第三方工具提供商为特定数据库创建JD
4、BC驱动器时,该驱动器必须实现JDBC驱动器API。12.1 JDBC的实现原理nJDBC驱动器可分为以下四类:n第1类驱动器:JDBC-ODBC驱动器。n第2类驱动器:由部分Java程序代码和部分本地代码组成。用于与数据库的客户端API通信。n第3类驱动器:完全由Java语言编写的类库。它用一种与具体数据库服务器无关的协议将请求发送给服务器的特定组件,再由该组件按照特定数据库协议对请求进行翻译,并把翻译后的内容发送给数据库服务器。n第4类驱动器:完全由Java语言编写的类库。它直接按照特定数据库的协议,把请求发送给数据库服务器。12.2 安装和配置MySQL数据库n假定MySQL安装后的根目
5、录为,在/bin目录下提供了mysql.exe,它是MySQL的客户程序,它支持在命令行中输入SQL语句,图12-4显示了MySQL客户程序的界面。12.2 安装和配置MySQL数据库n本节课访问数据库的例子都以STOREDB数据库为例。在STOREDB数据库中有三张表:nCUSTOMERS表:保存了客户信息。本章多数例子都访问这张表。nORDERS表:保存了客户发出的订单信息。ORDERS表的ORDER_NUMBER字段表示订单编号,PRICE字段表示订单价格。ORDERS表的CUSTOMER_ID外键参照CUSTOMERS表的ID主键,参见图12-5。nACCOUNTS表:保存了银行账户的
6、信息,BALANCE字段表示账户的余额。12.2 安装和配置MySQL数据库n例程12-1的schema.sql是一个SQL脚本文件,它包含了创建数据库STOREDB以及三张表的所有SQL语句。例程12-1 schema.sqldrop database if exists STOREDB;create database STOREDB;use STOREDB;create table CUSTOMERS(ID bigint not null auto_increment primary key,NAME varchar(16)not null,AGE INT,ADDRESS varchar(
7、255);12.2 安装和配置MySQL数据库create table ORDERS(ID bigint not null auto_increment primary key,ORDER_NUMBER varchar(16)not null,PRICE FLOAT,CUSTOMER_ID bigint,foreign key(CUSTOMER_ID)references CUSTOMERS(ID);create table ACCOUNTS(ID bigint not null,NAME varchar(15),BALANCE decimal(10,2),primary key(ID)typ
8、e=INNODB;insert into CUSTOMERS(ID,NAME,AGE,ADDRESS)values(1,小张,23,北京);insert into ORDERS(ID,ORDER_NUMBER,PRICE,CUSTOMER_ID)values(1,小张_001,100.12,1);select*from CUSTOMERS;select*from ORDERS;12.3 JDBC API简介nJDBC API主要位于java.sql包中,关键的接口与类包括:nDriver接口和DriverManager类:前者表示驱动器,后者表示驱动管理器。nConnection接口:表示数据
9、库连接。nStatement接口:负责执行SQL语句。nPreparedStatement接口:负责执行预准备的SQL语句。nCallableStatement接口:负责执行SQL存储过程。nResultSet接口:表示SQL查询语句返回的结果集。12.3 JDBC API简介n图12-6为java.sql包中主要的接口与类的类框图。12.3 JDBC API简介1.Driver接口和DriverManager类n所有JDBC驱动器都必须实现Driver接口,JDBC驱动器由数据库厂商或第三方提供。nDriverManager类主要包括以下方法:nregisterDriver(Driver d
10、river):在DriverManger中注册JDBC驱动器。ngetConnection(String url,String user,String pwd):建立和数据库的连接,并返回表示数据库连接的Connection对象。nsetLoginTimeOut(int seconds):设定等待建立数据库连接的超时时间。nsetLogWriter(PrintWriter out):设定输出JDBC日志的PrintWriter对象。12.3 JDBC API简介2.Connection接口nConnection接口主要包括以下方法:ngetMetaData():返回表示数据库的元数据的Data
11、baseMetaData对象。元数据包含了描述数据库的相关信息,本章12.4.10节(元数据)进一步介绍了元数据的作用。ncreateStatement():创建并返回Statement对象。nprepareStatement(String sql):创建并返回PreparedStatement对象。12.3 JDBC API简介3.Statement接口nStatement接口提供了三个执行SQL语句的方法:nexecute(String sql):执行各种SQL语句。nexecuteUpdate(String sql):执行SQL的insert、update和delete语句。该方法返回一
12、个int类型的值,表示数据库中受该SQL语句影响的记录的数目。nexecuteQuery(String sql):执行SQL的select语句。该方法返回一个表示查询结果的ResultSet对象。12.3 JDBC API简介4.PreparedStatement接口nPreparedStatement的使用步骤如下:n(1)通过Connection的prepareStatement()方法生成PreparedStatement对象。以下SQL语句中NAME的值和AGE的值都用“?”代替,它们表示两个可被替换的参数:String sql=select ID,NAME,AGE,ADDRESS f
13、rom CUSTOMERS where NAME=?and AGE=?;PreparedStatement stmt=con.prepareStatement(sql);/预准备SQL语句n(2)调用PreparedStatement的setXXX方法,给参数赋值:stmt.setString(1,Tom);/替换SQL语句中的第一个“?”stmt.setInt(2,20);/替换SQL语句中的第二个“?”n(3)执行SQL语句:ResultSet rs=stmt.executeQuery();12.3 JDBC API简介5.ResultSet接口nResultSet接口表示select查询
14、语句得到的结果集,结果集中的记录的行号从1开始。调用ResultSet对象的next()方法,可以使游标定位到结果集中的下一条记录。n调用ResultSet对象的getXXX()方法,可以获得一条记录中某个字段的值。12.3 JDBC API简介5.ResultSet接口n对于以下的select查询语句,结果集存放在一个ResultSet对象中:String sql=select ID,NAME,AGE,ADDRESS from CUSTOMERS where AGE20;ResultSet rs=stmt.executeQuery(sql);n如果要访问NAME字段,可以采用以下两种方式:r
15、s.getString(2);/指定字段的索引位置或者rs.getString(NAME);/指定字段的名字12.4 JDBC API的基本用法在Java程序中,通过JDBC API访问数据库包括以下步骤。n(1)获得要访问的数据库的驱动器的类库,把它放到classpath中。n(2)在程序中加载并注册JDBC驱动器,其中JDBC-ODBC驱动器是在JDK中自带的,默认已经注册,所以不需要再注册。以下给出了加载并注册MySQL驱动器的代码:/注册MySQL Driverjava.sql.DriverManager.registerDriver(new com.mysql.jdbc.Driver
16、();12.4 JDBC API的基本用法n(3)建立与数据库的连接:Connection con=java.sql.DriverManager.getConnection(dburl,user,password);n(4)创建Statement对象,准备执行SQL语句:Statement stmt=con.createStatement();编写JDC程序的步骤n(5)执行SQL语句:String sql=select ID,NAME,AGE,ADDRESS from CUSTOMERS where AGE20;ResultSet rs=stmt.executeQuery(sql);12.4
17、 JDBC API的基本用法n(6)遍历ResultSet对象中的记录:/输出查询结果while(rs.next()long id=rs.getLong(1);String name=rs.getString(2);int age=rs.getInt(3);String address=rs.getString(4);/打印数据 System.out.println(id=+id+,name=+name+,age=+age+,address=+address);12.4 JDBC API的基本用法n(7)依次关闭ResultSet、Statement和Connection对象:rs.close
18、();stmt.close();con.close();12.4 JDBC API的基本用法nResultSet、Statement和Connection都有close()方法,它们的作用如下:nResultSet的close()方法:释放结果集占用的资源。当ResultSet对象被关闭后,就不允许程序再访问它曾经包含的查询结果,不允许调用它的next()和getXXX()等方法。nStatement的close()方法:释放Statement对象占用的资源。关闭Statement对象时,与它关联的ResultSet对象也被自动关闭。当Statement对象被关闭后,就不允许通过它执行任何SQ
19、L语句。nConnection的close()方法:释放Connection对象占用的资源,断开数据库连接。关闭Connection对象时,与它关联的所有Statement对象也被自动关闭。当Connection对象被关闭后,就不允许通过它创建Statement对象。12.5 可滚动以及可更新的结果集n为了获得可滚动或者可更新的ResultSet对象,需要通过Connection接口的以下方法构造Statement或者PreparedStatement对象:createStatement(int type,int concurrency)/创建Statement对象prepareStateme
20、nt(String sql,int type,int concurrency)/创建PreparedStatement12.5 可滚动以及可更新的结果集n以上type和concurrency参数决定了由Statement或PreparedStatement对象创建的ResultSet对象的特性。ntype参数有以下可选值:nResultSet.TYPE_FORWARD_ONLY:游标只能从上往下移动,即结果集不能滚动。这是默认值。nResultSet.TYPE_SCROLL_INSENSITIVE:游标可以上下移动,即结果集可以滚动。当程序对结果集的内容作了修改,游标对此不敏感。nResult
21、Set.TYPE_SCROLL_SENSITIVE:游标可以上下移动,即结果集可以滚动。当程序对结果集的内容作了修改,游标对此敏感。比如当程序删除了结果集中的一条记录时,游标位置会随之发生变化。12.5 可滚动以及可更新的结果集nconcurrency参数有以下可选值:nCONCUR_READ_ONLY:结果集不能被更新。nCONCUR_UPDATABLE:结果集可以被更新。n例如,按照以下方式创建的结果集可以滚动,但不能被更新。Statement stmt=connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultS
22、et.CONCUR_READ_ONLY);ResultSet rs=stmt.executeQuery(select ID,NAME from CUSTOMERS);12.5 可滚动以及可更新的结果集nResultSet接口提供了一系列用于移动游标的方法:nfirst():使游标移动到第一条记录。nlast():使游标移动到最后一条记录。nbeforeFirst():使游标移动到结果集的开头。nafterLast():使游标移动到结果集的末尾。nprevious():使游标从当前位置向上(或者说向前)移动一行。nnext():使游标从当前位置向下(或者说向后)移动一行。nrelative(in
23、t n):使游标从当前位置移动n行。如果n0,就向下移动,否则就向上移动。当n为1,等价于调用next()方法;当n为-1,等价于调用previous()方法。nabsolute(int n):使游标移动到第n行。参数n指定游标的绝对位置。12.5 可滚动以及可更新的结果集nResultSet接口的以下方法判断游标是否在特定位置:nisFirst():判断游标是否在第一行。nisLast():判断游标是否在最后一行。nisBeforeFirst():判断游标是否在结果集的开头。nisAfterLast():判断游标是否在结果集的末尾。12.5 可滚动以及可更新的结果集n插入记录:nrs.mov
24、eToInsertRow();nrs.updateString(name,小王);nrs.updateInt(age,25);nresultSet.updateString(address,上海);nresultSet.insertRow();/插入一条记录nresultSet.moveToCurrentRow();/把游标移动到插入前的位置12.5 可滚动以及可更新的结果集n更新记录:rs.updateString(name,小王);rs.updateInt(age,29);resultSet.updateString(address,安徽);resultSet.updateRow();/更
25、新记录n删除记录:resultSet.deleteRow();/删除一条记录12.6 行集n可滚动的ResultSet对象尽管便于用户操纵结果集,但是有一个很大的缺陷,那就是在结果集打开期间,必须始终与数据库保持连接。n为了更有效的使用数据库连接,JDBC API提供了另一个用于操纵查询结果的行集接口:javax.sql.RowSet。RowSet接口继承了ResultSet接口,因此RowSet接口也能操纵查询结果。12.6 行集nRowSet具有以下特性:n它的CachedRowSet子接口无需始终与数据库保持连接。nRowSet对象的数据结构没有ResultSet对象那么庞大,并且Row
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 网络 编程 讲义 12
限制150内