JDBC数据库访问.ppt_第1页
JDBC数据库访问.ppt_第2页
JDBC数据库访问.ppt_第3页
JDBC数据库访问.ppt_第4页
JDBC数据库访问.ppt_第5页
已阅读5页,还剩114页未读 继续免费阅读

下载本文档

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

文档简介

Java Web 编程技术 第7章 JDBC数据库访问 7.1 数据库简介 7.2 Java数据库技术概述 7.3 传统的数据库连接方法 7.4 JDBC API介绍 7.5 访问数据库元数据(自学) 7.6 预处理语句 7.7 使用数据源连接数据库(自学) 7.8 DAO设计模式介绍 7.9可调用语句 7.10事务处理(自学) 7.1 数据库简介 v PostgreSQL v MySQL v SQL Server v ORACLE 7.1.1 PostgreSQL数据库简介 v PostgreSQL是对象关系型数据库管理系统(ORDBMS) v 它起源于伯克利(BSD)的数据库研究计划,目前是最重要 的开源数据库产品开发项目之一,有着非常广泛的用户 v PostgreSQL支持事务、子查询、多版本并发控制、数据 完整性检查等特性,并且支持多语言的应用开发 v 能在包括Linux、FreeBSD和Windows等多种平台下运行 PostgreSQL的下载和安装 v 计算机系统必须满足下面要求: CPU:Intel或AMD的32位或64位CPU。 操作系统:Windows、Linux、FreeBSD(UNIX)、MAC。 磁盘格式:文件系统为NTFS格式。 用户:以系统管理员身份安装PostgreSQL。 v 目前的最新版本是9.1.3版。 v 下载地址: /products- services-training/pgdownload 使用pgAdmin III 操作数据库 在数据库名模式public 数据表下查 看或新建数据表 使用工具查询工具,查询数据库数据 7.1.2 MySQL数据库简介 v MySQL是目前最为流行的开放源代码的数据库,是完全网 络化的跨平台的关系型数据库系统,它是由瑞典的MySQL AB 公司(开发人Michael Widenius and David Axmark)于 1995年开始发布 v 2008年2月26日,Sun公司并购MySQL AB 公司,2010年1 月27日,Oracle公司并购了Sun公司,现在MySQL属于 Oracle。 v 版本:开源版MySql5.5,企业服务器版MySql5.6,集群版 MySql7.1 v 下载地址/downloads 7.1.2 MySQL数据库简介 v 一种完全免费的产品,被广泛地应用在中小型网站和管理 系统中 v 具有功能强大、支持跨平台、运行速度快、支持面向对象 、安全性高、成本低、支持各种开发语言、数据存储量大 、支持强大的内置函数等特点 v 能在包括Linux、FreeBSD和Windows等多种平台下运行 用SQLyog工具管理MySQL数据库 下载地址 7.1.3 SQL Server数据库简介 v SQL Server是由Microsoft开发和推广的关系数据库管理系 统(DBMS),提供了一个可靠的、高效的、智能化的数据 平台 v 经历7.0,2000,2005,2008等版本, 其中SQL Server 2008分为SQL Server 2008企业版、标准版、工作组版、 Web版、开发者版、Express版(免费)、Compact 3.5版 v SQL Server 2008企业版是一个全面的数据管理和业务智能 平台,为关键业务应用提供了企业级的可扩展性、数据仓 库、安全、高级分析和报表支持。 v SQL Server 2008标准版是一个完整的数据管理和业务智能平 台,为部门级应用提供了最佳的易用性和可管理特性。 v SQL Server 2008工作组版是一个值得信赖的数据管理和报表 平台,用以实现安全的发布、远程同步和对运行分支应用的管 理能力。 这一版本拥有核心的数据库特性,可以很容易地升级 到标准版或企业版。 v SQL Server 2008 Web版是针对运行于Windows服务器中要求 高可用、面向Internet Web服务的环境而设计。这一版本为实 现低成本、大规模、高可用性的Web应用或客户托管解决方案 提供了必要的支持工具。 v SQL Server 2008开发者版允许开发人员构建和测试基于SQL Server的任意类型应用。这一版本拥有所有企业版的特性,但 只限于在开发、测试和演示中使用。基于这一版本开发的应用 和数据库可以很容易地升级到企业版。 7.1.3 SQL Server数据库简介 v SQL Server 2008 Express版是SQL Server的一个免费版本, 它拥有核心的数据库功能,其中包括了SQL Server 2008中最 新的数据类型,但它是SQL Server的一个微型版本。这一版本 是为了学习、创建桌面应用和小型服务器应用而发布的。 v SQL Server Compact是一个针对开发人员而设计的免费嵌入式 数据库,这一版本的意图是构建独立、仅有少量连接需求的移 动设备、桌面和Web客户端应用。 SQL Server Compact可以 运行于所有的微软Windows平台之上,包括Windows XP和 Windows Vista操作系统,以及Pocket PC和SmartPhone设备 。 7.1.3 SQL Server数据库简介 在配置工具Sql Server配置管理器中启动 Sql Server2008服务 用Sql Server management studio打开 Sql Server2008控制台 7.1.4 ORACLE数据库 v Oracle是目前关系型数据库管理系统市场中应用最广泛的产品 ,最新的Oracle版本是Oracle 11g v 劳伦斯埃里森和他的朋友Bob Miner和Ed Oates在1977年建立 了软件开发实验室咨询公司(SDL,Software Development Laboratories)。SDL开发了Oracle软件的最初版本 v ORACLE数据库在物理上是存储于硬盘的各种文件。它是活动 的,可扩充的,随着数据的添加和应用程序的增大而变化 v ORACLE数据库在逻辑上是由许多表空间构成 v ORACLE的详细信息参见百度百科 /view/15020.htm 用PL/SQL Developer管理Oracle数据库 7.2 Java数据库技术概述 v Java程序是通过JDBC(Java DataBase Connection)访问数据 库的。 该工具包使得Java编程人员可以连接到一个数据库,进 而使用SQL 对数据库进行查询和更新操作 可以理解成是对查询分析器的模拟实现 v JDBC的基本功能包括: 建立与数据库的连接; 发送SQL语句; 处理数据库操作结果。 Java数据库应用程序 JDBC驱动程序管理器 JDBC/ODBC 桥接器 ODBC 驱动程序 DB供应商提供的 JDBC驱动程序 DB JDBC API JDBC驱动程序 API SQL命令 (SQL Server、Oracle) JDBC运行原理 JDBC与JDBC驱动程序的关系 JDBC= JDBC驱动 程序管理器 JDBC Driver API + 供编程人员使用供数据库厂商使用 JDBC API + JDBC 驱动程序 实现 实现 java.sql包 数据库厂商 提供 JDBC的结构 数据库访问的两层和三层模型 v 两层模型即客户机/数据库服务器结构,也就是通常所说 的C/S(Client/Server)结构 v 三层模型是指客户机/应用服务器/数据库服务器结构,也 就是通常所说的B/S(Browser/Server)结构 JDBC驱动程序 v 在Java程序中可以使用的数据库驱动程序主要有四种类型, 常用的有下面两种: JDBC-ODBC桥驱动程序 专为某种数据库而编写的驱动程序 postgreSQL驱动包:postgresql-9.0-801.jdbc4.jar MySQL驱动包:mysql-connector-java-5.0.8-bin.jar Sql Server驱动包:sqljdbc.jar Oracle驱动包:classes12.jar 以上驱动包可到进入Web应用开发课程的 教学材料学习参考资料 下载 安装JDBC驱动程序 v 使用JDBC-ODBC桥驱动程序连接数据库,不需要安装驱动程 序,因为在Java API中已经包含了该驱动程序。 v 使用专用驱动程序连接数据库,必须安装驱动程序。 在开发Web应用程序中,需要将驱动程序打包文件复制到 : Tomcat安装目录的lib目录中 Web应用程序的WEB-INFclasseslib目录中 Eclipse工程的build path中 Java访问数据库的过程 7.3 传统的数据库连接方法 7.3.1 加载驱动程序 7.3.2 建立连接对象 7.3.3创建语句对象 7.3.4获得SQL语句的执行结果 7.3.5关闭建立的对象,释放资源 7.3.6简单的应用示例 7.3.1 加载驱动程序 v 使用Class类的forName()静态方法,该方法的声明格式为: public static Class forName(String className) throws ClassNotFoundException v 如果使用ODBC-JDBC桥驱动程序,则使用JDK自带的驱动程 序,名称为“sun.jdbc.odbc.JdbcOdbcDriver” Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver“); v 数据库厂商提供的专门的驱动程序,应该给出专门的驱动程序 名。 几种常见数据库的加载驱动程序代码 v PostgreSQL数据库: Class.forName(“org.postgresql.Driver“); v MySQL数据库: Class.forName(“com.mysql.jdbc.Driver“); v SQL Server数据库: Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerD river“); v Oracle数据库: Class.forName(“oracle.jdbc.driver.OracleDriver“); 7.3.2 建立连接对象 v 使用DriverManager类的getConnection() v DriverManager类的静态方法getConnection(),该方法的声明 格式为: public static Connection getConnection(String dburl) public static Connection getConnection(String dburl,String user,String password) v 如果通过JDBC-ODBC桥驱动程序连接数据库,URL的形式为 : jdbc:odbc:DataSource v 例如: String dburl = “jdbc:odbc:Bookstore“ ; v 如果使用专门的驱动程序连接数据库,JDBC URL可能更复杂 一些。例如要连接PostgreSQL数据库,它的JDBC URL为: jdbc:postgresql:/localhost:5432/dbname String dburl = “jdbc:postgresql:/localhost:5432/bookstore“; Connection conn = DriverManager.getConnection(dburl, “bookstore“, “bookstore“); 7.3.2 建立连接对象(续) v 连接MySQL数据库为: String dburl = jdbc:mysql:/localhost:3306/bank Connection conn = DriverManager.getConnection(dburl, “root“, “111111“); v 连接SQL Server数据库为: String dburl = jdbc:microsoft:sqlserver:/localhost:1433;DatabaseName=web2011 Connection conn = DriverManager.getConnection(dburl, “web“, “web2011“); v 连接Oracle数据库为: String dburl = jdbc:oracle:thin:localhost:1521:ORCL Connection conn = DriverManager.getConnection(dburl, “system_dba“, “123456“); 7.3.2 建立连接对象(续) 7.3.3创建语句对象 v 对于不同的语句对象,可以使用Connection接口的不同方法创建 。 v 例如,要创建一个简单的Statement对象可以使用 createStatement()方法, Statement stmt = conn.createStatement(); v 创建PreparedStatement对象(预编译的 SQL 语句)应使用 prepareStatement()方法 v 创建CallableStatement对象(用于执行 SQL 存储过程)应使用 prepareCall()方法。 7.3.4获得SQL语句的执行结果 v 对于查询语句,调用executeQuery(String sql)方法,如: String sql = “SELECT * FROM books“ ; ResultSet rst = stmt.executeQuery(sql) ; while(rst.next() out.print(rst.getString(1)+“t“) ; v 对于语句如CREATE、ALTER、DROP、INSERT、UPDATE 、DELETE等须executeUpdate(String sql)方法。 该方法返回值为整数,用来指示被影响的行数。 7.3.5关闭建立的对象,释放资源 v 在Connection接口、Statement接口和ResultSet接口中都定义 的close()方法。 v 当这些对象使用完毕后应使用close()方法关闭建立的对象,关 闭对象应该按与建立对象相反的顺序关闭,从而释放资源。 v 例如: conn.close(); 7.3.6 简单的应用示例 v 1、连接postgreSQL、MySQL和SQL Server数据库的例子 (1)连接postgreSQL:testPostgreSQL.jsp (2)连接MySQL:testMySQL.jsp (3)连接SQL Server:testSqlServer.jsp 连接PostgreSQL数据库的主要代码testPostgreSQL.jsp v v v v v v 连接MySQL数据库的主要代码testMySQL.jsp v v v v v 连接SQLServer数据库的主要代码testSqlServer.jsp v v v v v 7.3.6 简单的应用示例 v 2、基于MVC设计模式实现数据库查询:从JSP页面输入一个 书号,查询该书的信息 v 该应用的程序代码(P189): v 模型:BookBean.java v 视图:bookQuerys.jsp v showBook.jsp v error.jsp v 控制器:BookQueryServlet.java 7.4 JDBC API介绍 v JDBC API是Java语言的标准API,目前的最新版本是JDBC 4.0 。在JDK 6.0中,它是通过两个包提供的: java.sql包 javax.sql包 v java.sql包提供了基本的数据库编程的类和接口,如驱动程序管 理类DriverManager、创建数据库连接Connection接口、执行 SQL语句以及处理查询结果的类和接口等。 v javax.sql包主要提供了服务器端访问和处理数据源的类和接口 ,如DataSource、RowSet、RowSetMetaData、 PooledConnection接口等,它们可以实现数据源管理、行集管 理以及连接池管理等。 java.sql包 功能类、接口(斜体) JDBC API 执行SQL语句对SQL语句进行 封装,并用此sql语句操作数据库 java.sql. Connection java.sql. Statement java.sql. PreparedStatement 驱动程序管理器装载和管理各 个数据库驱动 java.sql. DriverManager 执行sql语句的结果集将SQL语 句的执行结果封装成象 java.sql. ResultSet java.sql. ResultSetMetaData 辅助类 特殊数据类型包装类、异常类 Driever API 供应商必须实现的驱动程序API java.sql. Driver java.sql. DatabaseMetaDat javax.sql包中的类和接口 javax.sql.DataSource和java.sql.Connection 之间的关系 连接池化过程中涉及的关系 分布式事务支持中涉及的关系 行集涉及的关系 v Connection对象代表与数据库的连接,也就是在加载的驱动程序与数据库 之间建立连接。一个应用程序可以与一个数据库建立一个或多个连接,或 者与多个数据库建立连接。 v 得到连接对象后,可以调用Connection接口的方法创建SQL语句对象以及 在连接对象上完成各种操作,下面是Connection接口的常用方法: v public Statement createStatement() 7.4.1 Connection接口 v public DatabseMetaData getMetaData() 所连接的数据库的元数据 v public void setAutoCommit(boolean autoCommit) v public boolean getAutoCommit() 获取自动提交模式 v public void commit() 提交对数据库的更新操作,使更新写入数据库 。只有当setAutoCommit()设置为false时才应该使用该方法。 v public void rollback() 回滚对数据库的更新操作。只有当 setAutoCommit()设置为false时才应该使用该方法。 v public void close() v public boolean isClosed() 7.4.2 Statement对象 v 通过Connection对象可以创建SQL语句对象,SQL语句对象有 三种:Statement、PreparedStatement和CallableStatement。 通过调用Connection接口的相应方法可以得到这三种语句对象 。 v Statement接口对象主要用于执行一般的对数据库操作SQL语句 ,调用Statement对象的方法可以执行SQL语句,返回一个 ResultSet结果集对象。 v public ResultSet executeQuery(String sql) 该方法用来执行SQL查 询语句。查询结果以ResultSet对象返回。 v public int executeUpdate(String sql) 执行由字符串sql指定的SQL 语句,该语句可以是INSERT、DELETE、UPDATE语句或者无返 回的SQL语句,如CREATE TABLE。返回值是更新的行数,如果 语句没有返回则返回值为0。 v public boolean execute(String sql) 执行可能有多个结果集的SQL 语句,sql为任何的SQL语句。如果语句执行的第一个结果为 ResultSet对象,该方法返回true,否则返回false。 v public Connection getConnection() v public void close() Statement的方法 7.4.3 ResultSet接口 v ResultSet对象表示SQL SELECT语句查询得到的记录集合,称 为结果集。 v 结果集一般是一个记录表,其中包含多个记录行和列标题,一 个Statement对象一个时刻只能打开一个ResultSet对象。通过 调用ResultSet对象的方法,可以对查询结果处理。 v 每个结果集对象都有一个游标。所谓游标(cursor)是结果集的 一个标志或指针。对新产生的ResultSet对象,游标指向第一行 的前面,可以调用ResultSet的next()方法,使游标定位到下一 条记录。 v 如果游标指向一个具体的行,就通过调用ResultSet对象的方法 ,可以对查询结果处理。 v 1. 检索当前行字段值 v ResultSet接口提供了检索行的字段值的方法,由于结果集列 的数据类型不同,所以应该使用不同的getXxx()方法获得列 值,例如若列值为字符型数据,可以使用下列方法检索列值 : v String getString(int columnIndex) v String getString(String columnName) v 返回结果集中当前行指定的列号或列名的列值,结果作为字 符串返回。columnIndex 为列在结果行中的序号,序号从1开 始,columnName结果行中的列名。 ResultSet的方法 v 下面列出了返回其他数据类型的方法,这些方法都可以使用这两种形 式的参数: short getShort(int columnIndex) 返回指定列的short值。 byte getByte(int columnIndex) 返回指定列的byte值。 int getInt(int columnIndex) 返回指定列的int值。 long getLong(int columnIndex) 返回指定列的long值。 float getFloat(int columnIndex) 返回指定列的float值。 double getDouble(int columnIndex) 返回指定列的double值。 boolean getBoolean(int columnIndex) 返回指定列的boolean值。 Date getDate(int columnIndex) 返回指定列的Date对象值。 Object getObject(int columnIndex) 返回指定列的Object对象值。 Blob getBlob(int columnIndex) 返回指定列的Blob对象(Binary Large Object)值。 Clob getClob(int columnIndex) 返回指定列的Clob对象(Character Large Object)值 ResultSet的方法 v 2. 对行操作的方法 调用ResultSet的next()方法,使游标定位到下一条记录。还可以通过其他 方法使游标任意移动,这些方法有: boolean next() throws SQLException 将游标从当前位置向下移动一行。第一次调用next()方法将使第一行成为当 前行,以后调用游标依次向后移动。如果该方法返回true,说明新行是 有效的行,若返回false,说明已无记录。 boolean isFirst() throws SQLException返回游标是否指向第一行 boolean isLast() throws SQLException返回游标是否指向最后一行 int getRow() 返回当前行的行号。 int findColumn(String columnname) 返回列名指定的列号。 ResultSet的方法 v 对于查询语句,调用executeQuery(String sql)方法,该方法的返回 类型为ResultSet,再通过调用ResultSet的方法可以对查询结果的每 行进行处理。如: String sql = “SELECT * FROM books“ ; ResultSet rst = stmt.executeQuery(sql) ; while(rst.next() System.out.print(rst.getString(1)+“t“) ; 对于更新语句,如INSERT、UPDATE、DELETE,须使用 executeUpdate(String sql)方法。该方法返回值为整数,用来指示被 影响的行的数目。 ResultSet的方法 3. 数据类型转换 v 在ResultSet对象中的数据为从数据库中查询出的数据,调用 ResultSet对象的getXxx()方法返回的是Java语言的数据类型 ,因此这里就有数据类型转换的问题。 v 实际上调用getXxx()方法就是把SQL数据类型转换为Java语言 数据类型,下表列出了SQL数据类型与Java数据类型的转换。 ResultSet的方法 SQL数据类型与Java数据类型之间的对应关系 注:不同数据库的数据类型名称有略微差别 7.4.4 可滚动和可更新的ResultSet v 可滚动的ResultSet是指在结果集对象上不但可以向前访 问结果集中的记录,还可以向后访问结果集中的记录。 v 可更新的ResultSet是指不但可以访问结果集中的记录, 还可以通过结果集对象更新数据库。 1、可滚动的ResultSet v 要使用可滚动的ResultSet对象,必须使用Connection对象的带 参数的createStatement()方法创建的Statement,然后在该对 象上创建的结果集才是可滚动的,该方法的格式为: v public Statement createStatement(int resultType, int concurrency) v 参数resultType的取值应为ResultSet接口中定义的下面常量: ResultSet.TYPE_SCROLL_SENSITIVE /可滚动 ResultSet.TYPE_SCROLL_INSENSITIVE /不可滚动 ResultSet.TYPE_FORWARD_ONLY /仅向前读取 v 对于可滚动的结果集,ResultSet接口提供了下面的移动结果集游 标的方法: public boolean next() throws SQLException public boolean previous() throws SQLException public boolean first() throws SQLException public boolean last() throws SQLException public boolean absolute(int rows) throws SQLException将光标移动 到此 ResultSet 对象的给定行编号 public boolean relative(int rows) throws SQLException按相对行数( 或正或负)移动光标 public boolean isFirst() throws SQLException public boolean isLast() throws SQLException public int getRow() 返回游标所在当前行的行号。 用可滚动的结果集更新的两种方式 (1)更新 ResultSet 对象 rs 第五行中的 NAME 列,然后使用方法 updateRow 更新导出 rs 的数据源表。 rs.absolute(5); / moves the cursor to the fifth row of rs rs.updateString(“NAME“, “AINSWORTH“); / updates the / NAME column of row 5 to be AINSWORTH rs.updateRow(); / updates the row in the data source (2)将光标移动到插入行,构建一个三列的行,并使用方法 insertRow 将其插入到 rs 和数据源表中。 rs.moveToInsertRow(); / moves cursor to the insert row rs.updateString(1, “AINSWORTH“); / updates the / first column of the insert row to be AINSWORTH rs.updateInt(2,35); / updates the second column to be 35 rs.updateBoolean(3, true); / updates the third column to true rs.insertRow(); rs.moveToCurrentRow(); 例:查询数据分页显示 2、可更新的ResultSet v 要使ResultSet对象可更新,应该在使用Connection的 createStatement(int , int)创建Statement对象时,指定第二个参数的 值决定是否创建可更新的结果集,该参数也使用ResultSet接口中定 义的常量,如下所示: ResultSet.CONCUR_READ_ONLY不可以更新的 ResultSet 对象的并 发模式 ResultSet.CONCUR_UPDATABLE可以更新的 ResultSet 对象的并发 模式 v 例如,下面语句创建的rst对象就是可滚动和可更新的结果集对象: Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); Resultset rst = stmt.executeQuery(“SELECT * FROM books“); v 对于每种数据类型,ResultSet都定义了相应的updateXXX()方法, 例如: l public void updateInt(int columnIndex, int x) l public void updateInt(String columnName, int x) l public void updateString(int columnIndex, String x) l public void updateString(String columnName, String x) v 有关其他方法请参考Java API文档。 v 当更新了需要更新的所有列之后,调用updateRow()方法把更新写入表中 。updateRow()方法的格式如下: public void updateRow() throws SQLException v 执行该方法后,将用当前行的新内容更新结果集,同时更新数据库。下面 代码说明了如何在books表中修改一本书的信息: static String sql = “SELECT bookid, bname FROM books WHERE bookid =201“; rset = stmt.executeQuery(sql); rset.next(); rset.updateString(2,“Java EE编程指南“); rset.updateRow(); / 更新当前行 v 要插入一行数据首先应该将游标移到插入行,该方法格式如 下: v public void moveToInsertRow() throws SQLException v 当游标移到插入行时,ResultSet记住游标所在的位置。插入 行是与可更新结果集相关的特殊行。它实际上是一个新行的 缓冲区。 v 当游标处于插入行时,调用updateXxx()方法用相应的数据修 改每列的值。完成输入新行的数据之后,调用insertRow()方 法。在调用insertRow()方法之前,该行所有的列都必须给定 一个值。 v public void insertRow() throws SQLException v 调用insertRow()方法之后,这个ResultSet仍然位于插入行。这时,可以 插入另外一行数据,或者移回到刚才ResultSet记住的位置(当前行位置 )。通过调用moveToCurrentRow()方法返回到当前行。也可以在调用 insertRow()方法之前通过调用moveToCurrentRow()方法取消插入。 v 最后,可以通过调用下面的方法从一个表或ResultSet中删除一行数据: public void deleteRow() throws SQLException 从结果集中删除当前行,同时从数据库中将该行删除。 7.5 访问数据库元数据 (自学) v 7.5.1 获得数据库的信息 v 7.5.2 获取结果集的信息 7.5.1 获得数据库的信息 v 在得到数据库的连接对象后,可以通过该对象获得数据库的元信息。 其中包括数据库产品名称、版本号、使用的数据类型和存储过程等信 息。 v 要获取这些信息,需要得到DatabaseMetaData接口对象,这可以通 过调用Connection对象的getMetaData()方法实现。 v 假如conn是一个Connection对象,下面语句可以获得 DatabaseMetaData接口对象dbmd: DatabaseMetaData dbmd = conn.getMetaData() ; v 得到了元数据对象后就可以调用DatabaseMetaData接口的方 法得到数据库的各种元信息了,常用的方法有: String getDatabaseProductName() String getDatabaseProductVersion() String getUserName() String getURL() String getDriverName() String getDriverVersion() 7.5.2 获取结果集的信息 v 在对数据库的表结构已经了解的情况下,可以知道返回的结果集中各 个列的一些情况,如列名、数据类型等。但有时可能并不知道结果集 中各个列的情况,这时可以使用ResultSet的getMetaData()方法来获 得结果集的信息。该方法的格式为: ResultSetMetaData getMetaDate() throws SQLException v ResultSetMetaData接口常用的方法有: int getColumnCount() 返回结果集的列数 String getColumnLabel(int column) 返回结果集中指定列的标题 String getColumnName(int column) 返回结果集中指定列的名称 int getColumnType(int column) 返回结果集中指定列的SQL数据类 型。它的返回值是一个int型值。在java.sql.Types类中定义了各种 SQL数据类型的常量 String getColumnTypeName(int column) 返回结果集中指定列的数 据类型在数据源中的名称 String getSchemaName(int column) 返回指定列所属表的模式名 String getTableName(int column) 返回指定的列所属的表名 boolaen isReadOnly(int column) 返回指定的列是否只读 boolaen isNullable(int column) 返回指定的列是否可取空值 7.6 预处理语句 v 为了提高语句的执行效率 可以使用PreparedStatement接口对象 v 调用数据库的存储过程 可以使用CallableStatement接口对象。 7.6.1 创建PreparedStatement对象 v PreparedStatement接口继承了Statement接口,因此它可以使用 Statement接口中定义的方法。 v PreparedStatement对象还可以创建带参数的SQL语句,在SQL语 句中指出接收哪些参数,然后进行预编译。 v 创建PreparedStatement对象与创建Statement对象类似,唯一不同 的是需要给创建的PreparedStatement对象传递一个SQL命令,即 需要将执行的SQL命令传递给其构造方法而不是execute()方法。 v 如: PreparedStatement pstmt = con.prepareStatement(“UPDATE EMPLOYEES SET SALARY = 15000.00 WHERE ID = 110592“); v 用Connection的下列方法创建PreparedStatement对象: l public PreparedStatement prepareStatement(String sql) l public PreparedStatement prepareStatement(String sql,int type, int concurrency) l public PreparedStatement prepareStatement(String sql,int type, int concurrency,int holdability) Type为结果集类型, concurrency为并发类型 ResultSet对象的可保持性是指当一条语句执行新的SQL命令或调用 commit()时是否关闭之前打开的ResultSet。JDBC 3.0可以让 ResultSet对象一直处于打开状态。 v 要指定结果集是否是可保持的,可使用ResultSet接口的常量: v ResultSet.HOLD_CURSOR_OVER_COMMIT /保持打开 v ResultSet.CLOSE_CURSOR_OVER_COMMIT /关闭 v PreparedStatement对象通常用来执行动态SQL语句,此时需要在 SQL语句通过问号指定参数,每个问号为一个参数。 v 上述这些方法中的第一个参数都是一个SQL字符串。这些SQL字符 串可以包含一些参数,这些参数在SQL字符串中使用问号(?)作 为占位符,在SQL语句执行时将被数据替换。 7.6.2使用PreparedStatement对象 v 通过使用带参数的SQL语句可以大大提高SQL语句的灵活性。例如 : String sql = “INSERT INTO books(bookid, title, price) VALUES(?, ?, ?) “; PreparedStatement pstmt = conn. prepareStatement(sql); v SQL命令中的每个占位符都是通过它们的序号被引用,从SQL字符 串左边开始,第一个占位符的序号为1,依次类推。 v 当把预处理语句的SQL发送到数据库时,数据库将对它进行编译。 v 通过PreparedStatement接口中定义的setXXX()方法为占位符设置 具体的值。 v 例如,下面方法分别为占位符设置整数值和字符串值: public void setInt(int parameterIndex,int x) public void setString(int parameterIndex, String x) 1、设置占位符 v 对于前面的INSERT语句,我们可以使用下面的方法设置占位符的 值,最后再调用executeUpdate()方法执行该SQL语句: pstmt.setString(1,“801“); pstmt.setString(2,“Java EE 编程指南“); pstmt.setDouble(3, 49.00); pstmt.executeUpdate(); v 注意 如果在执行SQL语句之前没有设置好全部参数,驱动会抛出 一个SQLException异常。 v 可以在数据库中插入或更新复杂数据 v 例如,向表中插入日期或时间数据,可创建相应的java.sql.Date或 java.sql.Time对象,把它传给预处理语句对象的setDate()或 setTime()方法即可 String sql = “update Users set birthday=? where userid=1001”; PreparedStatement pstmt = conn. prepareStatement(sql); /假设getSqlDate()方法返回给定日期的Date对象 java.sql.Date() d=getSqlDate(“28-Apr-11”); pstmt.setDate(1,d) 2、用复杂数据设置占位符 v 设置好语句的全部参数后,应调用executeUpdate()方法: pstmt. executeUpdate(); 3、执行预处理语句 7.7 使用数据源连接数据库(自学) 7.7.1数据源与连接池介绍 7.7.2配置数据源 7.7.1数据源与连接池介绍 v 数据源(DataSource)的概念是在JDBC 2.0中引入的,是 目前在Java Web应用开发中获取数据库连接的首选方法。 v 这种方法是事先建立若干连接对象,将它们存放在数据库 连接池(connection pooling)中供数据访问组件共享。 v 使用这种技术,应用程序在启动时只需创建少量的连接对 象即可。这样就不需要为每个HTTP请求都创建一个连接对 象,这会大大降低请求的响应时间。 v javax.sql.DataSource接口对象代表数据源,通过这个接 口对象可以获得数据库连接,因此它是对DriverManager 工具的一个替代。 v 通常DataSource对象是从连接池中获得连接对象。当应用 程序需要连接对象时就从连接池中取出一个,当连接对象 使用完毕将其放回连接池,从而可以避免在每次请求连接 时都要创建

温馨提示

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

评论

0/150

提交评论