第07章JSP数据库核心技术_第1页
第07章JSP数据库核心技术_第2页
第07章JSP数据库核心技术_第3页
第07章JSP数据库核心技术_第4页
第07章JSP数据库核心技术_第5页
已阅读5页,还剩97页未读 继续免费阅读

下载本文档

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

文档简介

内容回顾 如果普通的servlet如何写 如何配置 javax servlet GenericServlet service方法web xml 如果处理http请求的servlet如何写 如何配置 javax servlet http HttpServlet doGet和doPost javax servlet ServletContext application session 内置对象 javax servlet http HttpServletResponse javax servlet http HttpServletRequest javax servlet http HttpSession 类名 request response javax servlet ServletConfig config 内容回顾 Servlet规范提供了什么组件可以用来拦截特定的请求和响应 如何实现 如何配置 servlet过滤器javax servlet Filter init doFilter destroy 方法web xml 及 内容回顾 Servlet规范提供了什么组件可以监视一些重要事件发生 提供了对那些对象的监听 如何实现 如何配置 servlet监听器servletContext HttpSession ServletRequestjavax servlet ServletContextAttributeListenerjavax servlet ServletContextListenerjavax servlet http HttpSessionAttributeListenerjavax servlet http HttpSessionListenerjavax servlet http ServletRequestAttributeListenerjavax servlet http ServletRequestListenerweb xml 第7章JSP操作数据库核心技术 7 1JDBC技术 7 2JDBC的结构 7 3JDBC核心编程接口 7 4JDBC操作数据库的步骤 7 5JDBC对事务的操作 7 6JDBC对数据库操作实例 7 7数据库连接池 7 1JDBC技术 JDBC是一套面向对象的应用程序接口 它制定了统一的访问各类关系数据库的标准接口 为各个数据库厂商提供了标准接口的实现 通过使用JDBC技术 开发人员可以用纯Java语言和标准的SQL语句编写完整的数据库应用程序 并且真正的实现了软件的跨平台型 7 1 1JDBC技术简介 JDBC概述 在JSP技术中 对数据库的操作都是通过JDBC组件完成的 JDBC在Java脚本程序和数据库之间充当了一个桥梁的作用 Java脚本程序可以通过JDBC组件向数据库发出命令 数据库管理系统获得命令后 执行请求 并将请求结果通过JDBC返回给Java程序 JDBC是Sun公司提供的一套数据库编程接口API函数 由Java语言编写的类 使用JDBC开发的程序能够自动地将SQL语句传送给相应的数据库管理系统 不但如此 使用Java编写的应用程序可以在任何支持Java的平台上运行 不必在不同的平台上编写不同的应用 Java和JDBC的结合可以让开发人员在开发数据库应用程序时真正实现 WriteOnce RunEverywhere JDBC概述 应用程序 JDBC和驱动程序之间的关系 JDBC概述 通过JDBC组件对数据库进行操作所需的类库JDBCAPI 包含在两个包里 第一个包是java sql 包含了JDBCAPI的核心类和接口 它们指定具体操作而不提供任何实现 实际的实现由第三方提供商提供 包括为DBMS 数据库管理系统 连接和存储在DBMS里的数据进行交互而提供的Java数据对象 另一个包含JDBCAPI的包是javax sql 它扩展了java sql 是J2EE JavaEE的一部分 除其他高级JDBC特性外javax sql还包含了那些与Java命名与目录接口 JNDI 进行交互Java数据对象 以及管理连接池的Java数据对象 javax sql类所在类库为rt jar 1 JDBC执行步骤 JDBC的全称为 JavaDataBaseConnectivity 它是一组使用Java语言编写的用于连接数据库的程序接口 API JDBC技术简介 1 JDBC主要完成以下4个步骤 1 与数据库建立连接 2 向数据库发送SQL语句 3 处理发送的SQL语句 4 将处理的结果进行返回 使用JDBC操作数据库如图所示 2 JDBC的优缺点 JDBC技术简介 2 JDBC优点 JDBC与ODBC十分相似 便于软件开发人员的理解 JDBC使软件开发人员从复杂的驱动程序编写工作解脱出来 可以完全专著与业务逻辑的开发 JDBC支持多种关系型数据库 这样可以增加软件的可移植性 JDBC编写接口是面向对象的 开发人员可以将常用的方法进行二次封装 从而提高代码的重用性 JDBC缺点 通过JDBC访问数据库时 实际的操作速度会降低 虽然JDBC编程接口是面向对象的 但通过JDBC访问数据库依然是面向关系的 JDBC提供了对不同厂家的产品支持 这样对数据源的操作有所影响 7 2JDBC的结构 7 2 1JDBC类型 7 2 2数据库驱动程序 JDBC类型 JDBC驱动程序之1 JDBC ODBC桥 因为微软公司推出的ODBC比JDBC出现的时间要早 所以绝大多数的数据库都可以通过ODBC来访问 当Sun公司推出JDBC的时候 为了支持更多的数据库提供了JDBC ODBC桥 利用JDBC ODBC访问数据库 需要客户的机器具有JDBC ODBC桥驱动 ODBC驱动程序和相应数据库的本地API 在JDK中 提供JDBC ODBC桥的实现类 sun jdbc odbc JdbcOdbcDriver类 这种桥机制实际上是把标准的JDBC调用转换成相应的ODBC调用 并通过ODBC库把它们发送给支持ODBC对象的数据库 如图所示 JDBC类型 JDBC驱动程序之2 本地API驱动 此驱动是将客户机上的JDBCAPI转换为数据库管理系统 DBMS 来调用 实现数据库连接 同JDBC ODBC桥驱动类型相似的是客户机必须加载某些必须的二进制代码程序 JDBC类型 JDBC驱动程序之3 网络协议驱动 此驱动程序通过网络协议进行数据库连接 首先将JDBC转换成一种网络协议 该网络协议不同与DBMS使用的交互协议 然后再将该网络协议转换为DBMS协议 网络纯Java驱动是最灵活适用的驱动程序 利用网络服务可以将Java客户机连接到多种数据库上 但是交互过程中使用的协议需要由网络服务器提供 JDBC类型 JDBC驱动程序之4 本地协议驱动 此驱动程序将JDBC调用直接转换为DBMS使用的协议 客户机可以直接调用DBMS服务器 进行数据库操作 数据库制造商提供专用的DBMS使用协议 数据库驱动程序 Access数据库的连接 Access数据库管理系统是MicrosoftOffice系统软件中的一个重要组成部分 它是一个关系型桌面数据库管理系统 可以用来建立中 小型的数据库应用系统 应用非常广泛 同时 由于Access数据库操作简单 使用方便等特点 许多小型的Web应用程序也采用Access数据库 Access数据库的驱动为 StringdriverClass sun jdbc odbc JdbcOdbcDriver 连接Access数据库需要通过JDBC ODBC方式 不需要引入任何包 连接Access数据库的URL为 Stringurl jdbc odbc driver MicrosoftAccessDriver mdb accdb DBQ 数据库名 连接数据库的基本过程 建立数据源 导入用到的包 加载驱动程序 创建与数据库的连接 创建语句对象 编写SQL语句 执行SQL语句 处理数据 关闭相关对象 处理异常 连接数据库的基本过程 建立数据源在进行数据库操作之前必须建立数据库表数据库的安装 数据库的创建 数据库表的创建和基本用法 放置JDBC驱动程序mysql connector java 5 0 8 bin jar放置办法有两种 1设置CLASSPATH环境变量 比如你放在C lib下 则CLASSPATH需要添加C lib mysql connector java 5 0 8 bin jar 2如果是Tomcat服务器 则可以放置在 Tomcat Install webapps a WEB INF lib或者 Tomcat Install lib 连接数据库的基本过程 引入java sql包 常用的几个类和接口 DriverDviverManagerConnectionStatementResultSet需要引入importjava sql 或者 连接数据库的基本过程 加载驱动程序驱动程序的作用就是把用户对数据库的访问请求转换成数据库可以理解的方式 然后把数据库的执行结果返回给用户 代码 Class forName 驱动程序名字 例 Class forName com mysql jdbc Driver 其中 Class是包java lang中的一个类 该类通过调用它的静态方法forName就可以注册驱动程序 可能发生异常 所以标准是 try Class forName com mysql jdbc Driver catch ClassNotFoundExceptione 连接数据库的基本过程 创建与数据库的连接创建连接时候需要提供的信息 数据库的位置 数据库所在的主机 所使用的端口 Oracle 1521 MicroSoftSQLServer 1433 MySQL 3306 数据库的信息 数据库的名字 用户信息 包括用户名和口令 连接到数据库 首先使用包java sql中的Connection类声明一个对象 然后再使用类DriverManager调用它的静态方法getConnection创建这个连接对象 基本格式Connectioncon DriverManager getConnection constr user pass 其中 constr是连接字符串 user是用户名 pass是口令 例Connectioncon DriverManager getConnection jdbc mysql localhost 3306 bookstore root root 如果还没为数据源设置loginname和password 则连接形式是 Connectioncon DriverManager getConnection jdbc odbc 数据源名字 Access数据库的连接 配置odbc数据源 首先在ODBC数据源管理器中打开 系统DSN 选项卡 添加数据源 假设名称为 test 并定位相应的数据库 则连接字符串为 Stringurl jdbc odbc test Access数据库的连接 不配置odbc数据源 如果不配置数据源 直接访问access数据库 则连接字符串为 Stringurl jdbc odbc jdbc odbc driver MicrosoftAccessDriver mdb accdb DBQ e test accdb 注意 Microsoft和Access之间有且只能有一个空格Access和Driver之间有且只能有一个空格Driver和 之间有且只能有一个空格 mdb 和 accdb之间有且只能有一个空格就对路径分隔符要用 连接数据库的基本过程 创建语句对象语句对象用于执行SQL语句 基本语句对象 Statementstmt con createStatement 预编译语句对象PreparedStatementstmt con prepareStatement sql 存储过程CallableStatementstmt con prepareCall sql 连接数据库的基本过程 编写SQL语句常用的SQL语句添加 insert语句 删除 delete语句 查询 select语句 修改 update语句 例 Stringsql select fromusertable 连接数据库的基本过程 执行SQL语句executeQuery Stringsql 主要用于执行有结果集返回的SQL语句 典型的就是select查询语句 有结果集返回 executeUpdate Stringsql 主要用于执行没有结果集返回的SQL语句 用于执行增删改SQL语句 方法的返回值是整数 表示影响数据库中记录的个数 例 ResultSetrs stmt execute sql 连接数据库的基本过程 处理结果集如果要查询数据 需要处理查询结果 查询的结果在结果集中保存 结果集的数据就像数据库中的表格一样 由若干行 若干列组成 使用next方法判断是否有记录使用getString等方法从结果集中取信息例 while rs next System out println rs getString 1 9 2连接数据库的基本过程 关闭相关对象需要关闭的对象包括 连接对象 语句对象 结果集对象 关闭的顺序 结果集对象 语句对象 连接对象例 rs close stmt close con close 9 2连接数据库的基本过程 异常处理可能产生的异常 驱动程序不存在 连接失败 SQL语句执行出错 处理结果集合以及关闭对象等 处理的基本方式try 正常需要执行的代码 catch Exceptione 出错后的处理代码 finally 关闭对象的代码 StringclassName com mysql jdbc Driver Stringurl jdbc mysql localhost 3306 bookstore Stringusername root Stringuserpass root StringtableName student Connectioncon null PreparedStatementpstmt null ResultSetrs null try Class forName className con DriverManager getConnection url username userpass pstmt con prepareStatement select from tableName rs pstmt executeQuery while rs next System out print rs getString i 1 System out println catch Exceptione System out println e toString finally try pstmt close catch Exceptionee try con close catch Exceptionee 7 3JDBC核心编程接口 7 3 1驱动器接口 Driver 7 3 2驱动管理类 DriverManager 7 3 3数据库连接接口 Connection 7 3 4执行静态SQL语句接口 Statement 7 3 5执行预编译的SQL语句接口 PreparedStatement 7 3 6处理存储过程语句接口 CallableStatement 7 3 7返回查询结果集接口 ResultSet JDBCAPI结构图 JDBC的主要操作类及接口 JDBC的主要操作类及接口 驱动器接口 Driver 任何一种数据库驱动程序都提供一个java sql Driver接口的驱动类 在加载某个数据库驱动程序的驱动类时 都创建自己的实例对象并向java sql DriverManage类注册该实例对象 驱动管理类 DriverManager 1 负责管理JDBC驱动程序的基本服务 作用于用户和驱动程序之间 负责追踪可用的驱动程序 并在数据库和相应驱动程序之间建立连接 另外 DriverManager类也处理驱动程序登录时间限制及登录和跟踪消息的显示等事务 1 追踪有用的驱动程序 DriverManager类中一系列驱动类通过调用DriverManager类中的registerDriver 方法进行了注册 程序员将不用直接调用DriverManager类中的registerDriver 方法 而是在加载驱动程序时 由驱动程序自动调用并加载驱动类 然后自动在DriverManager类中注册 DriverManager注册的方式有以下两种 驱动管理类 DriverManager 2 1 通过Class静态类中的forName 方法进行调用 该方法通过Java反射技术加载驱动程序类 由于与外部设置无关 因此推荐使用这种加载驱动程序的方法 代码如下 其中 db Driver 为数据库的驱动名称 Class forName db Driver 2 通过将数据库驱动名称添加到java lang System类中的jdbc drivers属性中 该方式是一个由DriverManager类加载的驱动程序类名的列表 并用冒号 分隔 在上述两种方式中 新加载的驱动类都通过调用DriverManager类中的registerDriver 方法进行自动注册 出于安全方面的因素 JDBC管理层将跟踪哪个类加载器提供哪个驱动程序 这样 当DriverManager类打开连接时 它仅使用本地文件系统或与发出连接请求的代码相同的类加载器提供的驱动程序 驱动管理类 DriverManager 3 2 建立连接 加载驱动类并在DriverManager类中注册后 即可用来与数据库建立连接 当调用DriverManager类中getConnection 方法发出连接请求时 DriverManager类将检查每个驱动程序 并查看该类是否可以建立连接 例如 通过SQLServer2000数据库的驱动和URL获取数据库的连接 Class forName com microsoft jdbc sqlserver SQLServerDriver Stringurl jdbc microsoft sqlserver localhost 1433 DatabaseName wy userInfo DriverManager getConnection url user password DriverManager类除了getConnection 方法外 还存在其他的方法 如表所示 数据库连接接口 Connection java sql Connection接口表示与特定数据库的连接 并在连接的上下文中可以执行SQL语句并返回结果 通过Connection对象可以获取一个数据库和表等数据库对象的详细信息 Connection接口中常用的方法如表所示 执行静态SQL语句接口 Statement 1 java sql Statement接口用来执行静态的SQL语句 并返回执行结果 处理静态的SQL语句主要分为3种Statement对象 Statement PreparedStatement CallableStatement 它们作为在指定连接上执行SQL语句的容器 这3种Statement对象的关系如图所示 执行静态SQL语句接口 Statement 2 1 创建Statement对象 取得数据库连接对象后 就可以通过该连接发送SQL语句 Statement对象可以通过Connection对象中的createStatement 方法进行创建 例如 Connectioncon DriverManager getConnection url sa 取得数据库连接Statementstmt con createStatement 获取Statement对象 为了执行Statement对象 被发送到数据库的SQL语句将被作为参数提供给Statement类中的指定方法 例如 通过Statement对象执行查询的SQL语句 ResultSetrs stmt executeQuery select fromwy user 执行静态SQL语句接口 Statement 3 2 使用Statement对象执行SQL语句 Statement接口提供了3种执行语句的方法 如表所示 3 SQL语句执行完成 当连接处于自动提交模式时 其中所执行的SQL语句在完成时将自动提交或还原 4 关闭Statement对象 Statement对象将由Java垃圾收集程序自动关闭 执行预编译的SQL语句接口 PreparedStatement 1 PreparedStatement接口继承并扩展了Statement接口 用来执行动态的SQL语句 PreparedStatement接口包含已编译的SQL语句 并且包含于PreparedStatement对象中的SQL语句可具有一个或多个参数 该语句为每个参数保留一个问号 作为占位符 每个问号的值必须在该语句执行之前 通过适当的setXXX 方法来提供 由于PreparedStatement对象已预编译过 所以其执行速度要快于Statement对象 作为Statement的子类 PreparedStatement除了继承Statement的所有功能外 还添加了一些方法 用于设置发送给数据库以取代参数占位符的值 同时 execute 方法 executeQuery 方法和executeUpdate 方法已被更改 从而不再需要参数 这些方法的Statement形式 接受SQL语句参数的形式 不应该用于PreparedStatement对象 执行预编译的SQL语句接口 PreparedStatement 2 1 创建PreparedStatement对象 例如 创建包含带两个参数占位符的SQL语句的PreparedStatement对象 PreparedStatementpstmt con prepareStatement UPDATEwy tableSETm WHEREx 2 传递多参数 例如 将第一个参数设为 王 第二个参数设为 毅 pstmt setString 1 王 pstmt setString 2 毅 PreparedStatement类常用传递参数的方法如表所示 执行预编译的SQL语句接口 PreparedStatement 3 执行预编译的SQL语句接口 PreparedStatement 4 3 执行预编译的SQL语句 设置完预编译的SQL语句后 就可以通过PreparedStatemen类中的方法执行该SQL语句 PreparedStatemen类执行SQL语句的方法如表所示 4 参数中数据类型的一致性 setXXX 方法中的XXX是Java类型 它是一种隐含的JDBC类型 一般SQL语句类型 因为驱动程序将把Java类型映射为相应的JDBC类型 并将该JDBC类型发送给数据库 在编写代码时要确保将每个参数的Java类型映射为与数据库所需的JDBC数据类型兼容的JDBC类型 处理存储过程语句接口 CallableStatement 1 CallableStatement对象为所有的关系性数据库提供了一种以标准形式调用已储存过程的方法 该对象可以处理两种形式的存储过程 一种形式带结果参数 另一种形式不带结果参数 结果参数是一种输出参数 是已储存过程的返回值 两种形式都可带有数量可变的输入 输出或输入和输出的参数 问号将用作参数的占位符 在JDBC中 调用存储过程的语法如下 call过程名 返回结果参数的过程的语法如下 call过程名 处理存储过程语句接口 CallableStatement 2 1 创建CallableStatement对象 CallableStatementcstmt con prepareCall callgetTestData CallableStatement对象是用Connection类中的prepareCall 方法创建 其中 存在有两个变量 不含结果参数代码设置如下 2 输入和输出参数 将输入参数传给CallableStatement对象是通过setXXX 方法完成的 如果存储过程返回的是输出参数 则在执行CallableStatement对象前必须先注册每个输出参数的JDBC类型 注册JDBC类型是用registerOutParameter 方法来完成的 语句执行完后 CallableStatement的getXXX 方法将取回参数值 例如 处理存储过程语句接口 CallableStatement 3 CallableStatementcstmt con prepareCall callgetTestData cstmt registerOutParameter 1 java sql Types TINYINT cstmt registerOutParameter 2 java sql Types DECIMAL 3 cstmt executeQuery 从第1个输出参数中取出一个Java字节bytex cstmt getByte 1 从第2个输出参数中取出一个BigDecimal对象 小数点后面带3位数 java math BigDecimaln cstmt getBigDecimal 2 3 3 执行存储过程 当设置完存储过程的参数后 就可以通过CallableStatement类中的方法执行该存储过程 CallableStatement类执行存储过程的方法如表所示 返回查询结果集接口 ResultSet 1 java sql ResultSet接口类似于一个数据表 通过该接口的实例可以获得检索结果集以及对应的数据表相关信息 Result实例通过执行查询数据库的语句生成 一个Statement对象在同一时刻只能打开一个ResultSet对象 可以通过字段的序号或者字段的名字来制定获取某个字段的值 ResultSet对象的常用方法如表所示 返回查询结果集接口 ResultSet 2 返回查询结果集接口 ResultSet 3 7 4JDBC操作数据库的步骤 7 4 1加载JDBC驱动程序 7 4 2取得数据库连接 7 4 3执行各种SQL语句 7 4 4获取查询结果 7 4 5关闭数据库连接 加载JDBC驱动程序 在连接数据库前 首先要加载要连接数据库的驱动到Java虚拟机 通过java lang Class类的静态方法forName StringclassName 实现 例如 通过构造方法加载SQLServer2000 publicclassDBConnection privatefinalStringdbDriver com microsoft jdbc sqlserver SQLServerDriver publicDBConnection try Class forName dbDriver newInstance catch ClassNotFoundExceptione 省略其他代码 取得数据库连接 通过java sql DriverManager驱动程序管理器的静态方法 getConnection Stringurl Stringuser Stringpassword 可以建立数据库连接 其中 该静态方法的的第1个参数是连接数据库url地址 第2个参数是连接数据库的名称 第3个参数是连接数据库的登录密码 使用方法如下 执行各种SQL语句 1 1 执行静态的SQL语句对象 Statement接口的executeUpdate Stringsql 方法将执行添加 insert 修改 update 和删除 delete 的SQL语句 执行成功后 将返回一个int型数值 该数值为影响数据库记录的行数 Statement接口的executeQuery Stringsql 方法将执行查询 select 语句 执行成功后 将返回一个ResultSet类型的结果集对象 该对象将存储所有满足查询条件的数据库记录 例如 intnum statement executeUpdate insertintowy tablevalues 33 添加 intnum statement executeUpdate updatewy tablesetname 修改 whereid 33 intnum statement executeUpdate deleteformwy tablewhereid 6 ResultSetrs statement executeQuery select fromwy table 注意 执行executeUpdate 方法或executeQuery Stringsql 时 会抛出SQLException类型的异常 所以需要通过try catch进行捕捉 执行各种SQL语句 2 2 执行预编译SQL语句对象 PreparedStatement接口的executeUpdate Stringsql 方法将执行添加 insert 修改 update 和删除 delete 的SQL语句 执行成功后 将返回一个int型数值 该值为影响数据库记录的行数 PreparedStatement接口的executeQuery Stringsql 方法将执行查询 select 语句 执行成功后 将返回一个ResultSet类型的结果集对象 该对象将存储所有满足查询条件的数据库记录 例如 PreparedStatementps con prepareStatement insertintowy tablevalues ps setInt 1 6 ps setString 2 添加 intnum ps executeUpdate PreparedStatementps con prepareStatement select fromwy tablewhereid ps setInt 1 6 ResultSetrs ps executeQuery 执行各种SQL语句 3 2 执行预编译SQL语句对象 使用PreparedStatement的好处 依赖于服务器对预编译查询的支持 以及驱动程序处理原始查询的效率 预备语句在性能上的优势可能有很大的不同 安全是预备语句的另外一个特点 通过HTML表单接受用户输入 然后对数据库进行更新时 一定要使用预备语句或存储过程 预备语句还能够正确地处理嵌入在字符串中的引号以及处理非字符数据 例如 向数据库发送序列化后的对象 注意 执行executeUpdate 方法或executeQuery Stringsql 时 会抛出SQLException类型的异常 所以需要通过try catch进行捕捉 执行各种SQL语句 4 3 执行数据库存储过程 CallableStatement接口的executeUpdate Stringsql 方法将执行添加 insert 修改 update 和删除 delete 的数据库的存储过程 执行成功后 将返回一个int型数值 该数值为影响数据库记录的行数 CallableStatement接口的executeQuery Stringsql 方法将执行查询数据库的存储过程 执行成功后 将返回一个ResultSet类型的结果集对象 该对象将存储所有满足查询条件的数据库记录 例如 数据库中有如下一个存储过程 CREATEPROCEDUREp insert namevarchar 20 sexchar 4 telvarchar 30 addressvarchar 50 birthdayvarchar 50 ASinsertintousers name sex tel address birthday values name sex tel address birthday GO 执行各种SQL语句 5 3 执行数据库存储过程 通过CallableStatement对象执行数据库中的该存储过程 CallableStatementcs connection prepareCall CallableStatementcs connection prepareCall callp insert cs setString 1 城中狼 cs setString 2 男 cs setString 3cs setString 4 长春市和平大街 cs setString 4 1981 01 01 intnum cs executeUpdate 注意 CallableStatement对象执行executeUpdate 方法或executeQuery Stringsql 时 会抛出SQLException类型异常 所以需要通过try catch进行捕捉 执行各种SQL语句 6 3 执行数据库存储过程 使用CallableStatement处理存储过程的优缺点 优点语法错误可以在编译时找出来 而非在运行期间 数据库存储过程的运行可能比常规的SQL查询快得多 程序员只需知道输入和输出参数 不需了解表的结构 另外 由于数据库语言能够访问数据库本地的功能 序列 触发器 多重游标等操作 因此 用它来编写存储过程可能要比使用Java编程语言要简易一些 缺点存储过程的商业逻辑在数据库服务器上运行 而非客户机或Web服务器 而行业的发展趋势是尽可能多地将商业逻辑移出数据库 将它们放在JavaBean组件 或者在大型的系统中 EnterPriseJavaBean组件 中 在Web构架上采用这种方式的主要动机是 数据库访问和网络I O常常是性能的瓶颈 获取查询结果 通过各种Statemn接口的executeUpdate 或executeQuery 方法 将执行传入的SQL语句 并返回执行结果 如果执行的executeUpdate 方法 将返回一个int型数值 该数值表示影响数据库记录的行数 如果是执行executeQuery 方法 将返回一个ResultSet类型的结果集 为所有满足查询条件的数据库记录 但是通过ResultSet对象并不只是可以获取满足查询条件的记录 还可以获得数据表的相关信息 例如每列的名称 列的数量等 关闭数据库连接 在操作完成数据库后 都要及时关闭数据库连接 释放连接占用的数据库和JDBC资源 以免影响软件的运行速度 ResultSet Statement和Connection接口均提供了关闭各自实例的close 方法 ResultSet Statement和Connection接口关闭次序如图所示 虽然Java的垃圾回收机制会定时清理缓存 关闭长时间不用的数据库连接 但是如果不及时关闭 数据库连接达到一定数量 将严重影响数据库和计算机运行速度 甚至瘫痪 7 5JDBC对事务的操作 7 5 1数据库事务的特性 7 5 2JDBC事务的流程 7 5 3JDBC对事务管理级别 7 5 4JDBC对事务的设置 数据库事务的特性 原子性 atomicity 指事务执行单元是一个不可分割的单元 这些单元要么都执行 要么都不执行 例如当我们使用银行的ATM提款机取钱时 如果出现机器卡死或者断电 那么即使已经执行了取钱操作 但是数据库中的数据不会发生改变 一致性 consistency 指无论执行了什么操作 都应保证数据的完整性和业务逻辑的一致性 例如银行系统中的取钱操作 当取钱成功时 我们得到的钱款数目要和数据库中个人账号钱款减少的数目相同 隔离性 isolation 隔离性是在事务执行过程中 每一个执行单元操作的数据都是其它单元没有操作或者操作结束后的数据 保证执行单元操作的数据都有完整的数据空间 事务的执行过程中不存在当前所处理数据正被另一个事务处理的情况 隔离性也称为事务的串行化 持久性 durability 持久性针对的是事务结束后 执行单元操纵的数据被保存在数据库中 这些数据的保存状态是永久性的 即使数据库系统崩溃 数据也不会消失 JDBC事务的流程 JDBC事务的执行流程如图7 6所示 JDBC中的事务处理有两种方式 通过Connection接口中的setAutoCommit 方法设置手动提交或者自动提交事务 自动提交事务时 每当执行一条SQL时就会提交事务 手动提交事务时 必须调用Connection接口的commit 方法才会提交事务 JDBC对事务管理级别 为了解决这些由于多个用户请求相同数据而引起的问题 事务之间必须用锁相互隔开 多数数据库支持不同类型的锁 因此 JDBC编程接口支持不同类型的事务 它们由Connection对象的setTransactionLevel 方法指定 在JDBC编程接口中获得事务级别如表所示 例如 con setTransactionLevel TRANSACTION SERIALIZABLE JDBC对事务的设置 在默认情况下 JDBC驱动程序运行在 自动提交 模式下 这样做虽然方便 但程序运行时的开销比较大 可以利用批处理操作减小这种开销 但批处理操作要求事务不能处于自动提交模式下 为此 我们首先要禁用自动提交模式 con setAutoCommit false 然后执行批处理操作 Statementstmt connection createStatement stmt addBatch insertintotbl Uservalues 城中狼1 5000 40 stmt addBatch insertintotbl Uservalues 城中狼2 1500 24 stmt addBatch insertintotbl Uservalues 城中狼3 6400 18 int updateCounts stmt executeBatch mit 7 6JDBC对数据库操作实例 7 6 1执行静态SQL语句的实例 7 6 2执行预处理SQL语句的实例 7 6 3执行存储过程的实例 7 6 4获取数据表信息 7 6 5JDBC事务的应用 执行静态SQL语句的实例 1 对用户信息表实现插入和查询操作 1 创建名称为 Users java 的文件 该文件主要用于实现对用户数据的存取操作 该类定义了数据库所有字段对应的变量及其对应的get set方法 2 创建名称为 JDBConnection java 的文件 该文件使用Statement接口实现对数据库的操作 其中执行插入操作的静态SQL语句的代码如下 对数据表的增加 修改和删除的操作publicbooleanexecuteUpdate Stringsql if con null creatConnection try Statementstmt con createStatement intiCount stmt executeUpdate sql returntrue catch SQLExceptione returnfalse 执行静态SQL语句的实例 2 3 创建名称为 index jsp 的页面文件 该页面文件用来显示查询所有用户信息的结果和增加用户的表单 其关键代码如下 执行静态SQL语句的实例 3 4 创建名称为 addUsers jsp 的页面文件 该页面文件用来处理增加用户信息的数据库操作 其关键代码如下 执行静态SQL语句的实例 4 5 程序运行结果如图所示 执行预处理SQL语句的实例 1 执行预处理SQL语句即使用PerparedStatement接口实现对用户信息的数据库插入和查询操作 只要对前面的Statement语句做相应更改即可 执行插入操作 publicbooleanexecuteUpdate Stringname Stringsex Stringtel Stringaddress Stringbirthday try Stringsql insertintousersvalues PreparedStatementpstmt con prepareStatement sql pstmt setString 1 name 对用户名的赋值pstmt setString 2 sex 对用户性别的赋值pstmt setString 3 tel 对用户联系电话的赋值pstmt setString 4 address 对用户地址的赋值pstmt setString 5 birthday 对用户出生日期的赋值pstmt executeUpdate 执行添加的SQL语句returntrue catch Exceptione returnfalse 执行预处理SQL语句的实例 2 执行查询操作 publicResultSetexecuteQuery Stringsql ResultSetrs try PreparedStatementpstmt con prepareStatement sql rs pstmt executeQuery catch Exceptione returnrs 程序运行结果如图所示 执行存储过程的实例 1 执行存储过程即使用CallableStatement接口实现对用户信息的数据库插入和查询操作 首先 在数据库中创建如下存储过程 CREATEPROCEDUREp insert namevarchar 20 sexchar 4 telvarchar 30 addressvarchar 50 birthdayvarchar 50 ASinsertintousers name sex tel address birthday values name sex tel address birthday GO CREATEPROCEDUREp selectASselect fromusers GO 插入 查询 执行存储过程的实例 2 然后 创建名称为 JDBConnection java 的文件 该文件执行数据表的添加 修改和删除的存储过程的代码如下 publicbooleanexecuteUpdate Stringname Stringsex Stringtel Stringaddress Stringbirthday try Stringsql callp insert CallableStatementcstmt con prepareCall sql cstmt setString 1 name cstmt setString 2 sex cstmt setString 3 tel cstmt setString 4 address cstmt setString 5 birthday cstmt executeUpdate returntrue catch SQLExceptione returnfalse 执行存储过程的实例 3 对存储过程的查询操作 publicResultSetexecuteQuery Stringsql ResultSetrs try Stringsql callp insert CallableStatementcstmt con prepareCall sql rs cstmt executeQuery catch Exceptione returnnull 再创建名

温馨提示

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

评论

0/150

提交评论