Java网络编程精解讲义12.ppt
《Java网络编程精解讲义12.ppt》由会员分享,可在线阅读,更多相关《Java网络编程精解讲义12.ppt(90页珍藏版)》请在三一办公上搜索。
1、Java网络编程精解,作者:孙卫琴参考书籍:技术支持网址:www.javathinker.org,第12章 通过JDBC API访问数据库,参考Java网络编程精解的第12章,12.1 JDBC的实现原理12.2 安装和配置MySQL数据库12.3 JDBC API简介12.4 JDBC API的基本用法12.5 可滚动以及可更新的结果集12.6 行集12.7 调用存储过程12.8 处理Blob和Clob类型数据12.9 控制事务12.10 数据库连接池,第12章 通过JDBC API访问数据库,JDK提供了JDBC API。JDBC是Java DataBase Connectivity的缩写
2、。JDBC的实现封装了与各种数据库服务器通信的细节。Java程序通过JDBC API来访问数据库,有以下优点:(1)简化访问数据库的程序代码,无需涉及与数据库服务器通信的细节。(2)不依赖于任何数据库平台。同一个Java程序可以访问多种数据库服务器。,第12章 通过JDBC API访问数据库,12.1 JDBC的实现原理,JDBC的实现包括三部分:JDBC驱动管理器:java.sql.DriverManger类,由SUN公司实现,负责注册特定JDBC驱动器,以及根据特定驱动器建立与数据库的连接。JDBC驱动器API:由SUN公司制定,其中最主要的接口是java.sql.Driver接口。JDB
3、C驱动器:由数据库供应商或者其他第三方工具提供商创建,也称为JDBC驱动程序。JDBC驱动器实现了JDBC驱动器API,负责与特定的数据库连接,以及处理通信细节。JDBC驱动器可以注册到JDBC驱动管理器中。,12.1 JDBC的实现原理,12.1 JDBC的实现原理,SUN公司制定了两套API:JDBC API:Java应用程序通过它来访问各种数据库。JDBC驱动器API:当数据库供应商或者其他第三方工具提供商为特定数据库创建JDBC驱动器时,该驱动器必须实现JDBC驱动器API。,12.1 JDBC的实现原理,JDBC驱动器可分为以下四类:第1类驱动器:JDBC-ODBC驱动器。第2类驱动
4、器:由部分Java程序代码和部分本地代码组成。用于与数据库的客户端API通信。第3类驱动器:完全由Java语言编写的类库。它用一种与具体数据库服务器无关的协议将请求发送给服务器的特定组件,再由该组件按照特定数据库协议对请求进行翻译,并把翻译后的内容发送给数据库服务器。第4类驱动器:完全由Java语言编写的类库。它直接按照特定数据库的协议,把请求发送给数据库服务器。,12.2 安装和配置MySQL数据库,假定MySQL安装后的根目录为,在/bin目录下提供了mysql.exe,它是MySQL的客户程序,它支持在命令行中输入SQL语句,图12-4显示了MySQL客户程序的界面。,12.2 安装和配
5、置MySQL数据库,本节课访问数据库的例子都以STOREDB数据库为例。在STOREDB数据库中有三张表:CUSTOMERS表:保存了客户信息。本章多数例子都访问这张表。ORDERS表:保存了客户发出的订单信息。ORDERS表的ORDER_NUMBER字段表示订单编号,PRICE字段表示订单价格。ORDERS表的CUSTOMER_ID外键参照CUSTOMERS表的ID主键,参见图12-5。ACCOUNTS表:保存了银行账户的信息,BALANCE字段表示账户的余额。,12.2 安装和配置MySQL数据库,例程12-1的schema.sql是一个SQL脚本文件,它包含了创建数据库STOREDB以及
6、三张表的所有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(255);,12.2 安装和配置MySQL数据库,create table ORDERS(ID bigint not null auto_increment primar
7、y 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)type=INNODB;insert into CUSTOMERS(ID,NAME,AGE,ADDRESS)values(1,小张,23,北京);insert into O
8、RDERS(ID,ORDER_NUMBER,PRICE,CUSTOMER_ID)values(1,小张_001,100.12,1);select*from CUSTOMERS;select*from ORDERS;,12.3 JDBC API简介,JDBC API主要位于java.sql包中,关键的接口与类包括:Driver接口和DriverManager类:前者表示驱动器,后者表示驱动管理器。Connection接口:表示数据库连接。Statement接口:负责执行SQL语句。PreparedStatement接口:负责执行预准备的SQL语句。CallableStatement接口:负责执行
9、SQL存储过程。ResultSet接口:表示SQL查询语句返回的结果集。,12.3 JDBC API简介,图12-6为java.sql包中主要的接口与类的类框图。,12.3 JDBC API简介,1.Driver接口和DriverManager类所有JDBC驱动器都必须实现Driver接口,JDBC驱动器由数据库厂商或第三方提供。DriverManager类主要包括以下方法:registerDriver(Driver driver):在DriverManger中注册JDBC驱动器。getConnection(String url,String user,String pwd):建立和数据库的连
10、接,并返回表示数据库连接的Connection对象。setLoginTimeOut(int seconds):设定等待建立数据库连接的超时时间。setLogWriter(PrintWriter out):设定输出JDBC日志的PrintWriter对象。,12.3 JDBC API简介,2.Connection接口Connection接口主要包括以下方法:getMetaData():返回表示数据库的元数据的DatabaseMetaData对象。元数据包含了描述数据库的相关信息,本章12.4.10节(元数据)进一步介绍了元数据的作用。createStatement():创建并返回Statemen
11、t对象。prepareStatement(String sql):创建并返回PreparedStatement对象。,12.3 JDBC API简介,3.Statement接口Statement接口提供了三个执行SQL语句的方法:execute(String sql):执行各种SQL语句。executeUpdate(String sql):执行SQL的insert、update和delete语句。该方法返回一个int类型的值,表示数据库中受该SQL语句影响的记录的数目。executeQuery(String sql):执行SQL的select语句。该方法返回一个表示查询结果的ResultSet
12、对象。,12.3 JDBC API简介,4.PreparedStatement接口PreparedStatement的使用步骤如下:(1)通过Connection的prepareStatement()方法生成PreparedStatement对象。以下SQL语句中NAME的值和AGE的值都用“?”代替,它们表示两个可被替换的参数:String sql=select ID,NAME,AGE,ADDRESS from CUSTOMERS where NAME=?and AGE=?;PreparedStatement stmt=con.prepareStatement(sql);/预准备SQL语句(
13、2)调用PreparedStatement的setXXX方法,给参数赋值:stmt.setString(1,Tom);/替换SQL语句中的第一个“?”stmt.setInt(2,20);/替换SQL语句中的第二个“?”(3)执行SQL语句:ResultSet rs=stmt.executeQuery();,12.3 JDBC API简介,5.ResultSet接口ResultSet接口表示select查询语句得到的结果集,结果集中的记录的行号从1开始。调用ResultSet对象的next()方法,可以使游标定位到结果集中的下一条记录。调用ResultSet对象的getXXX()方法,可以获得一
14、条记录中某个字段的值。,12.3 JDBC API简介,5.ResultSet接口对于以下的select查询语句,结果集存放在一个ResultSet对象中:String sql=select ID,NAME,AGE,ADDRESS from CUSTOMERS where AGE20;ResultSet rs=stmt.executeQuery(sql);如果要访问NAME字段,可以采用以下两种方式:rs.getString(2);/指定字段的索引位置或者rs.getString(NAME);/指定字段的名字,12.4 JDBC API的基本用法,在Java程序中,通过JDBC API访问数据
15、库包括以下步骤。(1)获得要访问的数据库的驱动器的类库,把它放到classpath中。(2)在程序中加载并注册JDBC驱动器,其中JDBC-ODBC驱动器是在JDK中自带的,默认已经注册,所以不需要再注册。以下给出了加载并注册MySQL驱动器的代码:/注册MySQL Driverjava.sql.DriverManager.registerDriver(new com.mysql.jdbc.Driver();,12.4 JDBC API的基本用法,(3)建立与数据库的连接:Connection con=java.sql.DriverManager.getConnection(dburl,use
16、r,password);(4)创建Statement对象,准备执行SQL语句:Statement stmt=con.createStatement();编写JDC程序的步骤(5)执行SQL语句:String sql=select ID,NAME,AGE,ADDRESS from CUSTOMERS where AGE20;ResultSet rs=stmt.executeQuery(sql);,12.4 JDBC API的基本用法,(6)遍历ResultSet对象中的记录:/输出查询结果while(rs.next()long id=rs.getLong(1);String name=rs.ge
17、tString(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的基本用法,(7)依次关闭ResultSet、Statement和Connection对象:rs.close();stmt.close();con.close();,12.4 JDBC API的基本用法,ResultSet、Statement和Connection都有close()方法,它们的作用如
18、下:ResultSet的close()方法:释放结果集占用的资源。当ResultSet对象被关闭后,就不允许程序再访问它曾经包含的查询结果,不允许调用它的next()和getXXX()等方法。Statement的close()方法:释放Statement对象占用的资源。关闭Statement对象时,与它关联的ResultSet对象也被自动关闭。当Statement对象被关闭后,就不允许通过它执行任何SQL语句。Connection的close()方法:释放Connection对象占用的资源,断开数据库连接。关闭Connection对象时,与它关联的所有Statement对象也被自动关闭。当Co
19、nnection对象被关闭后,就不允许通过它创建Statement对象。,12.5 可滚动以及可更新的结果集,为了获得可滚动或者可更新的ResultSet对象,需要通过Connection接口的以下方法构造Statement或者PreparedStatement对象:createStatement(int type,int concurrency)/创建Statement对象prepareStatement(String sql,int type,int concurrency)/创建PreparedStatement,12.5 可滚动以及可更新的结果集,以上type和concurrency参
20、数决定了由Statement或PreparedStatement对象创建的ResultSet对象的特性。type参数有以下可选值:ResultSet.TYPE_FORWARD_ONLY:游标只能从上往下移动,即结果集不能滚动。这是默认值。ResultSet.TYPE_SCROLL_INSENSITIVE:游标可以上下移动,即结果集可以滚动。当程序对结果集的内容作了修改,游标对此不敏感。ResultSet.TYPE_SCROLL_SENSITIVE:游标可以上下移动,即结果集可以滚动。当程序对结果集的内容作了修改,游标对此敏感。比如当程序删除了结果集中的一条记录时,游标位置会随之发生变化。,12
21、.5 可滚动以及可更新的结果集,concurrency参数有以下可选值:CONCUR_READ_ONLY:结果集不能被更新。CONCUR_UPDATABLE:结果集可以被更新。例如,按照以下方式创建的结果集可以滚动,但不能被更新。Statement stmt=connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);ResultSet rs=stmt.executeQuery(select ID,NAME from CUSTOMERS);,12.5 可滚动以及可更新的结果集,
22、ResultSet接口提供了一系列用于移动游标的方法:first():使游标移动到第一条记录。last():使游标移动到最后一条记录。beforeFirst():使游标移动到结果集的开头。afterLast():使游标移动到结果集的末尾。previous():使游标从当前位置向上(或者说向前)移动一行。next():使游标从当前位置向下(或者说向后)移动一行。relative(int n):使游标从当前位置移动n行。如果n0,就向下移动,否则就向上移动。当n为1,等价于调用next()方法;当n为-1,等价于调用previous()方法。absolute(int n):使游标移动到第n行。参数
23、n指定游标的绝对位置。,12.5 可滚动以及可更新的结果集,ResultSet接口的以下方法判断游标是否在特定位置:isFirst():判断游标是否在第一行。isLast():判断游标是否在最后一行。isBeforeFirst():判断游标是否在结果集的开头。isAfterLast():判断游标是否在结果集的末尾。,12.5 可滚动以及可更新的结果集,插入记录:rs.moveToInsertRow();rs.updateString(name,小王);rs.updateInt(age,25);resultSet.updateString(address,上海);resultSet.insert
24、Row();/插入一条记录resultSet.moveToCurrentRow();/把游标移动到插入前的位置,12.5 可滚动以及可更新的结果集,更新记录:rs.updateString(name,小王);rs.updateInt(age,29);resultSet.updateString(address,安徽);resultSet.updateRow();/更新记录删除记录:resultSet.deleteRow();/删除一条记录,12.6 行集,可滚动的ResultSet对象尽管便于用户操纵结果集,但是有一个很大的缺陷,那就是在结果集打开期间,必须始终与数据库保持连接。为了更有效的使
25、用数据库连接,JDBC API提供了另一个用于操纵查询结果的行集接口:javax.sql.RowSet。RowSet接口继承了ResultSet接口,因此RowSet接口也能操纵查询结果。,12.6 行集,RowSet具有以下特性:它的CachedRowSet子接口无需始终与数据库保持连接。RowSet对象的数据结构没有ResultSet对象那么庞大,并且RowSet对象不依赖于数据库连接,因此在分层的软件应用中,可以方便的把RowSet对象移动到其他层。RowSet对象表示的行集总是可以滚动的。,12.6 行集,如图12-11所示,在应用服务器层创建了一个RowSet对象,它包含了某种查询结
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 网络 编程 讲义 12
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-2876266.html