版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Java程序设计基础与实践主编 费雅洁 中国水利水电出版社第第11章章 数据库应用数据库应用 本章导读 在众多的计算机应用中,有一类重要的计算机应用,称为数据密集型应用,例如,管理信息系统、办公信息系统、银行信息系统、民航定票系统、情报检索系统等,这是最大的计算机应用领域,管理这种大量的、持久的、共享的数据需要数据库技术。 JDBC是Sun提供的一套数据库编程接口,由Java语言编写的类、界面组成。用JDBC编写的程序能够自动地将SQL语句传送给相应的数据库管理系统,而且通过使用JDBC,开发人员可以很方便地将SQL语句传送给几乎任何一种数据库。也就是说,开发人员可以不必写一个程序访问Orac
2、le,写另一个程序访问MySQL,再写一个程序访问SQL Server。 使用Java编写的应用程序可以在任何支持Java的平台上运行,Java和JDBC的结合可以让开发人员在开发数据库应用程序时真正实现“一次编写,处处运行!”。 本章要点 JDBC的类和接口 JDBC访问数据库的步骤 Java连接数据库的方法 11.1 基础知识基础知识 11.1.1 JDBC JDBC(Java Database Connectivity)是一种可用于执行SQL语句的JavaAPI(Application Programming Interface,应用程序设计接口),它由一些Java语言编写的类和界面组成
3、。JDBC为数据库应用开发人员和数据库前台工具开发人员提供了一种标准的应用程序设计接口,使开发人员可以用纯Java语言编写完整的数据库应用程序。 JDBC的类和接口的类和接口 在Java语言中提供了丰富的类和接口用于数据库编程,利用它们可以方便地进行数据的访问和处理。下面主要介绍Java.sql包中提供的常用类和接口。类型名称说 明类Date接收数据库的Date对象DriverManager注册、连接以及注销等管理数据库驱动程序任务DriverPropertyInfo管理数据库驱动程序的属性Time接收数据库的Time对象Types提供预定义的整数列表与各种数据类型的一一对应接口ArrayJa
4、va语言与SQL语言中的ARRAY类型的映射BlobJava语言与SQL语言中的BLOB类型的映射CallableStatemet执行SQL存储过程ClobJava语言与SQL语言中的CLOB类型的映射Connection应用程序与特定数据库的连接DatabaseMetaData数据库的有关信息Driver驱动程序必须实现的接口ParameterMetaDataPreparedStatement对象中变量的类型和属性PreparedStatement代表预编译的SQL语句RefJava语言与SQL语言中的REF类型的映射ResultSet接收SQL语句并返回结果ResultSetMetaDat
5、a查询数据库返回的结果集的有关信息SQLDataJava语言与SAL语言中用户自定义类型的映射Statement执行SQL语句并返回结果StructJava语言与SQL语言中的structured类型的映射异常BatchUpdatedExceptions批处理的作业中至少有一条指令失败DataTruncation数据被意外截断SQLException数据存取中的错误信息SQLWarning数据存取中的警告 DriverManager类类 用来管理数据库中的所有驱动程序。它可以跟踪可用的驱动程序,注册、注销以及为数据库连接合适的驱动程序、设置登录时间限制等。方 法说 明static void d
6、eregisterDriver(Driver driver)注销指定的驱动程序static Connection getConnection(String url)连接指定的数据库static Connection getConnection(String url, String user, String password)以指定的用户名和密码连接指定数据库static Driver getDriver(String url)获取建立指定连接需要的驱动程序static Enumeration getDrivers()获取已装载的所有JDBC驱动程序static int getLoginTime
7、out()获取驱动程序等待的秒数static void println(String message)注册指定驱动程序static void setLoginTimeout(int seconds)设置驱动程序等待连接的最大时间限制 Connection接口 Connection接口用于应用程序和数据库的相连。Connection接口中提供了丰富的方法用于建立各种Statement对象、设置数据处理的各种参数等。 方 法说 明void close()关闭当前连接并释放资源void commit()提交对数据库所做的改动,释放当前连接特有的数据库的锁Statement createStateme
8、nt()创建Statement对象Statement createStatement(int resultSetType, int resultSetConcurrency)创建一个要生成特定类型和并发性结果集的Statement对象String getCatalog()获取Connection对象的当前目录boolean isClosed()判断连接是否关闭boolean isReadOnly()判断连接是否处于只读状态CallableStatement prepareCall(String sql)创建CallableStatement对象PreparedStatement prepare
9、Statement(String sql)创建PreparedStatemen对象void rollback()回滚当前事务中的所有改动,释放当前连接特有的数据库的锁void setReadOnly(boolean readOnly)设置连接为只读模式 Statement接口 Statement接口用于在已经建立连接的基础上向数据库发送SQL语句,Statement接口中包含了执行SQL语句和获取返回结果的方法。 Statement接口方 法说 明void addBatch(String sql)在Statement语句中增加SQL批处理语句void cancel()取消SQL语句指定的数据库
10、操作指令void clearBatch()清除Statement语句中的SQL批处理语句void close()关闭Statement语句指定的数据库连接boolean execute(String sql)执行SQL语句(用于执行返回多个结果集或者多个更新数据库的语句)int executeBatch()批处理执行多个SQL语句ResultSet executeQuery(String sql)执行SQL查询语句,并返回结果集int executeUpdate(String sql)执行INSERT、UPDATE或DELETE 语句以及SQL DDL(数据定义语言)语句,返回值说明执行该语句
11、所影响数据表中的行数Connection getConnection()获取对数据库的连接int getFetchSize()获取结果集的行数int getMaxFieldSize()获取结果集的最大字段数int getMaxRows()获取结果集的最大行数int getQueryTimeout()获取查询超时时间设置ResultSet getResultSet()获取结果集void setCursorName(String name)设置数据库游标的名称void setFetchSize(int rows)设置结果集的行数void setMaxFieldSize(int max)设置结果集的
12、最大字段数void setMaxRows(int max)设置结果集的最大行数void setQueryTimeout(int seconds)设置查询超时时间利用Statement接口可以实现数据库的插入、删除、修改和查询操作。/插入数据String insertsql= INSERT INTO student(xh,sname,ssex) VALUES(1,张三,女);/插入sqlst.execute(insertsql);/删除数据String deletesql= DELETE FROM student WHERExh= 1;/删除sqlint result=st.executeUpd
13、ate(deletesql); /如果result0则成功,否则失败。/修改数据String updatesql= UPDATE student SET sname=李四 WHERExh= 1 ;/修改sqlint result=st.executeUpdate(updatesql);/如果result0则成功,否则失败。/查询数据String selectsql= SELECT * FROM student ;/查询sqlResultSet rs =st.executeQuery(selectsql); ResultSet接口 ResultSet接口用来暂时存放数据库查询操作所获得的结果,用
14、来对结果集中的数据进行访问 方 法说 明boolean absolute(int row)将游标移动到结果集的某一行void afterLast()将游标移动到结果集的末尾void beforeFirst()将游标移动到结果集的头部void deleteRow()删除结果集中的当前行void insertRow()在结果集中插入一行void moveToInsertRow()移动游标到新插入的行void updateRow()更新修改记录boolean first()将游标移动到结果集的第一行XXX getXXX(int conlumnIndex)获取当前行某一列的值,返回值的类型为XXX v
15、oid updateXXX(int conlumnIndex,XXX x)更新当前行列号为conlumnIndex的值为x void updateXXX(int conlumnName,XXX x)更新当前行列名为conlumnName的值为x Statement getStatement()获取产生该结果集的Statement对象int getType()获取结果集的类型boolean inAfterLast()判断游标是否指向结果集的末尾boolean isBeforeFirst()判断游标是否指向结果集的头部boolean isFirst()判断游标是否指向结果集的第一行boolean
16、isLast()判断游标是否指向结果集的最后一行boolean last()将游标移动到结果集的最后一行boolean next()将游标移动到结果集的后面一行boolean previous()将游标移动到结果集的前面一行结果集从其使用的特点上可以分为四类,这四类结果集所具备的特点都是和Statement语句的创建有关,因为结果集是通过Statement语句执行后产生的,所以可以说,结果集具备何种特点,完全决定于Statement。 最基本的ResultSet之所以说是最基本的ResultSet,是因为这个ResultSet起到的作用就是完成查询结果的存储功能,而且只能读取一次,不能够来回的
17、滚动读取。这种结果集Statement创建方式如下: Statement st = conn.CreateStatement();ResultSet rs = Statement.excuteQuery(sqlStr);由于这种结果集不支持滚动的读取功能,所以如果获得这样一个结果集,只能使用它的next()方法逐个读取数据。 可滚动的ResultSet 这个类型支持在结果集中前后滚动、滚动到第一行、绝对滚动到指定行以及相对移动到指定行。这种结果集Statement创建方式如下:Statement st = conn.createStatement(intresultSetType, intre
18、sultSetConcurrency);ResultSet rs = st.executeQuery(sqlStr);其中:resultSetType是设置ResultSet对象是否可滚动的。当取值为ResultSet.TYPE_FORWARD_ONLY表示只能向前滚动,取值为ResultSet.TYPE_SCROLL_INSENSITIVE和ResultSet. TYPE_SCROLL_ SENSITIVE时表示能够实现任意的前后滚动、绝对和相对滚动,二者的区别在于对数据的最新修改是否敏感,即结果集中数据是否反映数据库中数据的实时更新。resultSetConcurency是设置Result
19、Set对象是否能够修改的。当取值为 ResultSet.CONCUR_READ_ ONLY表示为只读,取值为ResultSet.CONCUR_UPDATABLE表示为可修改。例如,如果希望得到的结果集是可滚动且只读的,只要把Statement如下赋值就行了。Statement st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ _ONLY);ResultSet rs = st.excuteQuery(sqlStr); 可更新的ResultSet这样的ResultSet对象可以完成对数
20、据库中数据的修改,但是ResultSet只是相当于数据库中的视图,所以并不是所有的ResultSet只要设置了可更新就能够完成数据更新的,要符合数据库中的数据更新条件。这种结果集Statement创建方式如下:Statement st = createstatement(Result.TYPE_SCROLL_INSENSITIVE,Result.CONCUR_UPDATABLE); 可保持的ResultSet正常情况下如果使用Statement执行完一个查询,又去执行另一个查询时,此时第一个查询的结果集就会被关闭,也就是说,所有的Statement的查询对应的结果集是一个,如果调用Connec
21、tion的commit()方法也会关闭结果集。可保持性就是指当ResultSet的结果被提交时,是被关闭还是不被关闭。JDBC2.0和1.0提供的都是提交后ResultSet就会被关闭。不过在JDBC3.0中可以设置ResultSet是否关闭。要完成这样的ResultSet的对象的创建,要使用的Statement的创建要具有三个参数,这种结果集Statement创建方式如下:Statement st=createStatement(int resultsetscrollable,int resultsetupdateable,int resultsetSetHoldability);Resul
22、tSet rs = st.excuteQuery(sqlStr);前两个参数的含义与前面相同,这里只介绍第三个参数。resultSetHoldability表示在结果集提交后结果集是否打开,当取值为ResultSet.HOLD_CURSORS_OVER_COMMIT表示修改提交时,不关闭ResultSet,取值为ResultSet.CLOSE_CURSORS_AT_COMMIT表示修改提交时ResultSet关闭。利用ResultSet接口可以实现数据库的插入、删除、修改和查询操作。查询操作同Statement接口。下面主要介绍更新操作。关键代码如下:Statement st = conn.C
23、reateStatement(ResultSet.TYPE_SCORLL_SENSITIVE,ResultSet.CONCUR_ UPDATABLE); String selectsql= SELECT * FROM student ;/查询sqlResultSet rs =st.executeQuery(selectsql);/插入数据rs.moveToInsertRow();/插入数据rs.updateString(xh,010103);rs.updateString(sname,王五);.rs.insertRow();/将插入数据保存到数据库rs.last();/移动光标到新增行/删除数
24、据rs.last();/移动光标到新增行rs.deleteRow();/修改数据rs.last();rs.updateString(xh,010103);rs.updateString(sname,王五);.rs.updateRow();/将修改数据保存到数据库rs.last();/移动光标到新增行 PreparedStatement接口在JDBC中有Statement、PreparedStatement和CallableStatement三种Statement对象。Statement对象用于执行不带参数的简单SQL语句,PreparedStatement继承了Statement,用于处理需要
25、被多次执行的SQL语句,可以带参数,CallableStatement继承了PreparedStatement,用于执行对数据库的存储过程的调用。实际应用中,PreparedStatement与Statement是有区别的。PreparedStatement不仅包含了SQL语句,而且大多数情况下这个语句已经被预编译过,因而当其执行时,只需DBMS运行SQL语句,而不必先编译,因此会大大降低运行时间,加快访问数据库的速度。作为 Statement 的子类, PreparedStatement 继承了 Statement 的所有方法,由于PreparedStatement接口执行带参数的sql语句
26、,因此使用setXXX (参数的序号,参数的值)方法来完成,其中 XXX 是与该参数相应的类型。利用PreparedStatement接口可以实现数据库的插入、删除、修改和查询操作。关键代码如下:/插入数据String insertsql= INSERT INTO student(xh,sname,ssex) VALUES(?,?,?);/插入sqlPreparedStatement pstmt=con.preparedStatement(insertsql);pstmt.setString(1, 010104);pstmt.setString(2, 朱克);pstmt.setString(3
27、, 男);pstmt.executeUpdate(); PreparedStatement接口/删除数据String deletesql= DELETE FROM student WHERExh=?;/删除sqlPreparedStatement pstmt=con.preparedStatement(deletesql);pstmt.setString(1, 010104);int result=pstmt.executeUpdate(); /如果result0则成功,否则失败。/修改数据String updatesql= UPDATE student SET sname=? WHERExh
28、=?;/修改sqlPreparedStatement pstmt=con.preparedStatement(updatesql);pstmt.setString(1, 朱克新);pstmt.setString(2, 010104);int result=pstmt.executeUpdate();/如果result0则成功,否则失败。/查询数据String selectsql= SELECT * FROM student WHERE xh=?;/查询sqlPreparedStatement pstmt=con.preparedStatement(selectsql);pstmt.setStr
29、ing(1, 010104);ResultSet rs =pstmt.executeQuery();11.1.2 JDBC访问数据库的一般步骤 调用Class.forName()方法加载驱动程序。 调用DriverManager对象的getConnection()方法,获得一个Connection对象。 创建一个Statement对象,准备一个SQL语句,这个SQL语句可以是Statement对象(立即执行的语句)、PreparedStatement语句(预编译的语句)或CallableStatement对象(存储过程调用的语句)。 调用executeQuery()等方法执行SQL语句,并将结
30、果保存在ResultSet对象;或者调用executeUpdate()等方法执行SQL语句,不返回ResultSet对象的结果。 对返回的ResultSet对象进行显示等相应的处理。 import java.sql.*;public class DatabaseDemo public static void main(String args) String strDBDriver=sun.jdbc.odbc.JdbcOdbcDriver; String strDBUrl=jdbc:odbc:user; Connection conn=null; Statement stmt=null; Res
31、ultSet rs=null;String ss; try Class.forName(strDBDriver);catch(java.lang.ClassNotFoundException e)System.out.println(classforname()创建失败!); tryconn=DriverManager.getConnection(strDBUrl,);/创建数据库连接对象/游标可以移动,且只读方式建立stmt=conn.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);s
32、s=insert into user(id,password) values(0000,0000);stmt.execute(ss);rs=stmt.executeQuery(select * from user);while(rs.next()System.out.println(rs.getString(1);System.out.println(rs.getString(2);ss=update user set password=000000 where id=0000;stmt.execute(ss);rs=stmt.executeQuery(select * from user);while(rs.next()System.out.println(rs.getString(1);System.out.println(rs.getString(2);ss=delete from user where id=0000;stmt.execute(ss);rs=stmt.executeQuery(select * from user);while(rs.next()System.out.println(rs.getString(1);System.out.println(rs.get
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 承包装修宾馆合同范本
- 广告生产制作合同范本
- 德云社的演出合同范本
- 工程代建代销合同范本
- 学校的食堂承包协议书
- 幼儿园灭四害合同范本
- 客户交接资料合同范本
- 中班音乐活动教案歌曲郊游(2025-2026学年)
- 五年级数学上册小数除法第四课时教案北京版
- 完整版窗教案教学设计三(2025-2026学年)
- 2025-2026学年人教版七年级上册道德与法治期末试卷(含答案和解析)
- 无锡公建工程质量检测有限公司2025年下半年公开招聘专业技术人员备考题库及答案详解一套
- 部编版(2024)小学语文三年级上册期末综合质量调研卷(含答案)
- 2026年高级会计师面试题及答案解析
- 湖南省邵阳市2025-2026学年高二历史上学期期末模拟卷(试卷及全解全析)
- 2026年青海省海东地区单招职业倾向性测试模拟测试卷附答案
- 八年级数学 期末总结
- (2025版)腹膜后肿瘤诊治专家共识课件
- 2025年中国农业大学 高级生物化学 知到智慧树期末考试题库及答案
- 房地产公司各岗位绩效考核指标表4资料
- 基因编辑真菌鉴定
评论
0/150
提交评论