版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第07章JDBC数据库访问第一页,共55页。本章内容7.1JDBC技术概述7.2传统的数据库连接方法7.3JDBCAPI介绍第二页,共55页。7.1JDBC技术概述JDBCJava程序访问数据库的标准,由Java编写的类和接口组成,称为JDBCAPI,为Java程序提供通用的数据访问接口。JDBC的基本功能:建立与数据库的连接发送SQL语句处理数据库操作结果第三页,共55页。7.1.1数据库访问的两层和三层模型图7-1表示两层模型,也称作为客户机-数据库服务器结构,即C/S结构。Java应用程序通过JDBCAPI直接和数据源交互。用户的SQL命令被传送给数据库或其他数据源,SQL语句的执行结果返回给用户。第四页,共55页。7.1.1数据库访问的两层和三层模型图7-2表示三层模型,也称作为客户机-应用服务器-数据库服务器结构,即B/S结构。客户机通过Java小程序或浏览器发出SQL请求,该请求首先传送到应用服务器。应用服务器再通过JDBC与数据库服务器进行连接,由数据库服务器处理SQL语句,然后将结果返回给应用服务器。第五页,共55页。7.1.2JDBC驱动程序Java应用程序访问数据库如图7-3所示。通过JDBC驱动程序管理器加载相应的驱动程序,通过驱动程序与具体的数据库连接,访问数据库。第六页,共55页。7.1.2JDBC驱动程序数据库驱动程序完成从JDBC请求到数据库系统方法调用转换工作的程序。在Java程序中,可以使用的数据库驱动程序主要有4种类型,常用的有下面两种:JDBC-ODBC桥驱动程序。专为某种数据库而编写的驱动程序。第七页,共55页。1.
JDBC-ODBC桥驱动程序ODBC(OpenDataBaseConnectivity)开放数据库连接,是Windows系统与各种数据库进行通信的软件。通过该桥驱动程序与ODBC驱动程序进行通信,就可与各种数据库系统进行通信。但是,不推荐使用这种方法与数据库连接,只适用于不能获得数据库专用的JDBC驱动程序、或在开发阶段使用这种方法。第八页,共55页。2.专为某种数据库而编写的驱动程序由于ODBC具有一定的缺陷,数据库厂商专门开发针对JDBC的驱动程序,这类驱动程序大多是用纯Java语言编写的,推荐使用数据库厂商专门为JDBC开发的驱动程序。使用专用驱动程序连接数据库,必须安装驱动程序。不同的数据库系统提供了不同的JDBC驱动程序,可以到相关网站下载。第九页,共55页。7.1.3安装JDBC驱动程序如果使用PostgreSQL数据库,可以到/下载,下载后是一个打包文件(如postgresql-9.2-1000.jdbc4.jar)。在开发Web应用程序中,需要将驱动程序打包文件复制到Tomcat安装目录的lib目录中、或Web应用程序的WEB-INF\lib目录中。第十页,共55页。7.2传统的数据库连接方法JDBCAPI在java.sql包和javax.sql包中定义,其中包括JDBCAPI用到的所有类和接口。主要的类和接口:
Driver接口DriverManager类Connection接口Statement接口PreparedStatement接口ResultSet接口CallableStatement接口SQLException类第十一页,共55页。7.2.1加载驱动程序访问数据库,首先要加载驱动程序。驱动程序是实现Driver接口的类,一般由数据库厂商提供。加载JDBC驱动程序,使用Class类的forName()静态方法:publicstaticClass<?>forName(StringclassName)throwsClassNotFoundException
参数className:完整的驱动程序类的名称。如果找不到驱动程序将抛出ClassNotFoundException异常。返回一个Class类的对象。第十二页,共55页。对于不同的数据库,驱动程序的类名是不同的。如果使用JDBC-ODBC桥驱动程序连接数据库,则使用JDK自带的驱动程序,名称为“sun.jdbc.odbc.JdbcOdbcDriver”。要加载该驱动程序,可使用下面的语句:Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");7.2.1加载驱动程序第十三页,共55页。如果要加载数据库厂商提供的专门的驱动程序,应该给出专门的驱动程序名。要加载PostgreSQL数据库驱动程序:Class.forName(“org.postgresql.Driver”);PostgreSQL的驱动程序类名为org.postgresql.Driver。7.2.1加载驱动程序第十四页,共55页。7.2.2建立连接对象驱动程序加载成功后,使用DriverManager类的getConnection()建立数据库连接对象。DriverManager类维护一个注册的Driver类的列表。调用DriverManager类的静态方法getConnection():publicstaticConnectiongetConnection(Stringdburl)publicstaticConnectiongetConnection(Stringdburl,
Stringuser,Stringpassword)
第十五页,共55页。JDBCURLJDBCURL与一般的URL不同,用来标识数据源,驱动程序就可以与它建立一个连接。JDBCURL的标准语法,包括三个部分,中间用冒号分隔。jdbc:<subprotocol>:<subname>jdbc表示协议,JDBCURL的协议总是jdbc。subprotocol表示子协议。subname为子名称,表示数据库标识符,该部分内容随数据库驱动程序的不同而不同。第十六页,共55页。如果通过JDBC-ODBC桥驱动程序连接数据库,URL的形式为:jdbc:odbc:DataSource三个部分组成一个整体字符串就是JDBCURL。Stringdburl=“jdbc:odbc:sampleDS";如果使用数据库厂商提供的专门的驱动程序连接数据库。要连接PostgreSQL数据库,JDBCURL为:jdbc:postgresql://localhost:5432/dbname其中:localhost表示主机名或IP地址,5432为数据库服务器的端口号,dbname为数据库名。JDBCURL第十七页,共55页。下面代码说明了如何以paipaistore用户连接到PostgreSQL数据库。数据库名为paipaistore、用户名为paipaistore、口令为paipaistore:JDBCURLStringdburl=“jdbc:postgresql://localhost:5432/paipaistore”;Connectionconn=DriverManager.getConnection(dburl,"paipaistore","paipaistore");第十八页,共55页。常用的数据库JDBC连接代码
第十九页,共55页。7.2.3创建语句对象通过Connection对象创建语句对象。对于不同的语句对象,可以使用Connection接口的不同方法创建。创建一个简单的Statement对象,应该使用createStatement(),创建PreparedStatement对象,应该使用prepareStatement(),创建CallableStatement对象,应该使用prepareCall()。下面的代码将创建一个简单的Statement对象。Statementstmt=conn.createStatement();第二十页,共55页。7.2.4获得SQL语句的执行结果执行SQL语句使用Statement对象的方法。对于查询语句,调用executeQuery(Stringsql)返回ResultSet。ResultSet对象保存查询的结果集,再调用ResultSet的成员方法,可以对查询结果的每行进行处理。Stringsql="SELECT*FROMproducts";ResultSetrst=stmt.executeQuery(sql);while(rst.next()){out.print(rst.getString(1)+“\t”);}第二十一页,共55页。7.2.4获得SQL语句的执行结果对于DDL语句,如CREATE、ALTER、DROP对于DML语句,如INSERT、UPDATE、DELETE使用语句对象的成员方法:executeUpdate(Stringsql)该方法返回值为整数,用来指示被影响的行数。第二十二页,共55页。7.2.5关闭建立的对象在Connection接口、Statement接口和ResultSet接口中都定义close(
)当这些对象使用完毕后,应使用close()关闭。第二十三页,共55页。7.3JDBCAPI介绍JDBCAPI是Java语言的标准API,目前的最新版本是JDBC4.0。在JDK7.0中,通过两个包提供:java.sql包javax.sql包第二十四页,共55页。java.sql包提供基本的数据库编程的类和接口,如驱动程序管理类DriverManager、创建数据库连接Connection接口、执行SQL语句以及处理查询结果的类和接口等。javax.sql包提供服务器端访问和处理数据源的类和接口,如DataSource、RowSet、RowSetMetaData、PooledConnection接口等,实现数据源管理、行集管理以及连接池管理等。7.3JDBCAPI介绍第二十五页,共55页。7.3.1Connection接口获取connection对象的方法:调用DriverManager类的静态方法getConnection()数据源(DataSource)对象的getConnection()得到连接对象后,调用createStatement()创建SQL语句(Statement)对象,以及在连接对象上完成各种操作。第二十六页,共55页。publicStatementcreateStatement()创建一个Statement对象。如果用于查询,调用executeQuery()返回的ResultSet是一个不可滚动、不可更新的ResultSet。7.3.1Connection接口第二十七页,共55页。publicStatementcreateStatement(intresultType,intconcurrency)创建一个Statement对象。如果用于查询,两个参数决定executeQuery()返回的ResultSet是否是一个可滚动、可更新的ResultSet。7.3.1Connection接口第二十八页,共55页。publicStatementcreateStatement(intresultType,intconcurrency,intholdability)创建一个Statement对象。如果用于查询,那么前两个参数决定executeQuery()返回的ResultSet是否是一个可滚动、可更新的ResultSet,第三个参数决定可保持性(holdability)。7.3.1Connection接口第二十九页,共55页。7.3.2Statement接口一旦创建Statement对象,用于向数据库发送SQL语句,实现对数据库的查询和更新操作等。执行查询操作语句执行非查询操作语句释放statement第三十页,共55页。1.执行查询语句使用Statement接口的下列方法向数据库发送SQL查询语句。publicResultSetexecuteQuery(Stringsql)用来执行SQL查询语句。参数sql用字符串表示的SQL查询语句。查询结果以ResultSet对象返回,一般称为结果集对象。在ResultSet对象上可以逐行逐列地读取数据。第三十一页,共55页。2.执行非查询语句使用Statement接口的下列方法向数据库发送非SQL查询语句。publicintexecuteUpdate(Stringsql)执行由字符串sql指定的SQL语句可是INSERT、DELETE、UPDATE语句可是无返回值的SQL语句,如SQLDDL语句CREATETABLE。返回值是更新的行数,如果语句没有返回,则返回值为0。第三十二页,共55页。2.执行非查询语句publicbooleanexecute(Stringsql)执行可能有多个结果集的SQL语句,sql为任何SQL语句。如果语句执行的第一个结果为ResultSet对象,该方法返回true,否则返回false。publicint[]executeBatch()用于在一个操作中发送多条SQL语句。第三十三页,共55页。
与Connection对象一样,Statement对象使用完毕应该用close()释放其占用的资源。注意:并不是在执行了一条SQL语句后就立即释放这个Statement对象,可以用同一个Statement对象执行多个SQL语句。3.释放Statement第三十四页,共55页。7.3.3ResultSet接口ResultSet对象表示SELECT语句查询得到的记录集合,结果集一般是一个记录表,包含多个记录行、列标题。注意:记录行从1开始,一个Statement对象一个时刻只能打开一个ResultSet对象。如果需要对结果集的每行进行处理,需要移动结果集的游标(结果集的一个标志或指针)。对新产生的ResultSet对象,游标指向第一行的前面,可以调用ResultSet的next(),使游标定位到下一条记录。第三十五页,共55页。publicbooleannext()throwsSQLException将游标从当前位置向下移动一行。注意:第一次调用next(),将使第一行成为当前行,以后调用游标依次向后移动。如果该方法返回true,说明新行是有效的行,若返回false,说明已无记录。7.3.3ResultSet接口第三十六页,共55页。1.检索字段值ResultSet接口提供检索行字段值的方法,根据结果集列的数据类型不同,使用不同的getXxx()获得列值。例如若列值为字符型数据,可以使用下列方法检索列值:StringgetString(intcolumnIndex)
StringgetString(StringcolumnName)
第三十七页,共55页。返回结果集中,当前行指定的列号或列名的列值,结果作为字符串返回。columnIndex
为列在结果行中的序号,序号从1开始。columnName为结果行中的列名。1.检索字段值第三十八页,共55页。publicbooleangetBoolean(intcolumnIndex)返回指定列的boolean值。publicDategetDate(intcolumnIndex)返回指定列的Date对象值。publicObjectgetObject(intcolumnIndex)返回指定列的Object对象值。publicBlobgetBlob(intcolumnIndex)返回指定列的Blob对象值。publicClobgetClob(intcolumnIndex)返回指定列的Clob对象值。1.检索字段值第三十九页,共55页。2.数据类型转换在ResultSet对象中,数据为从数据库中查询出的数据。调用ResultSet对象的getXxx()方法返回的是Java语言的数据类型。实际上,调用getXxx()方法,就是把SQL数据类型转换为Java语言数据类型。数据类型转换的问题第四十页,共55页。2.数据类型转换第四十一页,共55页。7.3.4可滚动与可更新的ResultSet可滚动的ResultSet在结果集对象上,可以前后移动指针访问结果集中的记录。可更新的ResultSet不但可以访问结果集中的记录,还可通过结果集对象更新数据库。第四十二页,共55页。1.可滚动的ResultSet要使用可滚动的ResultSet对象,必须使用Connection对象的带参数的createStatement()创建Statement。publicStatementcreateStatement(intresultType,intconcurrency)如果Statement对象用于查询,两个参数决定executeQuery()返回的ResultSet是否是一个可滚动、可更新的ResultSet。第四十三页,共55页。参数resultType的取值应为ResultSet接口中定义的常量。使用TYPE_SCROLL_SENSITIVE常量创建可滚动的ResultSet,当数据库发生改变时,这些变化对结果集可见。使用TYPE_SCROLL_INSENSITIVE常量创建可滚动的ResultSet,当数据库发生改变时,这些变化对结果集不可见。使用TYPE_FORWARD_ONLY常量创建不可滚动的结果集。1.可滚动的ResultSet第四十四页,共55页。对于可滚动的结果集,ResultSet接口提供了下面的移动结果集游标的方法。publicbooleanprevious()throwsSQLException游标向前移动一行,如果存在合法的行返回true,否则返回false。publicbooleanfirst()throwsSQLException移动游标使其指向第一行。publicbooleanlast()throwsSQLException移动游标使其指向最后一行。publicbooleanabsolute(introws)throwsSQLException移动游标使其指向指定的行。1.可滚动的ResultSet第四十五页,共55页。publicbooleanrelative(introws)throwsSQLException以当前行为基准相对移动游标的指针,rows为向后或向前移动的行数。rows若为正值是向前移动,若为负值是向后移动。publicbooleanisFirst()throwsSQLException返回游标是否指向第一行。publicbooleanisLast()throwsSQLException返回游标是否指向最后一行。publicintgetRow()返回游标所在当前行的行号。1.可滚动的ResultSet第四十六页,共55页。2.可更新的ResultSet在JDBC2.0之前,ResultSet对象只可用于查询数据、向前移动游标、读取每列数据值。为了更新数据,需要通过Statement对象执行另外的SQL语句。JDBC2.0提供了直接通过ResultSet对象更新数据库表中数据的能力。要实现该功能,应该创建一个可更新的ResultSet对象。第四十七页,共55页。使用Connection的createStatement(intresultType,intconcurrency)创建Statement对象时,指定第二个参数的值决定是否创建可更新的结果集。该参数使用ResultSet接口中定义的常量:ResultSet.CONCUR_READ_ONLY创建一个只。读的ResultSet对象,不能更新表。ResultSet.CONCUR_UPDATABLE创建一个可更新的ResultSet对象。2.可更新的ResultSet第四十八页,共55页。得到可更新的ResultSet对象后,调用适当的updateXxx()更新指定的列值。对于每种数据类型,ResultSet都定义了相应的updateXxx():publicvoidupdateInt(intcolumnIndex,intx)用指定的整数x的值更新当前行指定的列的值,其中columnIndex为列的序号。publicvoidupdateInt(StringcolumnName,intx)用指定的整数x的值更新当前行指定的列的值,其中columnName为列名2.可更新的ResultSet第四十九页,共55页。publicvoidupdateString(intcolumnIndex,Stringx)用指定的字符串x的值更新当前行指定的列的值,其中columnIndex为列的序号。publicvoidupdateString(StringcolumnName,Stringx)用指定的字符串x的值更新当前行指定的列的值,其中columnName为列名。2.可更新的ResultSet第五十页,共55页。通过可更新的ResultSet对象,实现对表的插入、删除、修改。voidmoveToInsertRow()throwsSQLException将游标
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 增味剂相关项目投资计划书范本
- 油气输送安全排查整治方案
- 第一学期大一班班务工作方案
- 某五星级酒店电气施工资源供应计划
- 《填埋场固化污泥衬垫防渗层的宏观力学特性及其微观机理》
- 《基于基层损坏评价的预防性补强方法研究》
- 《女生日记》读书心得10篇
- 2024至2030年中国亲嘴杯行业投资前景及策略咨询研究报告
- 会计辞职报告范文简短10篇
- 水塔水位plc课课程设计
- 子宫动脉栓塞手术
- 2024年世界职业院校技能大赛中职组“节水系统安装与维护组”赛项考试题库(含答案)
- 纸袋制造机产业深度调研及未来发展现状趋势
- 2024年职业病危害防治培训试题
- 维修作业区修理工上岗试卷+答案
- 译林新版(2024)七年级英语上册Unit 5 Welcome to the unit课件
- 报考中级会计的从事会计工作年限证明模板
- 东方电影学习通超星期末考试答案章节答案2024年
- 2024年-2025年公路养护工理论知识考试题及答案
- 数控类论文开题报告
- 2024秋期国家开放大学《可编程控制器应用实训》一平台在线形考(形成任务7)试题及答案
评论
0/150
提交评论