《Java程序设计教程》课件第十四章:JDBC与MySQL编程_第1页
《Java程序设计教程》课件第十四章:JDBC与MySQL编程_第2页
《Java程序设计教程》课件第十四章:JDBC与MySQL编程_第3页
《Java程序设计教程》课件第十四章:JDBC与MySQL编程_第4页
《Java程序设计教程》课件第十四章:JDBC与MySQL编程_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

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

文档简介

本章学习目标:●

了解JDBC概念以及驱动类型●

掌握使用JDBC连接MySQL数据库的基本步骤●

掌握数据库环境的搭建●

掌握使用JDBC访问数据库的步骤●

掌握使用JavaAPI操作数据库●

掌握数据库事务的使用第十四章JDBC与MySQL编程第1节partJDBC基础

通过使用JDBC,Java程序可以轻松地操作各种主流数据库,例如,Oracle、MSSQLServer、MySQL等。由于Java语言本身的跨平台性,所以使用JDBC编写的程序不仅可以实现跨数据库,还具有跨平台性和可移植性。使用JDBC访问数据库具有操作简单、获取方便且安全可靠等优势。JDBC基础本节概述JDBC(JavaDatabaseConnectivity,Java数据库连接)是一种执行SQL语句的JavaAPI。程序可以通过JDBCAPI连接到关系数据库,并使用SQL结构化语言来完成对数据库的增、删、改、查等操作。与其他数据库编程语言相比,JDBC为数据开发者提供了标准的API,使用JDBC开发的数据库应用程序可以访问不同的数据库,并在不同平台上运行,既可以在Windows平台上运行,也可以在UNIX平台上运行。JDBC程序访问不同的数据库时,需要数据库厂商提供相应的驱动程序。通过JDBC驱动程序的转换,使得相同的代码在访问不同的数据库时运行良好。JDBC驱动示意图如图14.1所示。14.1.1JDBC简介JDBC简介JDBC应用程序可以对数据库进行访问和操作,JDBC访问数据库时主要完成以下工作:

●建立与数据库的连接;

●执行SQL语句;

●获取执行结果。

数据库驱动程序是JDBC程序和数据库之间的转换层,数据库驱动程序负责将JDBC调用映射成特定的数据库调用,JDBC访问示意图如图14.2所示。14.1.2JDBC驱动JDBC驱动

当今市场上主流数据库都提供了JDBC驱动程序,甚至一些流行的数据库还提供了多种不同版本的JDBC驱动程序。JDBC驱动程序有以下4种类型:

●JDBC-ODBC桥:是最早实现的JDBC驱动程序,主要目的是快速推广JDBC。ODBC(OpenDatabaseConnectivity,开放数据库连接)是通过一组通用的API访问不同的数据库管理系统,也需要各数据库厂商提供相应的驱动程序,而ODBC则对这些驱动程序进行管理。JDBC-ODBC桥驱动是将JDBCAPI映射到ODBCAPI,驱动速度很慢,只适用于访问没有其他JDBC驱动的数据库。由于Java语言的广泛应用,所有数据库厂商都提供了JDBC驱动,因此在Java8中不再支持JDBC-ODBC数据访问方式。JDBC驱动14.1.2

●本地API驱动:直接将JDBCAPI映射成数据库特定的客户端API,包含特定的数据库本地代码,用于访问特定数据库的客户端。本地API驱动比起JDBC-ODBC桥执行效率要高,但是仍然需要在客户端加载数据库厂商提供的代码库,不适合基于网络的应用。本地API驱动虽然速度有所提升,但相对后面两种JDBC驱动还是不够高。

●网络协议驱动:将JDBC调用翻译成中间件供应商的协议,然后再由中间件服务器翻译成数据库访问协议。网络协议驱动是基于服务器的,不需要在客户端加载数据库厂商提供的代码库,且执行效率比较好,便于维护和升级。

●本地协议驱动:是纯Java编写的,可以直接连接到数据库。本地协议驱动不需要将JDBC的调用传给ODBC,或本地数据库接口,或中间层服务器,因此执行效率非常高;而且根本不需要在客户端或服务器装载任何软件或驱动。本地协议驱动是智能的,能够知道数据库使用的底层协议,是目前最流行的JDBC驱动。通常JDBC访问数据库时建议使用第4种本地协议驱动,该驱动使用纯Java编写,且避开了本地代码,减少了应用开发的复杂性,降低了产生冲突和出错的可能。JDBC驱动14.1.2JDBCAPI提供了一组用于与数据库进行通信的接口和类,这些接口和类都定义在java.sql包中,常用的接口和类如表14-1所示。14.1.3JDBC

APIJDBC

API

需要注意的是:使用JDBCAPI中的类或接口访问数据库时,容易引发SQLException异常,SQLException异常类是检查型异常,需要放在try…catch语句中进行异常处理,SQLException是JDBC中其他异常类型的基础。1.DriverManager类DriverManager是数据库驱动管理类,用于管理一组JDBC驱动程序的基本服务。应用程序和数据库之间可以通过DriverManager建立连接,其常用的静态方法如表14-2所示。JDBC

API14.1.32.Connection接口Connection接口用于连接数据库,每个Connection对象代表一个数据库连接会话,要想访问数据库,必须先获得数据库连接。一个应用程序可与单个数据库建立一个或多个连接,也可以与多个数据库建立连接。通过DriverManager类的getConnection()方法可以返回一个Connection对象,该对象中提供了创建SQL语句的方法,以完成基本的SQL操作,同时为数据库事务提供了提交和回滚的方法。Connection接口中常用的方法如表14-3所示。JDBC

API14.1.33.Statement接口Statement接口一般用于执行SQL语句。在JDBC中要执行SQL查询语句的方式有一般查询(Statement)、参数查询(PreparedStatement)和存储过程(CallableStatement)三种方式。Connection接口中提供的createStatement()、prepareStatement()和prepareCall()方法分别返回一个Statement对象,PreparedStatement对象和CallableStatement对象。Statement、PreparedStatement和CallableStatement三个接口具有继承关系,其中PreparedStatement是Statement的子接口,而CallableStatement又是PreparedStatement的子接口。Statement接口的主要功能是将SQL语句传送给数据库,并返回SQL语句的执行结果。Statement提交的SQL语句是静态的,不需要接收任何参数,SQL语句可以包含以下三种类型的语句:

●SELECT查询语句;

●DML语句,如INSERT、UPDATE或DELETE;

●DDL语句,如CREATETABLE和DROPTABLE。JDBC

API14.1.3Statement接口中常用的方法及功能如表14-4所示。JDBC

API

需要注意的是:closeOnCompletion()和isCloseOnCompletion()方法是从Java7开始新增的方法,executeLargeUpdate()方法是从Java8开始新增的方法,在开发过程中使用这几个方法时需要注意JDK的版本。考虑到目前应用程序所处理的数据量越来越大,使用executeLargeUpdate()方法具有更好的适应性,但目前有的数据库驱动暂不支持该方法,例如MySQL驱动。14.1.34.ResultSet接口ResultSet接口用于封装结果集对象,该对象包含访问查询结果的方法。使用Statement中的executeQuery()方法可以返回一个ResultSet结果集的对象,该对象封装了所有符合查询条件的记录。ResultSet具有指向当前数据行的游标,并提供了许多方法来操作结果集中的游标,同时还提供了一套getXXX()方法对结果集中的数据进行访问,这些方法可以通过列索引或列名获得数据。ResultSet接口中常用的方法如表14-5所示。JDBC

API14.1.3ResultSet对象具有指向当前数据行的游标。最初游标位于第一行之前,每调用一次next()方法,游标会自动向下移一行,从而可以从上到下依次获取所有数据行。getXXX()方法用于对游标所指向的行的数据进行访问。在使用getXXX()方法取值时,数据库的字段数据类型要与Java的数据类型相匹配,例如,数据库中的整数字段对应Java数据类型中的int类型,此时使用getInt()方法来读取该字段中的数据。常用的SQL数据类型和Java数据类型之间的对应关系如表14-6所示。JDBC

API14.1.3第2节part数据库环境搭建14.2.1创建数据库表

本章JDBC数据库访问基于MySQL数据库,因此所有的代码及环境都是基于MySQL数据库的。在进行数据库访问操作之前,需要先创建数据库和表并录入测试数据。在root用户下创建student数据库,并在该库下创建t_user表,并添加测试数据,其SQL代码如下所示。创建数据库表创建数据库表

【代码14.1】student.sqlCREATEDATABASE`student`;CREATETABLE`t_user`(`Id`int(11)NOTNULLAUTO_INCREMENT,`sid`varchar(20)DEFAULTNULL,`name`varchar(20)DEFAULTNULL,`password`varchar(20)DEFAULTNULL,`sex`varchar(20)DEFAULTNULL,`major`varchar(20)DEFAULTNULL,`hobby`varchar(20)DEFAULTNULL,PRIMARYKEY(`Id`));#添加测试数据INSERTINTO`t_user`VALUES(19,'159110909','向守超','111','男','物联网工程','篮球足球'),(20,'159110901','张恒','123','男','物联网工程','篮球足球');

创建完库student、表t_user和添加完数据以后,在MySQL-Front图形化界面工具中打开,其表中的数据如图14.3所示。14.2.2设置MySQL驱动类Java项目在访问MySQL数据库时,需要在项目中设置MySQL驱动类路径,即将MySQL数据库所提供的JDBC驱动程序(mysql-connector-java-5.1.12-bin0)导入到工程中。mysql-connector-java-5.1.12-bin.jar驱动文件可在网络上直接下载,当然也可以下载其他的版本。

配置MySQL数据库驱动程序有两种方法:一种方法是将驱动程序配置到CLASSPATH中,与配置JDK的环境变量类似,这种方法的配置将对本机中所有创建的项目起作用,但程序员一般不用这种方法;第二种方法是在基础开发工具Eclipse中选中项目,右键单击,在弹出的快捷菜单中选择“Properties→JavaBuildPath→libraries→AddExternalJARs…”命令,在弹出的对话框中,选择mysql-connector-java-5.1.12-bin.jar文件。如图14.4所示。设置MySQL驱动类设置MySQL驱动类

设置完MySQL数据库驱动类路径之后,项目的目录如图14.5所,ReferencedLibraries文件夹中的mysql-connector-java-5.1.12-bin.jar表示对该jar包的引用。14.2.2第3节part数据库访问使用JDBC访问数据库的步骤:●加载数据库驱动;●建立数据连接;●创建Statement对象;●执行SQL语句;●访问结果集;数据库访问本节概述14.3.1加载数据库驱动

通常使用Class类的forName()静态方法来加载数据库的驱动,其语法格式如下所示://加载驱动Class.forName(数据库驱动类名);

例如:Class.forName("com.mysql.jdbc.Driver");//加载MySQL驱动

需要注意的是:不同的数据库其数据库驱动类是不同的,例如:Oracle数据库的驱动类是oracle.jdbc.driver.OracleDriver,而MySQL的数据库驱动类是com.mysql.jdbc.Driver。数据库厂商在提供数据库驱动(通常是一个或几个jar文件)时,会有相应的文档说明。加载数据库驱动14.3.2建立数据库连接

在使用JDBC操作数据库之前,需要先创建一个数据库连接,使用DriverManager类的getConnection()静态方法来获取数据库连接对象,其语法格式如下所示:DriverManager.getConnection(Stringurl,Stringuser,Stringpass);

其中,getConnection()方法有三个参数,具体如下:

●url:数据库连接字符串,遵循的格式是“jdbc:驱动:其他”,不同的数据库连接的URL也有所不同。

●user:连接数据库的用户名;

●pass:密码。建立数据库连接14.3.2建立数据库连接例如,访问MySQL数据库的URL连接字符串"jdbc:mysql://:3306/student"在上面的URL连接字符串中:●jdbc:mysql是协议名称●“”是本机服务器IP地址,也可以使用“localhost”;●“3306”是MySQL数据库的端口号;●“student”是数据库实例名。例如:获取MySQL数据库连接对象Class.forName("com.mysql.jdbc.Driver");Connectionconn=DriverManager.getConnection( "jdbc:mysql://:3306/student",//URL连接字符串 "root",//用户名 "root");//密码14.3.3创建Statement对象

对数据库进行操作或访问时,需要使用SQL语句。在Java语言中,SQL语句是通过Statement对象进行封装后,发送给数据库。Statement对象不是通过Statement类直接创建的,而是通过Connection对象所提供的方法来创建各种Statement对象。

通过Connection对象来获得Statement的方法有以下三种:

●createStatement()方法:创建一个基本的Statement对象;

●prepareStatement(Stringsql)方法:根据参数化的SQL语句创建一个预编译的PreparedStatement对象;

●prepareCall(Stringsql)方法:根据SQL语句来创建一个CallableStatement对象,用于调用数据库的存储过程。

例如://创建Statment对象Statementstmt=conn.createStatement();创建Statement对象14.3.4执行SQL语句

获取Statement对象之后,就可以调用该对象的不同方法来执行SQL语句。所有的Statement都有三种执行SQL语句的方法,具体使用哪一种方法由SQL语句产生的结果来决定:

●executeQuery()方法:只能执行查询语句,例如SELECT语句,用于产生单个结果集;

●executeUpdate()和executeLargeUpdate()方法:用于执行DML和DDL语句,执行DML(INSERT、UPDATE或DELETE语句)时返回受SQL语句所影响的行数(整数值),而执行DDL语句(CREATETABLE、DROPTABLE等)返回值总为0;●execute()方法:可以执行任何SQL语句,此方法比较特殊,也比较麻烦,返回结果为多个结果集、多个更新计数或二者的组合。通常不建议使用该方法,只有在不知道执行SQL语句会产生什么结果或可能有多种类型结果的情况下才会使用。如果SQL语句运行后能产生结果集,Statement对象则将结果集封装成ResultSet对象并返回。下述代码调用Statement对象的executeQuery()方法来执行SQL查询语句,并返回一个ResultSet结果集对象。例如:执行SQL查询语句并返回结果集ResultSetrs=smt.executeQuery("SELECT*FROMt_user");执行SQL语句14.3.5访问结果集SQL的查询结果使用ResultSet封装,ResultSet结果集包含了满足SQL查询条件的所有的行,使用getXXX()方法对结果集中的数据进行访问。

当使用getXXX()方法访问结果集中的数据时,可通过列索引或列名来获取游标所指行中的列数据,其语法格式如下;getXXX(列索引)

或getXXX(“列名”)

例如:循环输出结果集中第三列数据。while(rs.next()){ System.out.println(rs.getString(3));}

或while(rs.next()){ System.out.println(rs.getString("name"));}访问结果集访问结果集

需要注意的是:在使用getXXX()方法来获得数据库表中的对应字段的数据时,尽可能使用序列号参数,这样可以提高效率。除Blob类型外,其他任意类型的字段都可以通过getString()方法来获取,因为所有数据类型都可以自动转换成字符串。

当数据库操作执行完毕或退出应用前,需将数据库访问过程中建立的对象按顺序关闭,防止系统资源浪费。关闭的次序是:

①关闭结果集:rs.close();

②关闭Statement对象:stmt.close();

③关闭连接:conn.close();

下述案例用于示例访问数据库的一般步骤,代码如下所示。14.3.5访问结果集【代码14.2】ConnectionExample.javapackagecom;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;publicclassConnectionExample{ publicstaticvoidmain(String[]args){ try{ //加载驱动 Class.forName("com.mysql.jdbc.Driver"); //建立数据库连接 Connectionconn=DriverManager.getConnection( "jdbc:mysql://:3306/student","root","root"); System.out.println("连接成功!"); //创建Statment对象 Statementstmt=conn.createStatement(); //获取查询结果集 ResultSetrs=stmt.executeQuery("SELECT*FROMt_user"); 14.3.5访问结果集 System.out.println("查询成功!"); //访问结果集中的数据 while(rs.next()){ System.out.println(rs.getString(1)+"" +rs.getString("name")); } //关闭结果集 rs.close(); //关闭载体 stmt.close(); //关闭连接 conn.close(); }catch(ClassNotFoundExceptione){ e.printStackTrace(); }catch(SQLExceptione){ e.printStackTrace(); } }}14.3.5访问结果集

上述代码按照访问数据库的一般步骤编写。

①通过Class.forName()方法加载MySQL数据库驱动;

②调用DriverManager.getConnection()方法来建立MySQL数据库连接,在获取连接时需要指明数据库连接的URL、用户名和密码;

③通过连接对象的createStatement()方法来获取Statement对象,调用Statement对象的executeQuery()方法执行SQL语句;

④调用ResultSet结果集对象的next()方法将游标移动到下一条记录,再通过getXXX()方法来获取指定列中的数据;

⑤最后调用close()方法关闭所有创建的对象。

程序运行结果如下所示:

连接成功!

查询成功!19向守超20张恒14.3.5第4节part操作数据库JDBC不仅可以执行数据库查询,还可以执行DDL、DML等SQL语句,以便最大限度地操作数据库。操作数据库本节概述14.4.1execute()方法Statement接口的execute()方法几乎可以执行任何SQL语句,如果不清楚SQL语句的类型,则只能通过使用execute()方法来执行SQL语句。

使用execute()方法执行SQL语句的返回值是boolean值,表明执行该SQL语句是否返回了ResultSet对象:

●当返回值为true时,可以使用Statement的getResultSet()方法,来获取execute()方法执行SQL查询语句所返回的ResultSet对象;

●当返回值为false时,可以使用getUpdateCount()方法,来获取execute()方法执行DML语句所影响的行数。下述案例示例了Statement对象的execute()方法的使用,代码如下所示。execute()方法【代码14.3】ExecuteExample.javapackagecom;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.Statement;publicclassExecuteExample{ privateStringdriver="com.mysql.jdbc.Driver"; privateStringurl="jdbc:mysql://:3306/student"; privateStringuser="root"; privateStringpass="root"; publicvoidexecuteSql(Stringsql)throwsException{ //加载驱动 Class.forName(driver); try( //获取数据库连接 Connectionconn=DriverManager.getConnection(url,user,pass); //使用Connection来创建一个Statement对象 Statementstmt=conn.createStatement()){execute()方法14.4.1 //执行SQL,返回boolean值表示是否包含ResultSet booleanhasResultSet=stmt.execute(sql); //如果执行后有ResultSet结果集 if(hasResultSet){ try( //获取结果集 ResultSetrs=stmt.getResultSet()){ //迭代输出ResultSet对象 while(rs.next()){ //依次输出第1列的值 System.out.print(rs.getString(1)+"\t"); } System.out.println(); } }else{ System.out.println("该SQL语句影响的记录有" +stmt.getUpdateCount()+"条"); } } }execute()方法14.4.1 publicstaticvoidmain(String[]args)throwsException{ ExecuteExampleexecuteObj=newExecuteExample(); System.out.println("------执行建表的DDL语句-----"); executeObj.executeSql("createtablemy_test"+ "(test_idintprimarykey,test_namevarchar(25))"); System.out.println("------执行插入数据的DML语句-----"); executeObj.executeSql("insertintomy_test(test_id,test_name)" +"selectid,namefromt_user"); System.out.println("------执行查询数据的查询语句-----"); executeObj.executeSql("selecttest_namefrommy_test"); System.out.println("------执行删除表的DDL语句-----"); executeObj.executeSql("droptablemy_test"); }}execute()方法14.4.1

上述代码先定义了一个executeSql()方法,用于执行不同的SQL语句,当执行结果有ResultSet结果集时,则循环输出结果集中第3列的信息;否则输出该SQL语句所影响的记录条数。在main()方法中,调用executeSql()方法,分别执行建表、插入、查询和删除表四个SQL语句。程序运行结果如下:------执行建表的DDL语句-----

该SQL语句影响的记录有0条------执行插入数据的DML语句-----

该SQL语句影响的记录有2条------执行查询数据的查询语句-----

向守超

张恒

------执行删除表的DDL语句-----

该SQL语句影响的记录有0条

需要注意的是:使用Statement执行DDL和DML语句的步骤与执行普通查询语句的步骤基本相似。区别在于执行DDL语句后返回值为0,而执行了DML语句后返回值为受影响的行数。execute()方法14.4.114.4.2executeUpdate()方法executeUpdate()和executeLargeUpdate()方法用于执行DDL和DML语句,其中executeLargeUpdate()方法是Java8新增的方法,是增强版的executeUpdate()方法。executeLargeUpdate()方法的返回值类型为long,当DML语句影响的记录超过Integer.MAX_VALUE时,建议使用该方法。

下述案例示例了Statement对象的executeUpdate()方法的使用,目前MySQL数据库驱动暂不支持executeLargeUpdate()方法功能。代码如下所示。executeUpdate()方法executeUpdate()方法【代码14.4】ExecuteUpdateExample.javapackagecom;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.Statement;publicclassExecuteUpdateExample{ privateStringdriver="com.mysql.jdbc.Driver"; privateStringurl="jdbc:mysql://:3306/student"; privateStringuser="root"; privateStringpass="root"; publicvoidcreateTable(Stringsql)throwsException{ //加载驱动 Class.forName(driver); try( //获取数据库连接 Connectionconn=DriverManager.getConnection(url,user,pass); //使用Connection来创建一个Statment对象 Statementstmt=conn.createStatement()){ //执行DDL,创建数据表 stmt.executeUpdate(sql); } }14.4.2executeUpdate()方法 publiclonginsertData(Stringsql)throwsException{ //加载驱动 Class.forName(driver); try( //获取数据库连接 Connectionconn=DriverManager.getConnection(url,user,pass); //使用Connection来创建一个Statment对象 Statementstmt=conn.createStatement()){ //执行DML,返回受影响的记录条数 returnstmt.executeUpdate(sql); } }

publicstaticvoidmain(String[]args)throwsException{ ExecuteUpdateExampleelud=newExecuteUpdateExample(); elud.createTable("createtablemy_test1"+ "(test_idintprimarykey,test_namevarchar(25))"); System.out.println("-----建表成功-----"); longresult=elud.insertData( "insertintomy_test1(test_id,test_name)selectid,namefromt_user"); System.out.println("--系统中共有"+result+"条记录受影响--"); }}14.4.2executeUpdate()方法

上述代码定义了createTable()方法来创建表,insertData()方法用于插入数据,不管是执行DDL语句还是执行DML语句,最终都是通过调用Statement对象的executeUpdate()方法来实现的。运行该程序,结果如下所示:-----建表成功-------系统中共有2条记录受影响--14.4.214.4.3PreparedStatement接口PreparedStatement接口继承Statement接口,该接口具有以下两个特点:

●PreparedStatement对象中所包含的SQL语句将进行预编译,当需要多次执行同一条SQL语句时,直接执行预先编译好的语句,其执行速度比Statement对象快;

●PreparedStatement可用于执行动态的SQL语句,即在SQL语句中提供参数,大大提高了程序的灵活性和执行效率。

动态SQL语句使用“?”作为动态参数的占位符,示例如下所示。

例如:参数化的动态SQL语句,创建PreparedStatement对象StringinsertSql="INSERTINTOuserdetails(sid,name,password,sex)VALUES(?,?,?,?)";PreparedStatementpstmt=conn.prepareStatement(insertSql);PreparedStatement接口PreparedStatement接口

在执行带参数的SQL语句前,必须对“?”占位符参数进行赋值。PreparedStatement接口中提供了大量的setXXX()方法,通过占位符的索引完成对输入参数的赋值,根据参数的类型来选择对应的setXXX()方法,PreparedStatement接口中提供的常用setXXX()方法如表14-7所示。14.4.3PreparedStatement接口下述案例示例了PreparedStatement的使用,代码如下所示。【代码14.5】PreparedStatementExample.javapackagecom;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.SQLException;publicclassPreparedStatementExample{ publicstaticvoidmain(String[]args){ try{ //加载oracle驱动 Class.forName("com.mysql.jdbc.Driver"); //建立数据库连接 Connectionconn=DriverManager.getConnection( "jdbc:mysql://:3306/student","root","root"); //定义带参数的sql语句 StringinsertSql="INSERTINTOt_user(sid,name,password,sex)" +"VALUES(?,?,?,?)"; //创建PreparedStatement对象 PreparedStatementpstmt=conn.prepareStatement(insertSql); 14.4.3PreparedStatement接口 //使用setXXX()方法对参数赋值 pstmt.setInt(1,7); pstmt.setString(2,"Tom"); pstmt.setString(3,"123456"); pstmt.setByte(4,(byte)1); //执行 intresult=pstmt.executeUpdate(); System.out.println("插入"+result+"行!"); //关闭载体 pstmt.close(); //关闭连接 conn.close(); }catch(ClassNotFoundExceptione){ e.printStackTrace(); }catch(SQLExceptione){ e.printStackTrace(); } }}14.4.3PreparedStatement接口

上述代码先定义一个带参数的SQL语句;再使用该语句来创建一个PreparedStatement对象;然后调用PreparedStatement对象的setXXX()方法对参数进行赋值,并调用PreparedStatement对象的executeUpdate()方法来执行SQL语句。运行该程序,结果如下所示:

插入1行!14.4.3第5节part事务处理

事务是保证底层数据完整的重要手段,对于任何数据库都是非常重要的。事务是由一步或几步数据库操作序列组成的逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行。事务具有ACID四个特性:

●原子性(Atomicity):事务是应用中的最小执行单位,就如原子是自然界的最小颗粒一样,具有不可再分的特性。事务中的全部操作要么全部完成,要么都不执行。

●一致性(Consistency):事务执行之前和执行之后,数据库都必须处于一致性状态,即从执行前的一个一致状态变为另一个一致性的状态。

●隔离性(Isolation):各个事务的执行互不干扰,任意一个事务的内部操作对其他并发事务都是隔离的,即并发执行的事务之间不能看到对方的中间状态,并发事务之间是互不影响的。

●持久性(Durability):事务一旦提交,对数据库所做的任何改变都永久地记录到存储器中,即保存到物理数据库中,不被丢失。事务处理事务处理

事务处理过程中会涉及到事务的提交、中止和回滚三个概念。“事务提交”是指成功执行完毕事务,事务提交又分显示提交和自动提交两种;“事务中止”是指未能成功完成事务,执行中断;“事务回滚”对于中止事务所造成的变更需要进行撤销处理,即事务所做的修改全部失效,数据库返回到事务执行前的状态,事务回滚也有显示回滚和自动回滚两种。JDBC对事务操作提供了支持,其事务支持由Connection提供。JDBC的事务操作步骤如下:

①开启事务;

②执行任意多条DML语句;

③执行成功,则提交事务;

④执行失败,则回滚事务;Connection在默认情况下会自动提交,即事务是关闭的。此种情况下,一条SQL语句更新成功后,系统会立即调用commit()方法提交到数据库,而无法对其进行rollback回滚操作。事务处理

使用Connection对象的setAutoCommit()方法可开启或者关闭自动提交模式,其参数是一个布尔类型,如果参数为false,表示关闭自动提交;如果参数

温馨提示

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

评论

0/150

提交评论