已阅读5页,还剩35页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章 java编程基础第八章 JDBC核心技术基础本章主要内容包括:40 JDBC简介 JDBC核心技术 使用JDBC操作MySQL 数据库连接池 数据库访问的优化 疑难问题解答数据库开发在目前的Web应用中占据这十分重要的地位,几乎所有的应用系统都需要数据库的支持。JDBC是Java提供的数据库操作API,通过这些API可以非常方便的操作各种数据库,而且平台独立,同样的数据库操作代码可以非常方便的使用到不同的数据库中。在本章的内容中,首先简单介绍JDBC的概念,然后讲解JDBC中的核心对象,接着介绍在JSP中通过JDBC实现数据的增删改查以及事务处理,在讲解如何在开发中使用连接池,最后介绍数据库访问优化的方法。2.1 JDBC 简介JDBC是java语言的数据库操作API,用户可以通道JDBC的接口方便的实现与数据库系统的交互,而不需要知道具体实现。本节将简要介绍JDBC的一些基础概念, JDBC的发展以及其特点。以便读者对JDBC有一个基本的了解。2.1.1 JDBC 概述JDBC,全称为Java DataBase Connectivity standard,是一个面向对象的应用程序接口(API),目前最新的规范是4.0。JDBC也是java核心类库的一部分,用户可以通过JDBC来与数据库交互。JDBC API是一种成熟的技术,最早发布是1997年1月。在最初的版本中,JDBC API着重提供一个对SQL数据库的基本调用级接口。之后,JDBC 2.1规范和2.0可选包规范拓宽了API的范围。包括支持更高级应用和管理使用JDBC API来增强其应用的应用服务所需的各项特征。JDBC 3.0规范以填补较小范围内的功能缺失为目标。JDBC 4.0规范实现了确保开发者在JAVA平台使用SQL开发的易用性,以及提供了企业级特性的JDBC工具集和API来管理JDBC资源。2.1.2 JDBC特点JDBC的最大特点是它独立于具体的关系数据库。与ODBC (Open Database Connectivity)类似, JDBC API 中定义了一些Java类分别用来表示与数据库的连接(connections), SQL语句(SQL statements), 结果集(result sets)以及其它的数据库对象, 使得Java程序能方便地与数据库交互并处理所得的结果。使用JDBC, 所有Java程序(包括Java applications , applets和servlet )都能通过SQL语句或存储在数据库中的过程(stored procedures)来存取数据库。8.2 JDBC核心技术 JDBC是一个面向对象的应用程序接口(API),他的所有的功能都是封装在对象中的。程序开发中最常用到的对象是Connection数据库链接对象,Statement对象和ResultSet结果集对象。下面将简要介绍这三个对象的作用。8.2.1 Connection对象Connection对象代表与数据库的连接。当用户与数据库交互的时候,首先必须建立一个数据库链接,只有在获得链接之后,才能进行进一步的操作,比如获取一个获取数据表的数据或者是执行一个存储过程等等。在JDBC中代表这个链接的就是这个Connection对象,它是用户与数据库之间的桥梁。8.2.2 Statement对象Statement对象用于执行静态 SQL 语句并返回它所生成结果的对象。通常Statement对象可以通过Connection对象的createStatement()方法。Statement对象只能执行静态sql语句。不能可以执行动态的sql(sql串中有参数),执行动态sql使用PreparedStatement对象,用法和Statement类似。8.2.3 ResultSet对象ResultSet对象是结果集对象。当程序执行一条用于查询功能的sql语句(select)后,JDBC会把数据库的查询结果封装成一个ResultSet对象返回给程序。ResultSet 对象具有指向其当前数据行的指针,用户可以移动该指针读取ResultSet中的不同记录。另外ResultSet对象还封装了一些关于结果集表的列名、数据类型等信息,这些信息一般可以通过ResultSetMetaData对象来读取。8.3 JSP 数据库操作 只要读者有一点SQL基础,那么在JSP中使用JDBC操作数据库十分简单,本小节将以MySQL作为数据库系统,讲解在JSP中如何运用JDBC实现简单的数据库操作包括数据的增删改查,事务的运用以及如何调用存储过程。本小节要求读者具备一定的SQL基础,如果读者以前没有接触过SQL,那么SQL语法方面请读者参考其他的专业书籍。8.3.1 添加JDBC的MySQL驱动类JSP连接MySQL数据库的时候,需要MySQL的JDBC数据库驱动。在JSP中我们使用JDBC与数据库进行交互,而数据库驱动是JDBC与数据库之间的桥梁,也就是所正真操作数据库的是数据库驱动程序,而JDBC只不过是调用数据库驱动程序而已。MySQL的驱动程序名为MySQL Connector/J,读者可以在/downloads/connector/j/5.1.html上下载最新版本的JDBC驱动5.1,点击左侧的目录可以找到的各个版本的JDBC驱动程序。与MySQL5.0版本配套的JDBC驱动的版本是5.0,这个驱动无需安装,直接解压下载下来的文件,拷贝到应用项目的/WEB-INF/lib目录中,就可以在JSP中同通过这个JDBC驱动连接MySQL数据库。8.3.2 JSP插入数据操作在讲解在JSP中使用JDBC操作数据库前,先通过SQLyog在MySQL中的自带数据库“test”中创建一个数据表“persons”,用来在下面实例中使用。“persons”的表结构如下:create table persons (id double ,name varchar (300),age double ,sex varchar (10);“id”是主键用于表示用户,“name”是用户名,“age”是用户年龄,“sex”用户的性别。在前面小节中曾经提到过,在执行数据的操作时之前,首先要建立与数据库的连接,然后把SQL语句传递到数据库中,通过SQL语句来操作数据库中的数据。在下面的实例程序8.1中,将向persons表中插入一条记录,具体代码如下:/文件名:Insert.jsp源码位置:光盘/charpt8/Insert.jsp JSP插入数据操作示例 上面的程序实现了向“persons”表中插入一条用户的记录,下面笔者将详细解释这段程序的关键语句。Class.forName(com.mysql.jdbc.Driver).newInstance();在前面小节中曾经提高过数据库驱动的概念,上边这条语句的作用就是把MySQL的JDBC驱动加载到内存中。只有加载了数据库驱动以后,我们才能通过JDBC操作数据库。加载完驱动后,接下需要做得是连接数据库。MySQL通过一个URL字符串来连接数据库。连接字符串的信息如下语句所示。 String url = jdbc:mysql:/localhost:3306/test? +useUnicode=true&characterEncoding=GBK;这里是使用JDBC连接MySQL,所以必须以“jdbc:mysql”开头。后面接着的是数据库服务器的地址和端口,本地地址可以使用“localhost”,MySQL的默认端口是“3306”。接着是写明需要连接的是哪个数据库,这里使用“test”数据库。必须的URL字符串的必选项就这么多。后面的“useUnicode=true&characterEncoding=GBK”是解决MySQL的中文乱码时使用的,这里设置Mysql数据库编码字符格式为GBK。设置完URL字符串后就可以获取数据库连接了,这里只用如下代码conn = DriverManager.getConnection(url, user, password);获取数据库连接使用DriverManager类的getConnection方法。参数url就是上边的连接串,user就是使用的数据库用户,password是该用户的密码。getConnection方法有很多重载版本,比如可以把“user”、“password”拼接在“url”字符串中,使用getConnection(url)版本获取数据库连接。具体使用哪个重载版本,读者可以根据自己的爱好决定。获得连接之后,可以在这个连接的基础上,可以执行各种数据库操作。在8.2小节中提到过在JDBC中,提交数据库执行的对象是Statement。这里通过如下语句获得。stat = conn.createStatement();一般Statement对象都是通过数据库连接的createStatement方法获得的。有了Statement对象之后,就可以通过它执行各种数据库操作了。接着定义一条插入数据的SQL语句,内容如下。String sql = insert into persons (name,age,sex) values(张三,23,男);这条SQL语句实现的功能是向表“persons”中插入一条记录。该记录的“name”、“age”、“sex”字段对应的值分别是“张三”、“23”、“男”。执行数据库操作使用Statement对象的Excute之类的方法。这里使用executeUpdate方法,代码如下。stat.executeUpdate(sql)参数“sql”是需要数据库执行的SQL语句。executeUpdate方法用来执行“update”、“delete”的SQL语句,该法返回此次操作影响的行数,即修改的行数或是删除的行数。经过这几步操作,完成了数据库的插入操作,但是一些资源还没有释放,比如Statement对象、connection对象。通过close方法关闭这些对象,释放资源,代码如下所示。 stat.close(); conn.close();尤其是connection对象,打开后一定要关闭,否则会造成数据库连接耗尽。关闭connection对象时,如果与该连接关联的Statement对象没有关闭,那么该Statement对象也会被自动关闭。运行上边的程序,如果插入操作成功,会返回“数据插入操作成功!”。运行结果如图8.1所示。图8.1 JSP插入数据成功页面通过SQLyog可以查询“persons”表的数据如图8.2所示。图8.2 “persons”表的数据视图如图8.2所示,程序中的数据成功的插入了“persons”表中。8.3.3 JSP更新数据操作在JSP中更新数据的操作步骤和插入数据的步骤相似,不同的只是SQL语句,以下实例程序8.2实现的是把实例8.1中插入的数据的“age”字段从“23”修改为“25”。具体代码如下。/文件名:Update.jsp源码位置:光盘/charpt8/Update.jsp JSP更新数据操作示例 上边的程序和实例8.1相比没有新的知识点。这里笔者还是强调一点:connection对象打开后,一定要调用close方法把它关闭。否则会造成因为数据库连接数耗尽时,而是系统不能访问。实例8.2的运行结果如图8.3所示。图8.3 修改数据成功页面原来“persons”表的数据如图8.2所示,运行实例8.2后,“persons”表的数据如图8.4所示。图8.4 修改后的“persons”表数据和图8.2比较,可以发现原来“age”字段的值为“23”,现在已经改为“25”了。8.3.4 JSP删除数据操作在JSP中删除数据的操作步骤和插入、修改数据的步骤相似,不同的只是SQL语句,以下实例程序8.3实现的是把“persons”表中“name”字段的值为“张三”的行都删除。具体代码如下。/文件名:Delete.jsp源码位置:光盘/charpt8/Delete.jsp JSP删除数据操作示例 上边的程序和实例8.1、8.2相比没有新的知识点。笔者在这里就不再赘述了。实例8.3的运行结果如图8.5所示。图8.5 删除数据“张三”的成功页面运行实例8.3后,“persons”表的数据如图8.6所示。图8.6 删除数据“张三”后“persons”表数据如图8.6所示,“name”字段的值为“张三”的数据已经都删除了。 通过上边的实例8.1、8.2和8.3,已经演示了数据的增、删、改。这些操作的步骤都十分相似,下一下节中讲述的是查(select)操作。与前面的相比,select操作的差异很大。8.3.5 JSP查询数据操作在数据库的查询(select)操作是日常开发中使用最平凡的,与插入(insert)、更新(update)和删除(delete)操作相比,查询操作在返回的结果集处理上要复杂的多。查询操作返回的结果是ResultSet结果集对象,可以在程序中取出并展示结果集中的数据。在下面的实例程序8.4中,将演示JSP中的查询(select)操作。具体代码操作方法如下。/文件名:Select.jsp源码位置:光盘/charpt8/Select.jsp JSP查询数据操作示例 编号 姓名 年龄 性别 观察上边的程序,与实例8.1、8.2相比,程序在创建Statement对象之前,都是一样的。笔者在此重点解释程序在创建Statement对象之后的一些关键语句。执行查询操作使用Statement对象的executeQuery方法,代码如下 rs = stat.executeQuery(sql);可以看到Statement对象执行查询的操作和执行插入操作调用的方法是不同的。参数“sql”是查询的SQL语句,executeQuery方法返回结果集ResultSet对象。通过该对象的接口可以方便的取出其中的返回结果。具体代码如下 % 在8.2.3小节中曾经讲述过ResultSet对象有一个指向当前行的指针,上边代码中的“rs.next()”就是把该指针移到下一行记录。如果没有下一条记录,即当前行是最后一条记录,那么该方法返回“false”。在上面这段代码中,通过“next()”方法循环取出ResultSet结果集对象中的数据,并把数据填充到表格中。rs.getInt(id)取出结果集中的id字段的值,rs.getString(name)取出结果集中的name字段,从中可以看出,取对应字段值的时候要注意字段的数据类型,只能用相同数据类型的方法来取字段的值。ResultSet对象和Connection对象一样,也是数据库资源的一种。当使用完ResultSet对象后需要及时释放,可以使用下面的代码释放ResultSet对象。 if(rs != null) rs.close(); 实例8.4的运行结果如图8.7所示图8.7 查询数据的结果页面此时的“persons”表的数据如下图8.8所示。图8.8 查询数据操作时的“persons”表数据如图8.8所示,我们可以看到实例8.4取出了正确的结果。8.3.6 JSP事务处理数据库事务是指作为单个逻辑工作单元执行的一系列操作。作为同一个事务中的各个逻辑单元要么都成功执行,要么都全部回滚。在数据库操作中,事务处理是经常用到的,通过下面的例子,可以很好的帮助读者理解事务的概念及其应用环境。例如在银行的业务中,甲方给乙方账户转账10万人民币,首先要从甲方的账户减去10万,然后再给乙方的账户增加10万,整个操作过程是一个整体,这就是一个简单的事务,在这个事务中必须保证操作的完整性,两步操作要么全执行,如果其中一步出错全都不执行,从而保证这个业务的正确性和完整性。在JDBC中也支持事务的操作,一般情况下,事务的操作需要进行下面三步操作。l 把数据库连接对象的自动提交SQL操作的属性关闭。l 执行一系列数据库操作,如果成功就提交事务。l 如果事务中的操作没有全部成功,就回滚整个事务。在下面的实例8.5程序中,将展示一个简单的事务处理过程,具体处理方法如下。/文件名:Transaction.jsp源码位置:光盘/charpt8/Transaction.jsp JSP数据库操作事务处理示例 上边程序实现了一个简介的事务处理,在事务中主要分为两步操作,一步是插入一条关于“李四”的信息,另一步是修改“张三”的年龄信息。在此笔者重点讲述运用JDBC实现事务的基本流程。关于程序中如何获取连接等等相关知识,已经在前面小节介绍过,这里就不再重点的讲述。实现事务的第一步是需要把connection对象的自动提交(默认),改为手动提交。通过如下代码实现。 conn.setAutoCommit(false);如上语句所示,设置connection对象的提交方式通过调用connection对象的setAutoCommit方法,如果参数值为“false”则表示手动提交,相反值为“true”则表示自动提交。设置完connection对象的提交方式后,就可以执行事务中的数据库操作了,一下代码是实例8.5中的第一步数据库操作。 /处理第一次SQL操作 stat = conn.createStatement(); String insertSql = insert into persons (name,age,sex) values(李四,23,男); stat.execute(insertSql);上边代码实现了一次插入数据的操作,和实例8.1中的代码相似,首先获取一个Statement对象,其次定义一个SQL语句,最后通过Statement对象的executeUpdate方法执行插入操作。一下代码是事务处理中的第二次数据库操作。 /处理第二次SQL操作 String updateSql = update persons set age=35 where name=张三; stat.execute(updateSql);上边的语句是修改数据库中关于“张三”的年龄自动的信息。具体代码和上边的类似,笔者不再赘述。在处理完了事务中的所有数据库操作后,由于设置了connection对象为手动提交,所以需要自己提交事务中的数据库操作。具体代码如下。mit();conn.setAutoCommit(true);在上面的代码中,执行提交操作是是用commit方法。调用setAutoCommit方法是将connection对象设置为自动提交。因为在一般的业务处理中,处理完了事务后,还会有其他的数据库操作,一般情况下这些操作都是自动提交的。当然读者可以根据业务的具体要求进行灵活选择。在上面的两个事务操作都没有错误的时候,整个事务顺利完成,并且把数据库操作的结果最终写入数据库。但是如果执行其中的一个操作时出现了异常,那么必须使事务回滚。具体代码如下。 conn.rollback();如上代码所示,当事务中的任何一个数据库操作有错误发生的时候,通过调用connection对象的rollback方法,撤销事务中的所有的数据库操作。从而把数据库恢复到整个事务执行以前的状态,从而保证了事务的完整性。以下是实例8.5的运行结果,如图8.9所示图8.9 事务处理成功页面运行实例8.5前的数据库表“persons”的数据内容如图8.10所示。图8.10 事务运行前 “persons” 表数据在实例8.5运行后,数据库表“persons”的数据内容如图8.11所示。图8.11 事务运行后 “persons” 表数据把图8.10和图8.11中的数据作对比,我们可以看到,实例8.5中的事务运行成功。如果把实例8.5中事务的第二次的数据库操作的SQL语句改为String updateSql = update persons set age=不是数字 where name=张三;运行实例8.5时,事务执行会失败。因为“age”字段的数据类型是“int”型。根据事务的完整型要求,数据库会执行回滚。所以“李四”的信息也没有插入数据库。读者可以尝试一下,这样更能理解数据库中的事务机制。注意:在执行事务操作之前必须设置connection对象的自动提交为false。8.4 数据库连接池在大量数据库访问的应用系统中,数据库处理的速度往往会成为系统性能的瓶颈,数据库资源的处理不当往往会给系统的性能带来很大的影响,严重的情况下甚至可以导致整个系统的瘫痪,在本节的内容中将会详细介绍数据库资源的利用问题。8.4.1 数据库开发中面临的问题在数据库应用程序的开发中,经常会遇到数据库资源的问题,一般情况下有一下几种情况。(1)普通的JDBC连接带来的效率问题在使用普通的JDBC连接数据库的时候,一般情况下需要这样三个步骤:建立数据库链接、操作数据库、释放数据库资源。在这三个步骤中,建立和释放数据库连接所花费的时间要远远大于数据库操作的时间,也就是说,在我们的数据库操作中,大部分的时间都花在建立、释放数据库连接上面,真正用来执行操作的时间并不多。在没有使用连接池的时候,每一次的数据库操作就需要建立一个新的数据库连接,在需要大量数据库操作的应用系统中,就需要反复建立释放数据库连接,这样的操作方法会大大降低系统的效率,大量的时间浪费在建立和释放数据库连接上面。(2)数据库资源使用不当带来的性能问题在上面的问题中,仅仅是浪费点时间,从而降低了系统的效率,但是当数据库资源使用不当的时候,就会带来更加严重的性能问题,严重的时候可以造成整个系统的崩溃,在上面重复过多次,在操作数据库的时候一定要注意释放资源,例如数据库连接Connection对象、Statement对象、ResultSet对象,当大量的数据库资源得不到释放的情况下,新的数据库连接申请就有可能不能成功,从而使系统的功能无法实现。当数据库连接数达到上限的时候,就会造成应用系统的崩溃。解决上面这两种问题就需要使用数据库连接池的技术,通过连接池来维护同数据库之间的连接,从而 提高数据库操作的效率。在接下来的内容种将详细介绍数据库连接池的相关知识。8.4.2 数据库连接池的工作原理数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。在实现上,数据库连接池就是在系统初始化的时候,在内存中建立起一定数量的数据库。然后通过连接的释放和申请策略,保证在连接池中总是有一定数量可用的连接,从而避免了直接建立、关闭数据库连接带来的性能问题。8.4.3 常用的数据库连接池介绍在实际的开发中,可以选择自己实现一个连接池,但是一般情况下我们会选择第三方提供的程序的连接池产品。目前有很多成熟的连接池可以选择,在此笔者简要介绍其中的三种分别是DBCP、C3P0和Proxool。DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池。在Tomcat中已经集成了DBCP连接池,而且在DBCP中还可以对数据库的连接进行跟踪,可以检测并回收没有被正确释放的数据库资源,在本书中采用Tomcat作为JSP的服务器,所以可以直接在JSP中使用DBCP连接池的功能。C3P0是一个开放源代码的JDBC连接池,在Hibernate中自带的数据库连接池就是C3P0,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。Proxool是一个Java SQL Driver驱动程序,提供了对其它类型的驱动程序的连接池封装,而且Proxool可以非常简单的移植到现存的代码中,它的配置方法非常简单,可以透明地为现存的JDBC驱动程序增加连接池功能。上面这些连接池的实现都可以非常方便的调用,由于Tomcat中集成了DBCP,所以在本书中将采用DBCP实现连接池的功能。8.4.4 在Tomcat中配置连接池在Tomcat中配置DBCP数据库连接池的方法有很多,这里提供两种
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 宜宾事业编招聘2025年考试真题及答案解析
- 2025年二级建造师考试通关提分题库一套附答案详解
- 2025年安全员B证考试试卷(模拟题)附答案详解
- 上海市浦东新区卫生健康系统招聘试题及答案解析
- 2025年机械员之机械员基础知识能力检测试卷A卷附答案
- 大学生简历自荐信300字
- 建筑设计师建筑设计原理考试试题及答案解析
- 成本会计中央电大期末试题及答案
- 课件十分钟安全教育
- 执业药师考试历真题汇编及答案解析
- 2025年深圳市网格员招聘笔试题库及答案解析
- 2025年甘肃省武威市凉州区金山镇选聘专业化管理大学生村文书考试笔试备考试题及答案解析
- DB44∕T 2604-2025 城镇污水处理能源消耗限额
- 2025至2030中国养老地产行业项目调研及市场前景预测评估报告
- 2025年安康杯知识竞赛试题及答案
- 吊绳的施工方案
- 上海财经大学:低空+发展研究报告(2025年)
- (人教2024版)数学三年级上册第5单元《线和角》大单元教学设计(新教材)
- 2025年事业单位公共基础知识考试复习题库及答案
- 别墅设计平面介绍
- DB33-T 1455-2025 涉企增值服务工作指南
评论
0/150
提交评论