Java程序设计-15-访问数据库课件_第1页
Java程序设计-15-访问数据库课件_第2页
Java程序设计-15-访问数据库课件_第3页
Java程序设计-15-访问数据库课件_第4页
Java程序设计-15-访问数据库课件_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

1、Java程序设计-15-访问数据库JavaJava程序设计程序设计第第1515章章 访问数据库访问数据库Java程序设计-15-访问数据库学习目标学习目标了解了解JDBCJDBC发展历史发展历史能够用不同的方式建立到数据库的连接能够用不同的方式建立到数据库的连接利用利用StatementStatement访问数据访问数据能够在对象和数据库的记录之间进行转换,了解能够在对象和数据库的记录之间进行转换,了解ORMORM技术技术掌握批量更新掌握批量更新能够调用存储过程能够调用存储过程了解连接池技术了解连接池技术Java程序设计-15-访问数据库15.1.1什么是JDBCJDBC(Java Datab

2、ase Connectivity)JDBC(Java Database Connectivity)u一种用于执行一种用于执行SQL SQL 语句语句, ,和数据库进行交互的技和数据库进行交互的技术,它由一组用术,它由一组用 Java Java 编程语言编写的类和接口编程语言编写的类和接口组成。组成。Java程序设计-15-访问数据库JDBCJDBC的历史的历史u JDBC1.X API规范遵循的是SQL2/SQL92标准,对它的支持的类都定义在java.sql包中。u JDBC2.0规范发布时,增加了对SQL3的支持,并且重点扩展了在应用服务器端访问数据库的功能,相关扩展的类包含在javax.

3、sql中。u 目前JDBC已经发布了4.0的版本,其重要的变化集中在丰富的数据类型、元数据的支持、支持标注和应用服务器端编程的特性如数据源、连接池、分布式的事务等。Java程序设计-15-访问数据库15.1.2 JDBC 15.1.2 JDBC 驱动程序类型驱动程序类型u JDBC-ODBC JDBC-ODBC 桥加桥加 ODBC ODBC 驱动程序驱动程序u 必须提供必须提供ODBCODBC驱动程序驱动程序 u 本地本地 API - API - 部分用部分用 Java Java 来编写的驱动程序来编写的驱动程序 u 一种用一种用JavaJava实现的,替代实现的,替代JDBC-ODBC JD

4、BC-ODBC 桥产品的驱动程序桥产品的驱动程序u JDBC JDBC 网络纯网络纯 Java Java 驱动程序驱动程序u 一种和具体数据库无关的驱动程序。一种和具体数据库无关的驱动程序。 u 本地协议纯本地协议纯 Java Java 驱动程序驱动程序 u 一种支持将一种支持将JDBCJDBC调用直接转换为某个具体调用直接转换为某个具体DBMSDBMS的驱动程的驱动程序,通常由数据库厂家提供,实践中常用序,通常由数据库厂家提供,实践中常用Java程序设计-15-访问数据库15.215.2基本的数据库存取过程基本的数据库存取过程实现简单的数据库存取操作是一件很轻松的事实现简单的数据库存取操作是

5、一件很轻松的事情。实现基本的数据存取操作包括三个步骤:情。实现基本的数据存取操作包括三个步骤:u 连接到数据库连接到数据库u 存取数据存取数据u 关闭连接。关闭连接。Java程序设计-15-访问数据库连接到数据库连接到数据库u 连接到数据库需要由驱动程序的支持,在保证连接到数据库需要由驱动程序的支持,在保证已经将驱动程序文件复制到可被运行环境搜索已经将驱动程序文件复制到可被运行环境搜索到的位置后,开发对数据库进行存取操作的第到的位置后,开发对数据库进行存取操作的第一步是建立到指定数据库的连接,这一过程可一步是建立到指定数据库的连接,这一过程可以细分为两个操作:以细分为两个操作:u加载指定的驱动

6、程序(可选)加载指定的驱动程序(可选)u获得到指定数据库的连接获得到指定数据库的连接public class SqlServerDemo public static void main(String args) String url =jdbc:sqlserver:/localhost:1433;databaseName=bank; user=sa;password=123456;Connection con = null;try con = DriverManager.getConnection(url);/获得到数据库的连接获得到数据库的连接 /获得连接数据库的元数据对象获得连接数据库的元

7、数据对象metaData DatabaseMetaData metaData = con.getMetaData(); /输出连接数据库的产品名称输出连接数据库的产品名称 System.out.println(metaData.getDatabaseProductName(); /输出连接数据库的产品版本号输出连接数据库的产品版本号 System.out.println(metaData.getDatabaseProductVersion(); con.close();/关闭到数据库的连接,释放资源关闭到数据库的连接,释放资源 catch (SQLException e) e.printSta

8、ckTrace(); Java程序设计-15-访问数据库1. 1. 加载驱动程序加载驱动程序( (可选可选) )u检查数据库厂商提供的检查数据库厂商提供的JDBCJDBC驱动程序,可以在对驱动程序,可以在对应的位置发现其提供的驱动程序类。通过调用方应的位置发现其提供的驱动程序类。通过调用方法法 Class.forName()Class.forName(),将显式地加载驱动程序类,将显式地加载驱动程序类。加载加载SQLServer驱动程序类驱动程序类Class.forName(com.microsoft.sqlserver.jdbc.SQLServerDriver);加载加载Oracle驱动程序

9、类驱动程序类Class.forName(oracle.thin.Driver );Class.forName(oracle.jdbc.driver.OracleDriver);加载加载MySQL驱动程序类驱动程序类Class.forName(org.gjt.mm.mysql.Driver ); Java程序设计-15-访问数据库2 2 建立连接建立连接u 加载加载 Driver Driver 类之后,应用程序还需显式的获得到数类之后,应用程序还需显式的获得到数据库的一个连接。当调用据库的一个连接。当调用 DriverManager.getConnection()DriverManager.ge

10、tConnection() 方法发出连接请求方法发出连接请求时,时,DriverManager DriverManager 将检查每个驱动程序,查看它是将检查每个驱动程序,查看它是否可以建立连接。该方法的返回值类型是否可以建立连接。该方法的返回值类型是ConnectionConnection。 表表15-1 15-1 DriverManagerDriverManager方法方法描述描述static void deregisterDriver(Driver driver)static void deregisterDriver(Driver driver)从从 DriverManager Dri

11、verManager 的列表中删除一的列表中删除一个驱动程序个驱动程序static Connection getConnection(String url)static Connection getConnection(String url)试图建立到给定数据库试图建立到给定数据库 URL URL 的连接的连接static Connection getConnection(String url, static Connection getConnection(String url, Properties info) Properties info) 试图建立到给定数据库试图建立到给定数据库 U

12、RL URL 的连接的连接static Connection getConnection(String url, static Connection getConnection(String url, String user, String password)String user, String password)试图建立到给定数据库试图建立到给定数据库 URL URL 的连接的连接static Driver getDriver(String url) static Driver getDriver(String url) 试图查找能理解给定试图查找能理解给定 URL URL 的驱动程的驱动

13、程序序static void setLoginTimeout(int seconds) static void setLoginTimeout(int seconds) 设置驱动程序试图连接到某一数据库设置驱动程序试图连接到某一数据库时将等待的最长时间,以秒为单位时将等待的最长时间,以秒为单位Java程序设计-15-访问数据库连接所需的连接所需的URLURL分析分析jdbc:jdbc:例如:例如:uurl= url= jdbc:microsoft:sqlserver:/localhost:1433;jdbc:microsoft:sqlserver:/localhost:1433; + + da

14、tabasename=score;User=sa;Password=12345databasename=score;User=sa;Password=123456;6;u这里的这里的subprotocolsubprotocol是是microsoftmicrosoft,除此之外,根,除此之外,根据情况还有据情况还有odbcodbc、oracleoracle、mysqlmysql等。而等。而subnamesubname则指定了数据源。则指定了数据源。 Java程序设计-15-访问数据库ConnectionConnection表示了与特定数据库的连接(会话),在连接上表示了与特定数据库的连接(会话)

15、,在连接上下文中执行下文中执行 SQL SQL 语句并返回结果。语句并返回结果。表15-2 Connection方法描述void void close()()void void commit()()Statement createStatement()Statement createStatement()CallableStatement prepareCall(String sql)CallableStatement prepareCall(String sql)PreparedStatement prepareStatement(String sql)PreparedStatement p

16、repareStatement(String sql)void void rollback()()void rollback(Savepoint savepoint)void rollback(Savepoint savepoint)void setAutoCommit(boolean autoCommit)void setAutoCommit(boolean autoCommit)Savepoint setSavepoint()Savepoint setSavepoint()void setTransactionIsolation(int level)void setTransactionI

17、solation(int level)Java程序设计-15-访问数据库15.315.3使用使用StatementStatement访问数据库访问数据库StatementStatement对象用于将对象用于将 SQL SQL 语句发送到数据库系统中。语句发送到数据库系统中。实际上有三种实际上有三种 Statement Statement 对象,它们都作为在给定连接对象,它们都作为在给定连接上执行上执行 SQL SQL 语句的包容器:语句的包容器:uStatementStatementuPreparedStatementPreparedStatement(继承(继承 StatementState

18、ment)uCallableStatementCallableStatement(继承(继承PreparedStatementPreparedStatement)它们都专用于发送特定类型的它们都专用于发送特定类型的 SQL SQL 语句:语句:uStatement Statement 对象用于执行不带参数的简单对象用于执行不带参数的简单 SQL SQL 语句;语句;uPreparedStatement PreparedStatement 对象用于执行带或不带对象用于执行带或不带 IN IN 参数的预参数的预编译编译 SQL SQL 语句;语句;uCallableStatement Callab

19、leStatement 对象用于执行对数据库已存储过程的对象用于执行对数据库已存储过程的调用。调用。 Java程序设计-15-访问数据库表表12-4 Statement的主要方法的主要方法void addBatch(String sql)void addBatch(String sql)将给定的将给定的 SQL SQL 命令添加到此命令添加到此 Statement Statement 对象的当前命令对象的当前命令列表中。列表中。void clearBatch()void clearBatch()清空此清空此 StatementStatement 对象的当前对象的当前 SQL 命令列表。命令列表

20、。void closeclose()立即释放此立即释放此 Statement Statement 对象的数据库和对象的数据库和 JDBC JDBC 资源,而资源,而不是等待该对象自动关闭时发生此操作。不是等待该对象自动关闭时发生此操作。boolean execute(String sql)boolean execute(String sql)执行给定的执行给定的 SQL 语句,该语句可能返回多个结果。语句,该语句可能返回多个结果。ResultSet executeQuery(String sql) ResultSet executeQuery(String sql) 执行给定的执行给定的 SQ

21、L 语句,该语句返回单个语句,该语句返回单个 ResultSetResultSet 对象。对象。int executeBatch()int executeBatch()将一批命令提交给数据库来执行,如果全部命令执行成功,将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。则返回更新计数组成的数组。int executeUpdate(String sql) int executeUpdate(String sql) 行给定行给定 SQL 语句,该语句可能为语句,该语句可能为 INSERTINSERT、UPDATEUPDATE 或或 DELETEDELETE 语句,或者不

22、返回任何内容的语句,或者不返回任何内容的 SQL 语句(如语句(如 SQL DDL 语句)。语句)。Connection getConnection() Connection getConnection() 检索生成此检索生成此 StatementStatement 对象的对象的 ConnectionConnection 对象。对象。ResultSet getResultSet()ResultSet getResultSet()以以 ResultSetResultSet 对象的形式检索当前结果。对象的形式检索当前结果。void setMaxRows(int max)void setMaxRow

23、s(int max)将任何将任何 ResultSet 对象都可以包含的最大行数限制设置为对象都可以包含的最大行数限制设置为给定数。如果超过了该限制,则安静地撤消多出的行。给定数。如果超过了该限制,则安静地撤消多出的行。Java程序设计-15-访问数据库1 1 创建创建 Statement Statement 对象对象 u 建立了到特定数据库的连接之后,要想用该连建立了到特定数据库的连接之后,要想用该连接发送接发送 SQL SQL 语句,首先需要创建一个语句,首先需要创建一个Statement Statement 对象,可用对象,可用 Connection Connection 的方法的方法 c

24、reateStatement createStatement 创建。创建。u Statement stmt = con.createStatement(); Statement stmt = con.createStatement(); Java程序设计-15-访问数据库2 2 使用使用 Statement Statement 对象执行语句对象执行语句u ResultSet rs = stmt.executeQuery(select sid, ResultSet rs = stmt.executeQuery(select sid, name, gender from student); nam

25、e, gender from student); Statement Statement 接口提供了四种执行接口提供了四种执行 SQL SQL 语句的方法。语句的方法。 u 方法方法addBatchaddBatch和和executeBatchexecuteBatch结合起来使用,执行命令结合起来使用,执行命令的顺序以添加到批中的顺序为主。的顺序以添加到批中的顺序为主。u 方法方法 executeQuery executeQuery 用于产生单个结果集的语句,例如用于产生单个结果集的语句,例如 SELECT SELECT 语句。语句。 u 方法方法 executeUpdate executeUp

26、date 用于执行用于执行 INSERTINSERT、UPDATE UPDATE 或或 DELETE DELETE 语句以及语句以及 SQL DDLSQL DDL(数据定义语言)语句。(数据定义语言)语句。u 方法方法 execute execute 用于执行返回多个结果集、多个更新计用于执行返回多个结果集、多个更新计数或二者组合的语句。数或二者组合的语句。 ResultSet rs = null;rs = stmt.executeQuery(select sid, name, gender from student); Java程序设计-15-访问数据库3 3 语句完成语句完成 u 当连接处

27、于自动提交模式时,其中所执行的语句在完成时将自动提交或还原。语句在已执行且所有结果返回时,即认为已完成。对于返回一个结果集的 executeQuery 方法,在检索完 ResultSet 对象的所有行时该语句完成。对于方法 executeUpdate,当它执行时语句即完成。但在少数调用方法 execute 的情况中,在检索所有结果集或它生成的更新计数之后语句才完成。 u 有些 DBMS 将已存储过程中的每条语句视为独立的语句;而另外一些则将整个过程视为一个复合语句。在启用自动提交时,这种差别就变得非常重要,因为它影响什么时候调用 commit 方法。在前一种情况中,每条语句单独提交;在后一种情

28、况中,所有语句同时提交。 Java程序设计-15-访问数据库4 4 关闭关闭 Statement Statement 对象对象 uStatement Statement 对象将由对象将由 Java Java 垃圾收集程序自动关垃圾收集程序自动关闭。而作为一种好的编程风格,应在不需要闭。而作为一种好的编程风格,应在不需要 Statement Statement 对象时显式地关闭它们。这将立即释对象时显式地关闭它们。这将立即释放放 DBMS DBMS 资源,有助于避免潜在的内存问题。如资源,有助于避免潜在的内存问题。如上述程序中的上述程序中的finallyfinally代码块中的语句:代码块中的语

29、句:ustmt.close();stmt.close();ucon.close();con.close();Java程序设计-15-访问数据库15.4ResultSet15.4ResultSetResultSet ResultSet 包含数据库中存储的符合包含数据库中存储的符合 SQL SQL 语句语句中条件的所有记录,并且它通过一套中条件的所有记录,并且它通过一套 get get 方法方法(这些(这些 get get 方法可以访问当前行中的不同列)方法可以访问当前行中的不同列)提供了对这些记录中数据的访问。提供了对这些记录中数据的访问。 u定位记录定位记录u获得此记录对应属性的值获得此记录对

30、应属性的值Java程序设计-15-访问数据库表表15-4 ResultSet主要方法主要方法boolean absolute(int row) 将指针移动到此将指针移动到此 ResultSet 对象的给定行编号对象的给定行编号void afterLast()将指针移动到此将指针移动到此 ResultSetResultSet 对象的末尾,正好位于最后一行之后对象的末尾,正好位于最后一行之后void beforeFirst()将指针移动到此将指针移动到此 ResultSetResultSet 对象的开头,正好位于第一行之前对象的开头,正好位于第一行之前void cancelRowUpdates()

31、取消对取消对 ResultSetResultSet 对象中的当前行所作的更新对象中的当前行所作的更新void close()立即释放此立即释放此 ResultSetResultSet 对象的数据库和对象的数据库和 JDBC 资源,而不是等待资源,而不是等待该对象自动关闭时发生此操作该对象自动关闭时发生此操作void deleteRow()从此从此 ResultSetResultSet 对象和底层数据库中删除当前行对象和底层数据库中删除当前行boolean first()将指针移动到此将指针移动到此 ResultSetResultSet 对象的第一行对象的第一行XXX getXXX(String

32、 columnName)XXX指指boolean、byte、int、double、float、Date、long等类型,等类型,既获得对应属性值既获得对应属性值void moveToCurrentRow()将指针移动到记住的指针位置,通常为当前行将指针移动到记住的指针位置,通常为当前行void moveToInsertRow()将指针移动到插入行将指针移动到插入行boolean next() 将指针从当前位置下移一行将指针从当前位置下移一行boolean previous()将指针移动到此将指针移动到此 ResultSetResultSet 对象的上一行对象的上一行boolean relati

33、ve(int rows)按相对行数(或正或负)移动指针按相对行数(或正或负)移动指针Java程序设计-15-访问数据库.1行和光标行和光标行和光标行和光标uResultSet 对象具有指向其当前数据行的指针。最初,指针被置于第一行之前。next 方法将指针移动到下一行,因为该方法在 ResultSet 对象中没有下一行时返回 false,所以可以在 while 循环中使用它来迭代结果集。 u默认的 ResultSet 对象不可更新,仅有一个向前移动的指针。因此,只能迭代它一次,并且只能按从第一行到最后一行的顺序进行。可更新结果集uStatement stmt = con.c

34、reateStatement(int resultSetType , int resultSetConcurrency );u参数resultSetType表示结果集类型。它是 esultSet.TYPE_FORWARD_ONLY、ResultSet.TYPE_SCROLL_INSENSITIVE 或 ResultSet.TYPE_SCROLL_SENSITIVE 之一u参数resultSetConcurrency 表示并发类型 。它是 ResultSet.CONCUR_READ_ONLY 或 ResultSet.CONCUR_UPDATABLE 之一Java程序设计-15-访问数据库15.4

35、.2获取列的值2 2 访问列访问列u 方法方法 getXXX getXXX 提供了获取当前行中某列值的途提供了获取当前行中某列值的途径。在每一行内,可按任何次序获取列值。但径。在每一行内,可按任何次序获取列值。但为了保证可移植性,应该从左至右获取列值,为了保证可移植性,应该从左至右获取列值,并且一次性地读取列值。列名或列号可用于标并且一次性地读取列值。列名或列号可用于标识要从中获取数据的列。识要从中获取数据的列。 u 通过下标获得当前记录指定列的列值通过下标获得当前记录指定列的列值u 通过字段名获得当前记录指定列的列值通过字段名获得当前记录指定列的列值u 通过字段名或下标获得当前记录未知类型的

36、指通过字段名或下标获得当前记录未知类型的指定列的列值定列的列值String sql=select id,name,balance from tb_account;ResultSet rs=stmt.executeQuery(sql);while(rs.next()String id=rs.getString(1);String name=rs.getString(2);int balance=rs.getInt(3);System.out.printf(id:%s,name:%s,balance:%drn, id,name,balance);rs.close();String sql=sele

37、ct id,name,balance from tb_account;ResultSet rs=stmt.executeQuery(sql);while(rs.next()String id=rs.getString(id);String name=rs.getString(name);int balance=rs.getInt(balance);System.out.printf(id:%s,name:%s,balance:%drn, id,name,balance);rs.close();Object id=rs.getObject(id);Object name=rs.getObject

38、(name);Object balance=rs.getObject(balance);Java程序设计-15-访问数据库15.4.3插入新行插入新行插入新行u直接利用直接利用StatementStatement执行执行 insertinsert语句。语句。u当当StatementStatement对象的结果集类型是可更新的时候对象的结果集类型是可更新的时候, ResultSetResultSet对象具有一个与其关联的特殊行,对象具有一个与其关联的特殊行,该行用作构建要插入的行的暂存区域该行用作构建要插入的行的暂存区域 (staging (staging area)area),利用它可以完成向

39、数据表的插入操作。,利用它可以完成向数据表的插入操作。rs.moveToInsertRow();/ 定位插入行位置,然后更新每个字段的值定位插入行位置,然后更新每个字段的值rs.updateString(id, uuid.toString();rs.updateNString(name, name);rs.updateInt(balance, balance);rs.insertRow();/将插入行的内容插入到此将插入行的内容插入到此 ResultSet 对象和数据库对象和数据库Java程序设计-15-访问数据库15.4.4更新列值更新列值更新列值u 同样地批量的修改可以用同样地批量的修改可

40、以用StatementStatement执行执行SQLSQL来来确定确定 u ResultSetResultSet提供了针对一条记录某个字段进行修提供了针对一条记录某个字段进行修改的方法改的方法updateXXXupdateXXX;ResultSet rs = stmt.executeQuery(select id,name,balance + from tb_account where name=张华张华);if(rs.next() /假如找到这样符合条件的记录假如找到这样符合条件的记录rs.updateInt(balance, 100);rs.updateRow();Java程序设计-15

41、-访问数据库15.4.5删除记录行删除记录删除记录u 同样地批量的删除可以用同样地批量的删除可以用StatementStatement执行执行SQLSQL来来确定确定 u ResultSetResultSet提供了删除一条记录的方法提供了删除一条记录的方法deleteRow()deleteRow();ResultSet rs = stmt.executeQuery(select * from tb_account where balance=0);while (rs.next() / 逐个删除每条记录逐个删除每条记录 rs.deleteRow();rs.close();Java程序设计-15-

42、访问数据库6 6 数据类型和转换数据类型和转换u对于对于 getXXX getXXX 方法,方法,JDBC JDBC 驱动程序试图将基本驱动程序试图将基本数据转换成指定数据转换成指定 Java Java 类型,然后返回适合的类型,然后返回适合的 Java Java 值。例如,如果值。例如,如果 getXXX getXXX 方法为方法为 getStringgetString,而基本数据库中数据类型为,而基本数据库中数据类型为 VARCHARVARCHAR,则,则 JDBC JDBC 驱动程序将把驱动程序将把 VARCHAR VARCHAR 转换转换成成 Java StringJava Strin

43、g。getString getString 的返回值将为的返回值将为 Java String Java String 对象。对象。 Java程序设计-15-访问数据库7 7 对非常大的行值使用对非常大的行值使用I/OI/O流流JDBC API JDBC API 具有三个获取流的方法,分别具有具有三个获取流的方法,分别具有不同的返回值:不同的返回值:u getBinaryStream getBinaryStream 返回只提供数据库原字节而返回只提供数据库原字节而不进行任何转换的流。不进行任何转换的流。u getAsciiStream getAsciiStream 返回提供单字节返回提供单字节

44、ASCII ASCII 字符字符的流。的流。u getCharacterStream(getCharacterStream(返回提返回提ReaderReader类型字符的类型字符的流。流。Java程序设计-15-访问数据库8 NULL 8 NULL 结果值结果值u 在读取字段值时,一般而言要对一些不明确值在读取字段值时,一般而言要对一些不明确值是否存在的字段值进行空值判断。要确定给定是否存在的字段值进行空值判断。要确定给定结果值是否是结果值是否是 JDBC NULLJDBC NULL,必须先读取该列,必须先读取该列,然后使用然后使用 ResultSet.wasNull ResultSet.wa

45、sNull 方法检查该次读方法检查该次读取是否返回取是否返回 JDBC NULLJDBC NULL。 Java程序设计-15-访问数据库15.5 PreparedStatement15.5 PreparedStatementPreparedStatementPreparedStatementu继承于继承于StatementStatement,它允许使用可替代的参数修,它允许使用可替代的参数修改最终执行的改最终执行的SQLSQL语句,语句,PreparedStatement pstmt = con.prepareStatement( insert into tb_account(id,name,

46、balance) values(?,?,?);UUID uuid = UUID.randomUUID();pstmt.setString(1, uuid.toString();/设置设置id字段的值字段的值pstmt.setString(2, 王军王军);/设置设置name字段的值字段的值pstmt.setInt(3, 1000); /设置设置balance字段的值字段的值pstmt.executeUpdate(); /用前面的实参值,替代原来的参数,执行用前面的实参值,替代原来的参数,执行SQL语句语句PreparedStatement pstmt = con.prepareStatemen

47、t( select id,name,balance from tb_account where name=?, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);pstmt.setString(1, 张华张华);ResultSet rs = pstmt.executeQuery();Java程序设计-15-访问数据库15.6 CallableStatementCallableStatementCallableStatementuJDBCJDBC中提供了中提供了CallableStatement CallableStatem

48、ent 对象为所有的对象为所有的 DBMS DBMS 实现了一种以标准形式调用储存过程的方实现了一种以标准形式调用储存过程的方法。对储存过程的调用是法。对储存过程的调用是 CallableStatementCallableStatement对对象所含的主要内容。象所含的主要内容。 CREATE procedure sumBalance low int,high intasbegindeclare total intselect total=sum(balance) from tb_account where balance=low and balance=highreturn totalend

49、; CallableStatement cstmt = con.prepareCall(?=call sumBalance(?,?); Java程序设计-15-访问数据库Connection con = null;try (01) con = DriverManager.getConnection(url);(02) String procName=?=call sumBalance(?,?);(03) CallableStatement cstmt = con.prepareCall(procName);(04) cstmt.setInt(2, 1000);(05) cstmt.setInt

50、(3, 10000);(06) cstmt.registerOutParameter(1, Types.INTEGER);(07) cstmt.execute();(08) System.out.println(cstmt.getInt(1);(09) cstmt.close();(10) con.close(); catch (SQLException e) e.printStackTrace();Java程序设计-15-访问数据库15.7 JDBC15.7 JDBC事务事务事务事务u数据库的事务就是对现实生活中事务的模拟,它由一组在数据库的事务就是对现实生活中事务的模拟,它由一组在业务逻辑

51、上相互依赖的业务逻辑上相互依赖的SQLSQL语句组成。为了保证事务的完整语句组成。为了保证事务的完整性,性,JDBCJDBC提供了相应的事务控制机制。提供了相应的事务控制机制。 事务提交模式事务提交模式u在在JDBCJDBC编程模型中,一个数据库连接建立时,就处于一个编程模型中,一个数据库连接建立时,就处于一个自动提交模式,每一个自动提交模式,每一个SQLSQL语句被执行完成后就会被自动提语句被执行完成后就会被自动提交,反映至数据库中。当需要把几条逻辑上相关的交,反映至数据库中。当需要把几条逻辑上相关的SQLSQL组成组成一个事务执行时,就需要关闭事务自动提交模式。如下面一个事务执行时,就需要

52、关闭事务自动提交模式。如下面的语句所示:的语句所示:ucon.setAutoCommit(false);/con.setAutoCommit(false);/关闭自动提交模式关闭自动提交模式u一旦关闭了事务自动提交模式,不会有任何一旦关闭了事务自动提交模式,不会有任何SQLSQL语句被提交语句被提交至数据库系统执行,除非显式的调用提交方法。至数据库系统执行,除非显式的调用提交方法。 Java程序设计-15-访问数据库public void transfer(Account a,Account b,int amount)throws SQLException PreparedStatement pstmt

温馨提示

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

评论

0/150

提交评论