Java网络编程原理与JSP-Web开发核心技术--09第九章-JSP数据库编程技术新课件.ppt
Java网络编程原理与网络编程原理与JSPWeb核心核心开发技术开发技术 第九章JSP数据库编程技术n n9.1 JDBC9.1 JDBC9.1 JDBC9.1 JDBC概述概述概述概述n n9.29.29.29.2 MySQLMySQLMySQLMySQL数据库的安装与配置数据库的安装与配置数据库的安装与配置数据库的安装与配置 n n9.3 9.3 9.3 9.3 连接数据库连接数据库连接数据库连接数据库 n n9.49.49.49.4 数据库高级操作数据库高级操作数据库高级操作数据库高级操作 n n9.5 9.5 9.5 9.5 数据库连接池技术数据库连接池技术数据库连接池技术数据库连接池技术 n n9.6 9.6 9.6 9.6 应用实例应用实例应用实例应用实例 29.1 JDBC概述n9.1.1JDBC工作原理工作原理n9.1.2JDBCAPI简介简介39.1 JDBC概述n9.1.1JDBC工作原理工作原理nJava程序通过JDBCAPI来访问数据库。JDBCAPI主要位于JDK的java.sql包中,它为Java程序访问数据库提供了统一的编程接口,但对接口的具体实现需要数据库的设计者完成,JDBC的驱动器封装了与各种数据库服务器通信的细节。实现调用Java 程序JDBC API各种数据库管理系统连接JDBC 驱动器49.1 JDBC概述n9.1.1JDBC工作原理工作原理njava.sql.DriverManager类,已经由Sun公司实现,该类负责管理注册到系统中的JDBC驱动器,并能通过驱动器实现与数据库服务器建立连接。njava.sql.Driver接口,由Sun公司制定,为数据库服务提供商提供了开发JDBC驱动器的统一接口。nJDBC驱动器实现了java.sql.Driver接口,由数据库供应商创建,负责与特定的数据库建立连接,处理通信细节,Java程序要访问数据库,必须先获得相应的JDBC驱动器,并将其注册到JDBC驱动器管理器中。nJDBC驱动器可分为以下四类:nJDBC-ODBC驱动器nJDBC本地代码驱动器nJDBC网络驱动器n纯纯JDBC驱动器驱动器59.1 JDBC概述n9.1.2JDBCAPI简介简介nJDBCAPI位于java.sql包中,使用JDBC的程序要导入该包。n1Driver接口接口n由由Sun公司制定,为数据库服务提供商提供了开发公司制定,为数据库服务提供商提供了开发JDBC驱动器的统一接口,所有驱动器的统一接口,所有JDBC驱动器都必须实现该接口。使用驱动器都必须实现该接口。使用JDBC驱动器前,要将其对应的类库设置到驱动器前,要将其对应的类库设置到classpath中,然后在程序中通过中,然后在程序中通过Class.forName()方法对其加载。方法对其加载。n如果使用的是如果使用的是JDBC-ODBC的方法,则使用如下的语句:的方法,则使用如下的语句:nClass.forName(“sun.jdbc.odbc.Jdbc.OdbcDriver”);n如果使用的是如果使用的是JDBC,则使用以下的语句:,则使用以下的语句:nClass.forName(“driver_class_name”);n例如:例如:nClass.forName(“com.Microsoft.jdbc.sqlserver.SQLServerDriver”);/SQLServernClass.forName(“org.gjt.mm.mysql.Driver”);/MySQLnClass.forName(“Oracle.jdbc.driver.OracleDriver”);/Oracle69.1 JDBC概述n9.1.2JDBCAPI简介简介n2DriverManager类类n该类负责管理注册到系统中的该类负责管理注册到系统中的JDBC驱动器,已经由驱动器,已经由Sun公司实现,并能通过特定驱动器实现与数据公司实现,并能通过特定驱动器实现与数据库服务器建立连接。该类主要定义以下几个方法:库服务器建立连接。该类主要定义以下几个方法:nregisterDriver(Driverdriver):用来在:用来在DriverManager类中注册类中注册JDBC驱动器。驱动器。ngetConnection():可以创建一个数据库连接对象。:可以创建一个数据库连接对象。n例如:例如:DriverManager.getConnection(“驱动类型:数据源驱动类型:数据源”,”用户名用户名”,”密码密码”)n当驱动类型是当驱动类型是JDBC-ODBC时用时用JDBC:ODBC,如果是,如果是JDBC时就用时就用JDBC。不同数据库。不同数据库系统对应的数据源格式有所不同:系统对应的数据源格式有所不同:nDriverManager.getConnection(“jdbc:odbc:DSname”,”用户名用户名”,”密码密码”);/JDBC-ODBCnDriverManager.getConnection(“jdbc:microsoft:sqlserver:/主机主机:端口号端口号;DatabaseName=数据库名数据库名”,“用户名用户名”,“密码密码”);/SQLServernDriverManager.getConnection(“jdbc:mysql:/主机:端口号主机:端口号/数据库名数据库名”,“用户用户名名”,“密码密码”);/MySQLnDriverManager.getConnection(“jdbc:Oracle:thin:主机:端口号:数据库名主机:端口号:数据库名”,“用户名用户名”,“密码密码”);/Oracle79.1 JDBC概述n9.1.2JDBCAPI简介简介n3Connection接口接口n该接口代表与一个特定数据库的会话,即数据库的连接。通过该接口可以向数据库发送该接口代表与一个特定数据库的会话,即数据库的连接。通过该接口可以向数据库发送SQL语句并取得返回结果,该接口主要定义以下几个方法:语句并取得返回结果,该接口主要定义以下几个方法:nclose()/用来关闭数据库连接,立即释放用来关闭数据库连接,立即释放JDBC资源。资源。ngetAutoCommit()/用于获得当前自动提交状态。默认情况下,每执行一个用于获得当前自动提交状态。默认情况下,每执行一个SQL语句后,语句后,Connection会自动地提交更改。如果禁止自动提交,必须进行显式的提会自动地提交更改。如果禁止自动提交,必须进行显式的提交。交。nsetAutoCommit()/用于设置连接是否处于自动提交状态。用于设置连接是否处于自动提交状态。ncommit()/提交上一次操作后的更改,使之成为永久的更改,只有当禁止自动提提交上一次操作后的更改,使之成为永久的更改,只有当禁止自动提交时可以使用该方法。交时可以使用该方法。nrollback()/回滚从上一次操作后的所有更改。回滚从上一次操作后的所有更改。ncreateStatement()/用于创建用于创建SQL语句对象。返回的对象可用于执行基本的语句对象。返回的对象可用于执行基本的SQL语句,可以带一些参数,例如:语句,可以带一些参数,例如:nStatementstatement=connection.createStatement(intType,intconcurrency);89.1 JDBC概述n9.1.2JDBCAPI简介简介n4Statement接口接口n该接口提供了用于执行一条静态的该接口提供了用于执行一条静态的SQL语句并获取它产生的结果的方法,任何时候每条语句并获取它产生的结果的方法,任何时候每条语句仅能打开一个语句仅能打开一个ResultSet,ResultSet是语句执行后返回的记录结果集。该接口定是语句执行后返回的记录结果集。该接口定义的常用方法如下:义的常用方法如下:nexecute(Stringsql)/执行各种执行各种SQL语句。返回值布尔型,如果返回语句。返回值布尔型,如果返回true,则表,则表明有结果集,可通过明有结果集,可通过getResultSet()获得结果集。获得结果集。nexecuteQuery()/执行一条返回单个结果集的执行一条返回单个结果集的select语句,返回值是语句,返回值是ResultSet类型。类型。nexecuteUpdate()/执行执行SQL的的INSERT、UPDATE和和DELETE语句。返回受语语句。返回受语句影响的记录行数。句影响的记录行数。ngetResultSet()/获得当前的获得当前的ResultSet结果。结果。ngetUpdateCount()/获得受语句影响的记录行数,返回值是获得受语句影响的记录行数,返回值是int型数据,如果结型数据,如果结果是一个果是一个ResultSet或没有其他结果,返回或没有其他结果,返回-1。nclose()/关闭关闭Statement对象,立即释放相应对象,立即释放相应JDBC资源,同时关闭与之相关联资源,同时关闭与之相关联的的ResultSet对象。对象。99.1 JDBC概述n9.1.2JDBCAPI简介简介n5PreparedStatementn它从它从Statement继承而来,该接口提供封装一条预编译的继承而来,该接口提供封装一条预编译的SQL语句的功能,可用于高语句的功能,可用于高效地多次执行该语句,该接口定义的常用方法如下:效地多次执行该语句,该接口定义的常用方法如下:nsetBoolean()/设置布尔型参数值。设置布尔型参数值。nsetByte()/设置字节型参数值。设置字节型参数值。nsetBytes()/设置字节数组型参数值。设置字节数组型参数值。nsetDate()/设置日期型参数值。设置日期型参数值。nsetDouble()/设置双精度型参数值。设置双精度型参数值。nsetFloat()/设置单精度型参数值。设置单精度型参数值。nsetInt()/设置整型参数值。设置整型参数值。nsetShort()/设置短整型参数值。设置短整型参数值。nsetString()/设置字符串型参数值。设置字符串型参数值。nclearParameters()/立即清除当前参数值内容。立即清除当前参数值内容。109.1 JDBC概述n9.1.2JDBCAPI简介简介n6CallableStatementn继承自继承自PreparedStatement,用来执行数据库中的存储过程。,用来执行数据库中的存储过程。JDBC允许以所有允许以所有RDBMS的标准方式调用的标准方式调用存储过程,具体语法格式如下:存储过程,具体语法格式如下:n?=call?,?/包含结果参数的格式包含结果参数的格式ncall?,?/不包含结果参数的格式不包含结果参数的格式n可用可用PreparedStatement接口的接口的set方法设置方法设置IN参数值,所有参数值,所有OUT参数的类型必须在执行该存储过程之参数的类型必须在执行该存储过程之前注册,执行后的参数值用该接口提供的前注册,执行后的参数值用该接口提供的get方法可以获得,该接口定义的常用方法如下:方法可以获得,该接口定义的常用方法如下:ngetBoolean()/获得一个获得一个BIT参数的值,作为一个参数的值,作为一个boolean值返回。值返回。ngetByte()/获得一个获得一个TINYINT参数的值,作为一个参数的值,作为一个byte值返回。值返回。ngetBytes()/获得一个获得一个BINARY或或VARBINARY参数的值,作为一个参数的值,作为一个byte值返回。值返回。ngetDate()/获得一个获得一个Date参数的值,作为一个参数的值,作为一个Date值返回。值返回。ngetDouble()/获得一个获得一个double参数的值,作为一个参数的值,作为一个double值返回。值返回。ngetFloat()/获得一个获得一个float参数的值,作为一个参数的值,作为一个float值返回。值返回。ngetInt()/获得一个获得一个integer参数的值,作为一个参数的值,作为一个int值返回。值返回。ngetLong()/获得一个获得一个float参数的值,作为一个参数的值,作为一个long值返回。值返回。ngetShort()/获得一个获得一个smallint参数的值,作为一个参数的值,作为一个short值返回。值返回。ngetString()/获得一个获得一个CHAR、VARCHAR或或LONGVARCHAR参数的值,作为一个参数的值,作为一个String值返回。值返回。119.1 JDBC概述n9.1.2JDBCAPI简介简介n7ResultSet接口接口nResultSet接口用来接收执行接口用来接收执行SQL查询语句后得到的记录集,查询语句后得到的记录集,next()把当前记录指针往下移动一行时,可用把当前记录指针往下移动一行时,可用get()方方法可得到记录中不同列的数据,法可得到记录中不同列的数据,getXXXX()方法获取当前行的列值,可通过使用列的索引或名字来获取值。通常使方法获取当前行的列值,可通过使用列的索引或名字来获取值。通常使用列索引会更有效,列索引从用列索引会更有效,列索引从1开始。开始。getXXXX()方法中的列名是大小写敏感的。当使用列名执行一个方法中的列名是大小写敏感的。当使用列名执行一个getXXXX()方法时,如果几个列有同样的名字,则返回第一个匹配的列。,该接口定义的常用方法如下:方法时,如果几个列有同样的名字,则返回第一个匹配的列。,该接口定义的常用方法如下:nfirst()/当记录指针可以上下移动查询时移动当前记录指针到第一行。当记录指针可以上下移动查询时移动当前记录指针到第一行。nlast()/当记录指针可以上下移动查询时移动当前记录指针到最后一行。当记录指针可以上下移动查询时移动当前记录指针到最后一行。nnext()/把当前记录指针往下移一行。把当前记录指针往下移一行。ResultSet初始定位于它的第一行之前。如果当前行有效,返回初始定位于它的第一行之前。如果当前行有效,返回true;如果没有更多的行则返回;如果没有更多的行则返回false。nprevious()/当记录指针可以上下移动查询时把当前记录指针向上移动一行。当移动到第一行之前时返回当记录指针可以上下移动查询时把当前记录指针向上移动一行。当移动到第一行之前时返回false,否则返回,否则返回true。nisFirst()/当记录指针可以上下移动查询时判断当前记录指针是否在第一行。当记录指针可以上下移动查询时判断当前记录指针是否在第一行。nisLast()/当记录指针可以上下移动查询时判断当前记录指针是否在最后一行。当记录指针可以上下移动查询时判断当前记录指针是否在最后一行。ngetBoolean()/把当前行的列值作为一个把当前行的列值作为一个boolean值获取,如果列值为空则返回值获取,如果列值为空则返回false。ngetInt()/把当前行的列值作为一个把当前行的列值作为一个int值获取,如果列值为空则返回值获取,如果列值为空则返回0。ngetLong()/把当前行的列值作为一个把当前行的列值作为一个long值获取,如果列值为空则返回值获取,如果列值为空则返回0。ngetShort()/把当前行的列值作为一个把当前行的列值作为一个short值获取,如果列值为空则返回值获取,如果列值为空则返回0。ngetString()/把当前行的列值作为一个把当前行的列值作为一个String值获取,如果列值为空则返回值获取,如果列值为空则返回null。ngetRow()/当记录指针可以上下移动查询时返回当前记录指针所指向的行号,行号从当记录指针可以上下移动查询时返回当前记录指针所指向的行号,行号从1开始,如果记录集中开始,如果记录集中没有记录则返回没有记录则返回0。nclose()/立即释放该语句的数据库和立即释放该语句的数据库和JDBC资源。资源。129.2 MySQL数据库的安装与配置 n9.2.1安装安装MySQL5.0n9.2.2使用使用MySQL5.0139.2 MySQL数据库的安装与配置 n9.2.1安装安装MySQL5.0nMySQL是一个多用户、多线程的强壮的关系数据库服务器,MySQL的官方网站提供了免费安装软件nMySQL5.0的安装比较简单,首先从MySQL的官方网站下载软件,双击安装程序,出现安装界面,接下来:选择安装类型,确定安装目录,注册账号,选择配置方式。149.2 MySQL数据库的安装与配置 n9.2.2使用使用MySQL5.0nMySQL在安装根目录的bin子目录中提供了mysql.exe文件,它是客户程序,支持在命令行中输入SQL语句,启动时需要输入root用户的密码。n目前,有很多可视化的工具软件提供了对MySQL系统的支持,例如:MySQL-Front,它可以连接到MySQL数据库,在图形界面中进行对数据库和数据表进行操作。n安装MySQL-Front软件。n为方便以后程序的运行,我们可以通过MySQL-Front软件在MySQL数据库中创建名为shopdb的数据库,在数据库中创建books表和accounts表,并且向表中插入数据。159.3 连接数据库 n9.3.1连接数据库的一般过程连接数据库的一般过程n9.3.2使用JDBC-ODBC驱动连接Access数据库n9.3.3使用使用JDBC驱动连接驱动连接MySQL数据库数据库n9.3.4通过JSP页面连接数据库n9.3.5通过通过JavaBean连接数据库连接数据库n9.3.6通过Servlet连接数据库169.3 连接数据库 n9.3.1连接数据库的一般过程连接数据库的一般过程n1设置类路径设置类路径n获得驱动器类库,并将其设置到classpath中,对于采用JDBC-ODBC驱动的连接方式可以不用设置classpath。n2加载并注册驱动器加载并注册驱动器n在程序中引入java.sql包,接下来加载并注册驱动器,其中JDBC-ODBC在JDK中自带,默认注册。通过调用方法Class.forName()可显式地加载驱动程序类。例如:nClass.forName(“sun.jdbc.odbc.Jdbc.OdbcDriver”);/加载JDBC-ODBC驱动nClass.forName(“org.gjt.mm.mysql.Driver”);/加载MySql的JDBC驱动nDriverManager.registerDriver(neworg.gjt.mm.mysql.Driver();/注册MySql的JDBC驱动n3建立与数据库的连接建立与数据库的连接n使用DriverManager的getConnection()方法建立与数据库的连接并返回一个Connection对象引用,例如:nConnectionconn=DriverManager.getConnection(jdbc:odbc:datasource,”sa”,”sa”);nConnectionconn=DriverManager.getConnection(jdbc:mysql:/localhost:3306/shopdb,“root”,“root”);179.3 连接数据库 n9.3.1连接数据库的一般过程连接数据库的一般过程n4创建创建Statement对象对象n获得数据库连接对象后,通过该对象创建用于执行SQL语句的Statement对象,例如:nStatementstmt=conn.createStatement();nPrepareStatementpstmt=conn.prepareStatement(sql);nCallableStatementcstmt=con.prepareCall(callgetTestData(?,?);n5执行执行SQL语句语句nStringsql=selectid,bookname,publisherfrombooks;nResultSetrs=stmt.executeQuery(sql);n6遍历遍历ResultSet对象中的记录对象中的记录n例如:nwhile(rs.next()nlongid=rs.getLong(1);nStringbookname=rs.getString(2);nStringpublisher=rs.getString(3);n/打印所显示的数据nSystem.out.println(id=+id+,name=+bookname+,publisher=+publisher);n189.3 连接数据库 n9.3.2使用JDBC-ODBC驱动连接Access数据库n首先创建名为student.mdb的Access数据库,数据库中包含名为userTable的数据表,表结构描述userTable(id,name,password,address)。n接下来,通过控制面板设置ODBC数据源,具体过程为:打开“控制面板”,双击“管理工具”,双击“数据源(ODBC)”,打开“ODBC数据源管理器”对话框,在“系统DSN”选项卡中单击“添加”按钮,弹出“创建新数据源”对话框,选择“MicrosoftAccessDriver(*.mdb)”后,点击“完成”。弹出“MicrosoftODBCAccess安装”对话框,输入数据源名(例如stu),点击“选择”按钮,弹出“选择数据库”对话框,选择数据库文件后,点击“确定”后回到“MicrosoftODBCAccess安装”对话框,点击“确定”后,完成对ODBC数据源的设置。n例程例程9-2:useJdbcOdbcDriver.java199.3 连接数据库 n9.3.3使用使用JDBC驱动连接驱动连接MySQL数据库数据库n首先,下载MySQL的JDBC驱动包,并将其设置到classpath类路径中,接下来创建相应的数据库,这里使用9.2节中创建的名为shopdb的数据库。n例程例程9-3:useJdbcDriver.java209.3 连接数据库 n9.3.4通过JSP页面连接数据库n在JSP页面中通过添加用于连接数据库的Java代码即可实现对数据库的访问。n将MySQL的JDBC驱动包部署到Tomcat服务器安装目录的commonlib文件夹即可部署并访问例程9-4。n例程例程9-4:jspJdbc.jsp219.3 连接数据库 n9.3.5通过通过JavaBean连接数据库连接数据库n在JSP页面中嵌入用来连接数据库的Java代码,这种编程模式可维护性较差,无法实现代码的可重用性,我们可以将访问数据库的代码写到JavaBean中或Servlet中,这样,既容易对页面进行维护,又可以实现代码的重用性。例程9-5将对数据库的连接与操作定义到JavaBean中。n例程例程9-5:ConnectionBean.javan使用例程9-5前应该先创建数据库,并将MySQL的JDBC驱动器部署到Tomcat服务器。例程9-6对例程9-5中定义的JavaBean进行引用。n例程例程9-6:useConnectionBean.jsp229.3 连接数据库 n9.3.5通过通过JavaBean连接数据库连接数据库n例程9-5将访问数据库所需要的参数都写在程序中,而在实际应用中,为了增强程序的灵活性,我们可以将参数存储在单独的一个配置文件中,JavaBean执行时可以从配置文件中获取参数。例程9-7中存储了与数据库建立连接相关的参数。n例程例程9-7:property.confn例程9-8中定义一个工具类,用来读取配置文件中的参数并将参数存储到一个Properties对象中,可以按参数名从Properties中获取相应参数值,可以通过获取的参数来实现数据库连接的建立。n例程例程9-8:GetConnection.javan对例程9-8进行编译并部署,例程9-9可通过例程9-8建立数据库连接。n例程例程9-9:UseGetConnectionBean.jsp239.3 连接数据库 n9.3.6通过Servlet连接数据库n我们可以将对数据库的操作封装到Servlet中,在实际应用中为了增强灵活性,一般将建立数据库连接所需要的参数以初始化参数的形式配置到web.xml中,这样Servlet可以方便地对参数进行获取。例程9-10用来实现建立数据库连接,并进行相应的操作,其中连接数据库所需要的参数可以从Servlet配置信息中获取。n例程例程9-10:ConnectionServlet.javan对例程对例程9-10进行编译并部署后,在服务器的进行编译并部署后,在服务器的web.xml中对中对ConnectionServlet进行配置进行配置n例程9-11用来向Servlet提交请求,要求按图书名查询图书信息。n例程例程9-11:ConnectionServletTest.html24nn配置ConnectionServlet的初始化参数nConnectionServletnConnectionServletnConnectionServletnndrivernorg.gjt.mm.mysql.Drivernnnurlnjdbc:mysql:/localhost:3306/shopdbnnnusernamenrootnnnpasswordnrootnnnnConnectionServletn/ConnectionServletn259.4 数据库高级操作 n9.4.1使用存储过程使用存储过程n9.4.2事务操作n9.4.3操作二进制数据操作二进制数据269.4 数据库高级操作 n9.4.1使用存储过程使用存储过程n存储过程是定义在数据库管理系统服务器上的一组经过预编译的SQL语句集合,由数据库管理系统管理控制,由服务器直接执行。由于存储过程是预编译的,能够节约SQL语句的编译时间,同时可以减少网络的数据传输量。nCallableStatement接口用来执行数据库中的存储过程,由Connection对象的prepareCall()创建。从PreparedStatement接口中继承了用于处理IN参数的方法,还增加了用于处理OUT参数和INOUT参数的方法。n调用存储过程一般有两种形式:一种形式带结果参数,另一种形式不带结果参数。结果参数是一种输出(OUT)参数,是储存过程的返回值。两种形式都可带有数量可变的输入(IN参数)、输出(OUT参数)或输入和输出(INOUT参数)的参数。问号将用作参数的占位符。n在JDBC中调用储存过程的语法如下所示(方括号表示其间的内容是可选项)。ncall过程名(?,?,.)/调用无返回结果参数的存储过程n?=call过程名(?,?,.)/调用有返回结果参数的存储过程ncall过程名/调用不带参数的存储过程n例如,下例创建CallableStatement的实例,其中含有对储存过程getTestData调用。该过程有两个变量,但不含结果参数。nCallableStatementcstmt=con.prepareCall(callgetTestData(?,?);n其中?占位符的类型(IN、OUT还是INOUT参数),取决于储存过程getTestData的定义。279.4 数据库高级操作 n9.4.1使用存储过程使用存储过程n将IN参数传给CallableStatement对象是通过setXXX方法完成的,传入参数的类型决定了所用的setXXX方法(例如,用setFloat()来传入float值等)。n如果储存过程返回OUT参数,则在执行CallableStatement对象以前必须先注册每个OUT参数的JDBC类型,注册JDBC类型是用registerOutParameter()方法来完成的。n语句执行完后,CallableStatement的getXXX方法可以取回参数值。n既支持输入又接受输出的参数(INOUT参数)除了调用registerOutParameter()方法外,还要求调用适当的setXXX()方法。setXXX()方法将参数值设置为输入参数,而registerOutParameter()方法将它的JDBC类型注册为输出参数。n下面介绍如何在Java程序中调用数据库服务器端的存储过程。n首先在MySQL的shopdb数据库中创建如下的存储过程,创建语句如下:nCREATEPROCEDUREdemo_procedure(INparam1varchar(20),INparam2varchar(20),INparam3float(2)nBEGINninsertintobooks(bookname,publisher,price)values(param1,param2,param3);nEND;n例程例程9-12:ProcedureDemo.jsp289.4 数据库高级操作 n9.4.2事务操作n事务是构成单一逻辑工作单元的操作集合,表现为一组SQL语句,是一个独立的运行处理单元,其中的若干个操作,要么全都做,要么全都不做。如果事务中的所有操作成功则永久保存更新数据,如果失败则回滚到执行事务前的初始状态。n数据库系统支持两种事务模式:一是自动提交,即每个语句是一个事务;二是手工提交,即指定事务边界。JDBC中默认的方式是自动提交的方式,用setAutoCommit()方法可以设定是否自动提交。Java中用Connection对象的commit()方法提交事务,用rollback()方法回滚事务。回滚事务就是把事务中已做的操作取消,恢复到事务操作前的数据库的状态。例程9-13用来实现数据库的事务控制。n例程例程9-13:TransactionDemo.jsp299.4 数据库高级操作 n9.4.3操作二进制数据操作二进制数据n在数据库编程中,往往需要把二进制数据保存到数据库,MySQL使用Blob类型来表示。在JDBC中操作二进制对象和其他数据类型有所不同,二进制对象通常使用输入、输出流的方式来写入和读取。nPreparedStatement的setBinaryStream()方法可以向数据库中写入Blob类型的数据。要读取数据库中的Blob类型数据,可以先通过ResultSet对象的getBlob()方法返回一个Blob对象,然后,调用Blob对象的getBinaryStream()获得一个输入流,最后,通过这个输入流将Blob数据读取到内存中。例程9-14用来向shopdb数据库中accounts数据表中保存Blob类型数据,然后从中读取Blob数据。n例程例程9-14:ProcessBlobData.java309.5 数据库连接池技术 n9.5.1连接池与数据源概述连接池与数据源概述n9.5.2使用连接池连接MySQL数据库319.5 数据库连接池技术 n9.5.1连接池与数据源概述连接池与数据源概述n建立和销毁数据库连接需要浪费大量的系统时间,消耗大量的系统资源。数据库连接池的基本实现原理是,事先在连接池中建立一定数量的数据库连接,当Java程序需要一个连接时,可以从连接池获取一个空闲的连接,当Java程序使用完连接时,再将其放回连接池。n数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为释放数据库连接而引起的数据库连接遗漏。n例程9-15实现了一个能够取出、释放和关闭连接的数据库连接池。n例程例程9-15:ConnectionPool.javan例程9-16对例程9-15中定义的数据库连接池进行使用。n例程例程9-16:UseConnectionPool.java329.5 数据库连接池技术 n9.5.2使用连接池连接MySQL数据库nTomcat5.5和和MySQL5.0为例,介绍如何在服务器端配置数据源。为例,介绍如何在服务器端配置数据源。n首先,打开首先,打开Tomcat5.5confserver.xml文件,在文件,在标记前添加标记前添加标记对。配置时要指定数据库驱动程序的类、连接数据库的标记对。配置时要指定数据库驱动程序的类、连接数据库的URL、连接数据库的用户名和密码等信息。连接数据库的用户名和密码等信息。n其次,在其次,在Tomcat5.5confCatalinalocalhost中创建中创建ROOT.xml文件,其文件,其名字与名字与Web应用站点工作目录名相一致,并在其中配置应用站点工作目录名相一致,并在其中配置标记,其标记,其内容与在内容与在server.xml文件配置的内容相一致,如例程文件配置的内容相一致,如例程9-17所示。所示。n例程例程9-17:ROOT.xmln最后,将MySQL5.0数据库的驱动程序包部署到Tomcat5.5commonlib中。例程9-18可以对前面配置的数据源进行查找并返回一个数据库连接。n例程例程9-18:UseDataSource.jsp339.6 应用实例 n9.6.1实现分页显示实现分页显示n在数据库的查询操作中,当查询结果较多时,可以用数据分页的方法显示数据。下面通过实例介绍如何采用JSP+JavaBean的方式来实现数据的分页显示。n首先编写例程9-19所示的一个用来实现数据库操作的JavaBean。n例程例程9-19:PageBean.javan例程例程9-20通过对例程通过对例程9-19中定义的中定义的JavaBean进行引用来实现分页显示。进行引用来实现分页显示。n例程例程9-20:pagebean.jsp34习题1.简述JDBC的工作原理。2.简述连接数据库的一般过程。3.练习安装MySQL5.0和MySQLFront软件,创建名为userdb的数据库,在数据库中创建名为usertable的数据表,数据表结构为:usertable(id(autoinc),username(varchar),password(varchar),birth(date)。修改例程9-3,使其能对userdb进行访问。4.创建名为userdb.mdb的Access数据库,在数据库中创建名为usertable的数据表,数据表结构为:usertable(id(autoinc),username(varchar),password(varchar),birth(date)。为userdb.mdb创建名为user的ODBC数据源,修改例程9-2,使其能对ODBC数据源进行访问。5.练习使用JDBC驱动方式连接其他数据库系统,例如:MSSQLServet、Oracle、DB2等。6.修改例程9-4,使其能对userdb数据库进行访问。7.修改例程9-5和例程9-6,使其能对userdb数据库进行访问。8.修改例程9-10和例程9-11,使其能对userdb数据库进行访问。9.按照9.5.2节的操作过程,修改例程9-17和例程9-18,使其能通过数据源实现对userdb数据库的访问。10.简述使用存储过程实现数据库操作的一般过程。11.简述如何通过事务控制保证数据库操作的原子性。12.简述使用数据库连接池对系统性能有何影响。35在线教务辅导网:在线教务辅导网:http:/ 更多课程配套课件资源请访问在线教务辅导网更多课程配套课件资源请访问在线教务辅导网363738394041馋死42434445464748495051525354P P T研 究 院PO W E R PO I N T A C A D E M Y555657