JavaJdbc技术详解精要_第1页
JavaJdbc技术详解精要_第2页
JavaJdbc技术详解精要_第3页
JavaJdbc技术详解精要_第4页
JavaJdbc技术详解精要_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录o Jdbc技术概述o 通过JDBC技术n 与数据库建立连接n 了解数据库的信息n 查询数据库n 检索结果集n 更新数据库n 参数的输入和输出o JDBC是Java程序连接和存取数据库的应用程序接口(API),此接口是Java核心API的一部分。JDBC向应用程序开发者提供了独立于数据库的统一的API。JDBC是由一组驱动程序实现的Java接口,驱动程序负责从标准JDBC调用向支持的数据库所需要的具体调用转变。除了向开发者提供统一的独立于DBMS之外的框架,JDBC还提供了让开发者保持数据库厂家提供的特定功能的办法。JDBC概述o 将Java语言和Sql结合的一个很好的编程接口。o 通用的

2、一般的SQL数据库访问和存储结构。o 支持基本SQL功能的一个通用低层的应用程序编程接口,在不同的数据库功能模块上提供了一个统一的用户界面。o ODBC一样,建立在X/Open SQL CLI基础之上。o 是为Java语言定义的一个SQL调用级(CLI)界面。JDBC的特点o 在SQL水平上的API为Java语言定义的一个sql调用级界面,其中心在于执行 基本的SQL 声明和取回结果。在此基础上可以定义更高层次的o 与SQL的一致性oJDBC允许使用从属于DBMS的系统的任何查询语句,一个应用程序可以尽可能的使用SQL功能。o用户至少使用ANSI SQL 92 entry level标准o 可

3、在现有的数据库接口之上实现o比如可以在ODBC之上实现JDBC的特点o 提供与其他Java系统一致的java界面o 简单易行,最大可能简单化o 使用健壮、静态的通用数据类型。o 使一般情形简单化o 多种方法、多种功能 /装载驱动程序 Class.forName(sun.jdbc.odbc.JdbcOdbcDriver); /数据库的URL url = jdbc:odbc:contact; /获取数据库连接 conn = DriverManager.getConnection(url); /显示数据库的信息 showDBMD(conn); System.out.println(-); /创建SQ

4、L声明 stmt = conn.createStatement(); sql = select 公司编号,公司名称,地址,城市,邮政编码,国家 from 公司; /执行查询返回结果集 rs = stmt.executeQuery(sql); /显示结果集的信息 showRSMD(rs); System.out.println(-); System.out.println(公司编号,公司名称,地址,城市,邮政编码,国家); while (rs.next() System.out.print(rs.getString(1) + ); System.out.print(rs.getString(2)

5、 + ); System.out.print(rs.getString(3) + ); System.out.print(rs.getString(4) + ); System.out.print(rs.getString(5) + ); System.out.print(rs.getString(6) + ); System.out.println(); Jdbc的结构o Jdbc有两种接口,分别是面向开发人员的JDBC API和面向低层的JDBC Driver API,Java 应用程序JDBC APIJDBC ManagerJDBC Drvier APIJDBC-NetDriverJDB

6、C-ODBCBridge DriverODBC andDB DriverDriver ADriver BPulblishedprotocolProprietaryDatabase accessprotocol。JDBC的结构o JDBC API 是一系列的接口,他使得应用程序能够进行数据库联接,执行SQL语句,并且得到返回结果。JDBC 的结构o Java.sql.DriverManager用来装载驱动程序,并且为创建新的数据库联接提供支持。o Java.sql.Connection完成对某一指定数据库的联接o Java.sql.Statement在一个给定的连接中作为SQL执行声明的容器,他

7、包含了两个重要的子类型。nJava.sql.PreparedSatement用于执行预编译的sql声明nJava.sql.CallableStatement用于执行数据库中存储过程的调用o Java.sql.ResultSet对于给定声明取得结果的途径JDBC Driver interfaceo 是面向驱动程序开发商的接口,每一个驱动程序都必须提供对于n java.sql.Connection, java.sql.Statement, java.sql.PreparedStatement , java.sql .ResultSet等主要接口的实现方法。o Java.sql.DriverMana

8、ger需要装载驱动程序时,每个驱动程序需要提供一个能实现java.sql.Driver接口的类。例如:sun.jdbc.odbc.JdbcOdbcDrivercom.microsoft.jdbc.sqlserver.SQLServerDriver JDBC驱动程序的类型(重要)oJdbc-odbc桥oNative-api partly java driver 本地java驱动程序,将jdbc调用转换为对数据库客户端API的调用oNet-protocol all-java Driver(Jdbc proxy) 将jdbc调用转换为独立于特定数据库的网络协议,完全java驱动程序oNative-p

9、rotocol all-java driver 将JDBC 调用转换为特定数据库的网络协议,完全Java驱动程序数据库应用模型Jbbc各接口之间的关系事务 o事务由一个或多个这样的语句组成:这些语句已被执行、完成并被提交或还原。当调用方法 commit 或 rollback 时,当前事务即告就结束,另一个事务随即开始。o缺省情况下,新连接将处于自动提交模式。也就是说,当执行完语句后,将自动对那个语句调用 commit 方法。这种情况下,由于每个语句都是被单独提交的,因此一个事务只由一个语句组成。如果禁用自动提交模式,事务将要等到 commit 或 rollback 方法被显式调用时才结束,因此

10、它将包括上一次调用 commit 或 rollback 方法以来所有执行过的语句。对于第二种情况,事务中的所有语句将作为组来提交或还原。o方法 commit 使 SQL 语句对数据库所做的任何更改成为永久性的,它还将释放事务持有的全部锁。而方法 rollback 将弃去那些更改。o有时用户在另一个更改生效前不想让此更改生效。这可通过禁用自动提交并将两个更新组合在一个事务中来达到。如果两个更新都是成功的,则调用 commit 方法,从而使两个更新结果成为永久性的;如果其中之一或两个更新都失败了,则调用 rollback 方法,以将值恢复为进行更新之前的值。o大多数 JDBC 驱动程序都支持事务。

11、事实上,符合 JDBC 的驱动程序必须支持事务。DatabaseMetaData 给出的信息描述 DBMS 所提供的事务支持水平。事务隔离级别 o如果 DBMS 支持事务处理,它必须有某种途径来管理两个事务同时对一个数据库进行操作时可能发生的冲突。用户可指定事务隔离级别,以指明 DBMS 应该花多大精力来解决潜在冲突。例如,当事务更改了某个值而第二个事务却在该更改被提交或还原前读取该值时该怎么办? 假设第一个事务被还原后,第二个事务所读取的更改值将是无效的,那么是否可允许这种冲突? JDBC 用户可用以下代码来指示 DBMS 允许在值被提交前读取该值(“dirty 读取”),其中 con 是当

12、前连接: con.setTransactionIsolation( TRANSACTION_READ_UNCOMMITTED);o 事务隔离级别越高,为避免冲突所花的精力也就越多。Connection 接口定义了五级,其中最低级别指定了根本就不支持事务,而最高级别则指定当事务在对某个数据库进行操作时,任何其它事务不得对那个事务正在读取的数据进行任何更改。通常,隔离级别越高,应用程序执行的速度也就越慢(由于用于锁定的资源耗费增加了,而用户间的并发操作减少了)。在决定采用什么隔离级别时,开发人员必须在性能需求和数据一致性需求之间进行权衡。当然,实际所能支持的级别取决于所涉及的 DBMS 的功能。o

13、 当创建 Connection 对象时,其事务隔离级别取决于驱动程序,但通常是所涉及的数据库的缺省值。用户可通过调用 setIsolationLevel 方法来更改事务隔离级别。新的级别将在该连接过程的剩余时间内生效。要想只改变一个事务的事务隔离级别,必须在该事务开始前进行设置,并在该事务结束后进行复位。我们不提倡在事务的中途对事务隔离级别进行更改,因为这将立即触发 commit 方法的调用,使在此之前所作的任何更改变成永久性的。通过JDBC访问数据库o建立连接n 所有Jdbc程序的第一步都是与数据库建立连接,用户得到一个java.sql.Connection的对象n 加载驱动程序,o通过设置

14、Java属性中的sql.driver来制定驱动程序列表。这个属性是一系列的用冒号隔开的Driver类的名称,按照顺序搜索驱动程序,使用第一个能成功和给定URL相连的驱动程序。o使用Class.forName()显式加载驱动程序。例如 Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);加载了sun公司提供的jdbcodbc桥驱动程序,由驱动程序负责向DriverManager登记,在数据库连接时,DriverManager将试图使用此驱动程序。Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDri

15、ver”); 加载SqlServer的驱动程序与数据库的连接o 建立连接n 指定数据库连接的url,数据源的位置n 使用DriverManager.getConnection(url);例如:String url“jdbc:odbc:datasource”;或者:“jdbc:microsoft:sqlserver:/server_name:1433” Connection conn=DriverManager.getConnection(url);或者:Connection conn=DriverManager.getConnection(String url , String user ,

16、String password)了解数据库中的信息o 在和数据库建立连接后,就可以获得有关数据源的各种信息:表,列,数据类型,存储过程等。这些信息通过DatabaseMetaData类的对象上实现的。o DatabaseMetaData dbma=conn.getMetaData();o 其中提供了很多方法获取数据源的各个方面的信息,这些方法中,有一些用字符串匹配搜索模式作为参数,“_”匹配单个字符,“”匹配0个或多个字符.一个值为null的Java String 可以与任何字符串匹配.o 对某些方法,有些驱动程序可能不支持,会产生一个SQLException意外.了解数据库中的信息o 基本信

17、息n getURL();n getUserName()n isReadOnly()n getDatabaseProduceName()j;n getDriverName();n getDriverVersion();o 其他n getTables(),getColumns(),getIndexInfo();查询数据库 (Statement)o创建Statementn 用户执行sql语句,n Statement stmt=conn.createStatement();o执行查询语句n String sql=“select * from customer”n ResultSet rs=stmt.e

18、xecuteQuery(sql);n executeQuery()一般用于执行一个sql语句,返回一个结果集,execute()方法返回多个结果集,n 一个Statement对象在同一时间只能打开一个结果集,对第二个结果集的打开隐含着对第一个结果集的关闭.o关闭Statement . stmt.close()Insert简单的例子:Connection con = DriverManager.getConnection(conURL);/ 使用SQL命令insert插入三条顾客纪录到表中Statement s = con.createStatement();String r1 = insert

19、 into consumer values(00001,王明,360);String r2 = insert into consumer values(00002,高强,728);String r3 = insert into consumer values(00003,李丽,1182);s.executeUpdate(r1);s.executeUpdate(r2);s.executeUpdate(r3);s.close();con.close();查询数据库 (PreparedStatement)o Statement对象在每次执行sql语句时都将语句传给数据库,在多次执行同一个语句时,效率

20、比较低.o 可以使用PreparedStatement,使用数据库的预编译功能,速度可以提高很多.o PreparedStatement对象的sql语句可以接受参数,每次执行时可以传递不同的参数.o但使用prepared语句,在进行数据库调用之前,应用程序就会将该语句送到数据库,数据库对其进行解释,并创建一个查询计划。所谓查询计划,就是数据库执行相关查询的一个蓝图,每当有SQL语句被送到数据库时,就会建立一个相应的查询计划,并按照这个计划来执行查询操作。采用prepared语句的形式来发送SQL语句,将容许数据库对相应的语句仅建立一次查询计划。JDBC提供了PreparedStatement类

21、来处理prepared SQL语句。oPreparedStatement类是Statement类的子类。与Statement相比PreparedStatement增加了在执行SQL调用之前,将输入参数绑定到SQL调用中的功能。所谓绑定参数,是指它容许将相关参数转换为Java数据类型。当需要在同一个数据库表中完成一组记录的更新时,使用PreparedStatement类是一个很好的选择。比如:如果需要一次更新多条顾客的购物金额记录时 查询数据库 (PreparedStatement)o 创建n String sql=“select * from customer where age=?”n Pr

22、eparedStatement pstmt=conn.prepareStatement(sql);o 执行n pstmt.setInt(1,30);n ResultSet=pstmt.executeQuery();o 关闭n Pstmt.close();例如:/原来的做法:Statement stm=con.createStatement();int i;/consumer为一个对象数组for(i=0;iconsumer.length;i+) stm.executeUpdate( “update consumer”+”set totalmoney=” +consumeri.getMoney()

23、+”where id=”+consumeri.getID();mit();stm.close();con.close();o采用预编译PreparedStatement pstm=con.prepareStatement(“update consumer set totalmoney=? Where id=?”); int i;/consumer作为一个对象数组for(i=0;iconsumer.length;i+) pstm.setString(1,consumeri.getMongy(); pstm.setString(2,consumeri.getID(); pstm.execute()

24、;mit();pstm.close();con.close();查询数据库 (CallableStatement)o用于执行存储过程o创建,Connection的对象又一个方法prepareCall()可以创建一个CallableStatement对象,参数格式是”call procedureName”,其中procedureName是存储过程的名称.比如存储过程的名称叫Qurey1,CallableStatement cstmt=conn.prepareCall(“call Query1()”);o执行 ResultSet rs=cstmt.executeQuery();o关闭 cstmt.

25、close();检索结果集o 前面讲了如何执行sql语句,返回了ResultSet类的对象,这里讲如何对ResultSet对象进行处理o ResultSet的基本处理方法nResultSet对象包括一个由查询语句返回的一个表,这个表中包含所有的查询结果,按照行和列进行处理.nResultSet对象维持一个指向当前行的指针.最初,这个指针指向第一行之前.ResultSet类的next()方法使这个指针移向下一行.第一次,使用next()方法,将指针指向结果集的第一行.next方法的返回值是一个boolean值,若为true,则成功移向下一行.若返回false则没有下一行.ngetXXX方法可以从

26、某一列中获得结果.其中XXX是jdbc中的java数据类型.如getInt();需要制定检索的列,或名称.检索结果集Statement stmt=conn.createStatement();String sql=“select a,b,c from mytable”;ResultSet rs=stmt.executeQuery(sql);While (rs.next()int i=rs.getInt(1); String s=rs.getString(“a”);byte b=rs.getBytes(3);数据转换o ResultSet结果集中Sql类型和java数据类型之间的转换o 比如结果

27、集中,某一列的数据是varchar(30),就可以使用 getString(参数)方法获取值,o 比如在SQL Server数据库中,数据类型bit有两个值1,0,在结果集中,可以用getBoolean(参数)获取.o 参照表15-1数据类型转换表java类型SQL类型booleanBITbyteTINYINTshortSMALLINTintINTEGERlongBIGINTStringCHAR,VARCHAR,LONGVARCHARbyte arrayBINARY , VAR BINARYjava.sql.DateDATEjava.sql.TimeTIMEjava.sql.Timestamp

28、TIMESTAMP读取较长的值o 如何读取longvarchar,longvarbinary的值o getString, getByteso 有长度限制,Statement中的setMaxFieldSize设置.o ResultSet的对象可以从数据上返回java.io.InputStream.o 获得流后应立即读取,执行next方法后,流将关闭.o 获取的方法有getBinaryStream,getAsciiStream,getUnicodeStream, getCharacterStream 例子Statement stmt=conn.createStatement();String sq

29、l=“select x from mytable”ResultSet rs=stmt.executeQuery();Byte buff=new byte4096;While(r.next()InputStream is=rs.getAssicStream();for(;)int size=is.read(buff);if(size=0) break;获取结果集的信息ResultsetMetaDatao 可以获取结果集中 的列的名称,数据类型等.o ResultsetMetaData rsmd=rs.getMetaData();o getColumnCount();o getColumnName

30、(int column);o getColumnType(int column); 返回int值o getColumnTypeName(int column); 返回字符串o isReadOnly(int column)o isNullable(int column)更新数据库o 包括修改,更新和删除记录,创建和删除表,以及增加和删除列.对应于数据库的insert,update ,delete,create,drop等.o 对数据库的更新操作也是通过Statement对象完成的.o 不使用executeQuery()方法,使用executeUpdate()方法.o executeUpdate的

31、返回值是它影响的记录的行数.更新数据库o 例如o String sql=“update Customer set address =Peking where lastname=Li”o int i=Stmt.executeUpdate(sql)o 返回更新的行数.参数的输入和输出o Jdbc允许在要执行的sql语句中设置参数,用?代表参数o 需要使用PreparedStatement,CallableStatement.o 用setXXX()方法给参数赋值.XXX是jdbc数据类型,第一个参数是位置是1,第二个参数的位置是2o CallableStatement可以设置输出参数o 例子预编译的

32、例子: conn = DriverManager.getConnection(url); /带参数的sql语句 sql = insert into 公司(公司名称,地址,城市,邮政编码,国家)values(?,?,?,?,?); /使用PreparedStatement,可以接收输入参数 pstmt = conn.prepareStatement(sql); /根据参数的位置,设置参数的值 pstmt.setString(1, company); pstmt.setString(2, address); pstmt.setString(3, city); pstmt.setString(4,

33、postcode); pstmt.setString(5, state); /执行插入操作 count = pstmt.executeUpdate(); System.out.println(插入的记录数: + count);删除的例子: int count = 0; String where = where 公司编号=1; try /装载驱动程序 Class.forName(sun.jdbc.odbc.JdbcOdbcDriver); /数据库的URL url = jdbc:odbc:contact; /获取数据库连接 conn = DriverManager.getConnection(url); /创建SQL声明

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论