首页 中间件技术2_数据库编程

中间件技术2_数据库编程

举报
开通vip

中间件技术2_数据库编程nullJava 数据库编程Java 数据库编程null1. 数据库体系结构 2. JDBC 体系结构 3. JDBC 类 4. JDBC程序举例 5. 优化命令 6. 可滚动可更新结果集 7. 批处理 8. 事务 9. 数据库元数据 10. 在JDBC中存储和检索图像1. 数据库体系结构1. 数据库体系结构两层模型 三层模型两层模型两层模型两层模型 应用层:包括JDBC Driver,业务逻辑和用户界面。 数据库层:包括RDBMS(关系型数据库管理系统)。两层模型两层模型三层模型三层模型客户层:可以使用Web 浏...

中间件技术2_数据库编程
nullJava 数据库编程Java 数据库编程null1. 数据库体系结构 2. JDBC 体系结构 3. JDBC 类 4. JDBC程序举例 5. 优化命令 6. 可滚动可更新结果集 7. 批处理 8. 事务 9. 数据库元数据 10. 在JDBC中存储和检索图像1. 数据库体系结构1. 数据库体系结构两层模型 三层模型两层模型两层模型两层模型 应用层:包括JDBC Driver,业务逻辑和用户界面。 数据库层:包括RDBMS(关系型数据库管理系统)。两层模型两层模型三层模型三层模型客户层:可以使用Web 浏览器实现的表示层。 中间层:业务逻辑或应用逻辑。可以使用Servlet引擎(如Tomcat)或应用服务器实现。JDBC Driver也在该层。 数据库层:包括RDBMS(关系型数据库管理系统)。三层模型三层模型三层模型三层模型灵活性: 能在不影响其他部分的前提下改变某部分 不用修改代码连接到不同的数据库 分为 表示 / 业务逻辑 / 数据管理 可以缓存查询 能实现代理和防火墙三层模型三层模型更高的复杂性 更高的可维护性 更低的网络效率 更多的部分需要配置或购买2. JDBC 体系结构2. JDBC 体系结构Java代码调用 JDBC library JDBC 加载驱动 Driver 与特定数据库交互 可以有多个驱动、多个数据库应用程序JDBCDriverJDBC(Java DataBase Connection)JDBC DriversJDBC DriversType I: “Bridge” JDBC-ODBC桥方式 Type II: “Native” 基于本地API方式 Type III: “Middleware” JDBC网络的方式 Type IV: “Pure” 基于本地 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 的方式JDBC DriversJDBC DriversJDBCType I “Bridge”Type II “Native”Type III “Middleware”Type IV “Pure”ODBCODBC DriverCLI (.lib)Middleware ServerType I DriversType I Drivers使用桥技术 为了Java程序方便访问已有ODBC数据源而提供的,由于要经过JDBC、ODBC两次翻译才能访问到DBMS,因此性能和效率不高。 需要在客户端安装和配置 不适用于Web开发 如: ODBC BridgeType II DriversType II Drivers本地API驱动 需要在本地安装和配置数据库的客户端程序,由Java程序通过JDBC驱动访问数据库客户端API来执行数据库操作,效率也不高。 需要有 CLI 库 通常是线程不安全的 e.g. Intersolv Oracle Driver, WebLogic driversType III DriversType III Drivers调用通常位于数据库服务器中间件服务器 非常灵活,允许通过一个驱动访问多个数据库 只需下载驱动 需要安装和维护另外一个服务器应用 是目前常用的方式,效率高。 e.g. Symantec DBAnywhereType IV DriversType IV Drivers100% 纯Java驱动 通过JDBC的驱动程序直接访问数据库 需要为每一种数据库下载一个驱动 目前常用的方式,效率高。 e.g. Oracle, MySQLJDBC 驱动程序 总结 初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf JDBC 驱动程序总结No scrolling cursors No bookmarks3. JDBC 类3. JDBC 类JDBC 通过位于 java.sql 包中的类来实现 Driver (接口) 加载、选择驱动 DriverManager (类) 连接到真实的数据库 Connection (接口) 发送SQL语句,接收返回的数据 Statement (接口) 一条SQL命令 ResultSet(接口) SQL语句执行的结果JDBC URLsJDBC URLsjdbc:subprotocol:source 每一个驱动都有自己的子协议 每个子协议对于每一个数据源有不同的拼写方式 jdbc:odbc:DataSource 例如: jdbc:odbc:Northwind jdbc:msql://host[:port]/database 例如: jdbc:msql://foo.nowhere.com:4333/accountingDriverManagerDriverManagerConnection getConnection (String url, String user, String password) 使用用户提供的用户名和密码连接到给定的JDBC URL上 Throws java.sql.SQLException 返回一个Connection对象ConnectionConnectionConnection表示与一个特定数据库的会话. 通过Connection,SQL语句被执行,相应的结果得到返回。 一个数据库可以保持多个连接 提供元数据 与数据库、 表格 关于规范使用各类表格的通知入职表格免费下载关于主播时间做一个表格详细英语字母大小写表格下载简历表格模板下载 和字段有关的信息 提供处理事务的方法建立 Connection建立 ConnectionString url = "jdbc:odbc:Northwind"; try { Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con = DriverManager.getConnection(url); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); }JDBC-ODBC桥方式:这种访问方式是第4类方式。建立 Connection建立 ConnectionClass.forName("org.gjt.mm.mysql.Driver"); Connection conn = DriverManager.getConnection(“jdbc:mysql://localhost:3306/dbName”,“username",“pwd");MySQL:这种访问方式是第4类方式。Connection类方法Connection类方法Statement createStatement() 返回一个 Statement对象 PreparedStatement prepareStatement(String sql) 返回一个 PreparedStatement对象 PreparedStatement表示预编译的 SQL 语句的对象。 CallableStatement prepareCall(String sql) 返回一个CallableStatement对象 CallableStatement是用于执行 SQL 存储过程的接口 StatementStatement一个Statement对象被用于执行静态SQL命令并获取执行结果.Statement类方法Statement类方法ResultSet executeQuery(String) 执行给定的 SQL 语句,该语句返回单个 ResultSet 对象 int executeUpdate(String) 执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句。 boolean execute(String) 执行给定的 SQL 语句,该语句可能返回多个结果。ResultSetResultSet一个ResultSet可以访问通过执行Statement 得到的数据表格. 一条Statement执行后,在同一时刻只能打开一个ResultSet. 表格的行按顺序获取. ResultSet 维护一个指向当前行的游标. “next”方法将游标指向下一行. you can’t rewindResultSet类方法ResultSet类方法boolean next() 激活下一行 第一次调用 next() 激活第一行 returns false if there are no more rows void close() 销毁 ResultSet 允许重复使用创建它的Statement语句 被大多数Statement方法自动调用SQL语句范例SQL语句范例创建新表 create table Course ( courseId char(5), subjectId char(4) not null, courseNumber integer, title varchar(50) not null, numOfCredits integer, primary key (courseId) ); 删除表 drop table Enrollment;SQL语句范例SQL语句范例查询表 select firstName, mi, lastName from Student where deptId = 'CS' and zipCode = '31411'; select * from Student where deptId = 'CS' and zipCode = '31411'; SQL语句范例SQL语句范例插入行 insert into Course (courseId, subjectId, courseNumber, title) values ('11113', 'CSCI', '3720', 'Database Systems', 3); 更新行 update Course set numOfCredits = 4 where title = 'Database Systems'; 删除行 delete Course where title = 'Database System';执行SQL语句执行SQL语句执行update, delete, insert, Create等语句  statement.executeUpdate ("create table Temp (col1 char(5), col2 char(5))"); 执行select语句 ResultSet resultSet = statement.executeQuery ("select firstName, mi, lastName from Student where lastName = 'Smith' "); executeUpdate的返回值: 对于 SQL 数据操作语言语句,如update,delete,insert等,返回行计数; 对于不返回任何内容的 SQL 语句,如Create语句,返回 0 Java类型与SQL类型映射Java类型与SQL类型映射SQL 类型 Java类型 CHAR, VARCHAR, LONGVARCHAR String NUMERIC, DECIMAL java.math.BigDecimal BIT boolean TINYINT byte SMALLINT short INTEGER int BIGINT long REAL float FLOAT, DOUBLE double BINARY, VARBINARY, LONGVARBINARY byte[] DATE java.sql.Date TIME java.sql.Time TIMESTAMP java.sql.Timestamp4. JDBC程序举例4. JDBC程序举例(1)建立数据库 启动“Microsoft SQL Server2000”,打开“企业管理器”在“数据库”中建立名为“mydata”的数据库,并在其下制作名为“wuzi”的数据表 程序举例程序举例(2)建立(ODBC)数据源和驱动程序 配置数据源,设置数据源名称为wzgl 控制面板->管理工具->数据源(ODBC),在“ODBC数据源管理器”对话框中单击“系统DSN” ,然后单击“添加”按钮,得到“创建数据源”对话框,选择“SQL Server”并单击“完成”按钮,在出现的“建立新的数据源到SQL Server”对话框中的“数据源名称”项填写“wzgl”并选取“服务器名”,然后单击“下一步”按钮,选择“使用网络登录ID的Windows NT验证”项目,单击“下一步”按钮,把默认的数据库改为“mydata”,再单击“下一步”,单击“完成”按钮,然后可以单击“测试数据源”,成功后,单击“确定”按钮,完成了(ODBC)数据源和驱动程序的建立。程序举例程序举例(3) 编写代码MyJdbcnullimport java.awt.*; import java.awt.event.*; import java.sql.*; ...... public void Liststudent() throws SQLException //针对数据库的操作 { String bh,mc,xh,lb,dw,sj; int sl; float dj,je; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch(ClassNotFoundException e) { } Connection con=DriverManager.getConnection("jdbc:odbc:wzgl"); Statement sql=con.createStatement(); //创建Statement对象 ResultSet rs=sql.executeQuery("select * from wuzi"); null while(rs.next()) { //输出被查询的情况 bh=rs.getString("物资编号"); mc=rs.getString("物资名称"); xh=rs.getString("规格型号"); lb=rs.getString("类别"); dw=rs.getString("计量单位"); sl=rs.getInt("数量"); dj=rs.getFloat("单价"); je=rs.getFloat("金额"); sj=rs.getDate("时间").toString(); if(bh.trim().equals(sno.getText().trim())) { text.append('\n'+"物资编号"+" "+"物资名称"+" " +"规格型号"+" "+"类别"+" "+"计量单位"+" " +"数量"+" "+"单价"+" "+"金额"+" "+"时间"+'\n'); text.append('\n'+bh+" "+mc+" "+xh+" "+lb+" "+ dw+" "+sl+" "+dj+" "+je+" "+sj+" "+'\n'); } } sql.close(); //关闭Statement的同时也关闭了RecordSet con.close(); }null(4)运行程序 执行后在文本框中输入要查询物资的物资编号,单击“查询”按钮,在文本框中显示被查询物资的所有信息 。程序说明程序说明① Driver 每个DBMS制造商都提供一个实现这个接口的类。 其作用不仅仅是装载一个类,它会去初始化DriverManger类中的静态成员。之后DriverManger才能被使用。null一般采用Class.forName(…)方法把恰当的Driver字节码当作插件加载到JVM(装载一个类)。如上面代码中的语句: try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch(ClassNotFoundException e) { } MS SQL Server 2000用jTDS驱动比较好,比MS SQL Server自带的驱动好 其他类型数据库的连接写法参见: http://www.javaeye.com/topic/53600 其中包括了jTDS驱动的下载地址和数据库连接写法程序说明程序说明② DriverManger 是一个抽象类,但其中提供了很多可用的方法。 用于登陆并和数据库建立Connection,完成这个工作的语法如下: Connection con = DriverManger.getConnection(url); Connection con = DriverManger.getConnection(url,username,password); 在上面的例子中,采用以下语句: Connection con=DriverManager.getConnection("jdbc:odbc:wzgl"); 注意这里出现的wzgl是前面配置ODBC数据源时用户自定义的名字。程序说明程序说明③ Connection Connection是建立在应用程序和底层数据库之间的一个概念上的“管道”,通过这个“管道”可以(以Statement对象的形式)发送结构化查询语言(SQL语句)并以ResultSet对象的形式接收查询结果。 一旦建立起一个Connection,只要应用程序继续执行并且Connection没有被明确地关闭,同一个应用程序就可以多次重用这个Connection。程序说明程序说明在建立数据库Connection的过程中涉及到大量开销,因此,在应用程序的执行生命期内能够多次重用数据库Connection是重要的性能改善。 另一方面,应用程序“维持”一个打开的Connection的时间不应该超过必要的长度,因为大部分数据库服务器对同时打开的连接数有限制。多次重用Connection可以改善性能,但是若每个应用程序都总是打开Connection而不关闭,就会造成数据库连接数被耗尽。 因此解决这个矛盾的思路是采用“连接池”技术。c3p0连接池较好。程序说明程序说明④ Statement 利用Statement对象可以对数据表发送查询。例如,可以发送以下查询: select * from wuzi 从wuzi表中获得所有记录。程序说明程序说明⑤ResultSet ResultSet是一种特殊类型的集合,用于将SQL语句的查询结果返回给应用程序。 一开始的时候游标指向数据集第一个记录的前一个,则next()命令将游标指向下一个(第一条记录)。如果数据集为空,则返回null,那么循环不会继续下去。 程序说明程序说明Statement sql=con.createStatement(); ResultSet rs=sql.executeQuery("select * from wuzi"); while(rs.next()) { //输出被查询的情况 bh=rs.getString("物资编号"); mc=rs.getString("物资名称"); xh=rs.getString("规格型号"); …… sl=rs.getInt("数量"); …… }程序说明程序说明将SQL Server2000的访问方式改为第4种方式的方法: Class.forName( "net.sourceforge.jtds.jdbc.Driver" ); Connection con=DriverManager.getConnection("jdbc:jtds:sqlserver://localhost:1433/mydata","sa",""); 若要正确运行,需要 安装SQL Server sp4包 到http://jtds.sourceforge.net/下载jTDS驱动包 将包中的 .jar包放入java的lib目录中 把此.jar文件添加到classpath路径中(若在eclipse中运行,需要把.jar文件导入)程序说明程序说明比如,在下载的包中找到如下文件: jtds-1.2.2.jar 把它拷贝到java的lib目录中,并在classpath中设置: classpath = .;c:\jdk1.6.1\lib\tools.jar; c:\jdk1.6.1\lib\ jtds-1.2.2.jar 在eclipse中导入jar包的方法是: Project->Properties->Java Build Path ->Libraries-> Add JARsMySQL和Oracle对数据库的访问均采用第4种方式。 ACCESS对数据库的访问采用第1种方式。null与SQL Server配置相关的链接 http://www.examda.com/ncre/three/db/fudao/20080307/105311972.html http://cn-web.com/cnweb/18/671/article/ http://tech.ccidnet.com/art/3741/20050119/534187_1.html5. 优化命令5. 优化命令Prepared Statements 预备语句接口 适用于SQL调用频繁的场合 允许驱动优化(编译)查询 通过Connection.prepareStatement()创建 Stored Procedures(存储过程) 用数据库特点的语言编写 存储于数据库一端 通过 Connection.prepareCall()访问PreparedStatementPreparedStatement PreparedStatement 实例包含已编译的SQL 语句。 包含于PreparedStatement 对象中的SQL 语句可具有一个或多个入口参数。PreparedStatementPreparedStatement由于PreparedStatement 对象已预编译过,所以其执行速度要快于Statement 对象。 多次执行的SQL 语句经常创建为PreparedStatement 对象,以提高效率。 作为Statement 的子类,PreparedStatement 继承了Statement 的所有功能。另外它还添加了一整套方法,用于设置发送给数据库以取代入口参数占位符的值。PreparedStatement用法PreparedStatement用法PreparedStatement语句 PreparedStatement pstmt = con.prepareStatement("UPDATE table SET m = ? WHERE x = ?"); pstmt 对象包含了带有?的语句,它已发送给DBMS,并为执行作好了准备。PreparedStatement用法PreparedStatement用法执行PreparedStatement对象 在执行PreparedStatement 对象之前,必须用setXXX 方法设置每个?参数的值: 第一个参数是要设置的参数的序数位置 第二个参数是设置给该参数的值 例如,以下代码将第一个参数设为23456789,第二个参数设为100000000: pstmt.setLong(1, 123456789); pstmt.setLong(2, 100000000);PreparedStatement程序举例PreparedStatement程序举例FindGradeUsingPreparedStatement6. 可滚动可更新结果集6. 可滚动可更新结果集前面的例子中使用的结果集都是顺序读取的。称之为顺序正向读取。 在JDBC 2中,既可以向前也可以向后滚动行,还可以将光标移动到要求的位置。此外,还可以在结果集中才插入、删除或者更新行,并把这些变化自动反馈到数据库中。可滚动可更新结果集可滚动可更新结果集创建具有适当类型和同步模式的语句 对静态语句应采用下述方式: Statement statement = connection.createStatement(int resultSetType, int resultSetConcurrency) 对一个预备好的语句使用下述方式: PreparedStatement statement = connection.prepareStatement(String sql, int restulSetType, int resultSetConcurrency);可滚动可更新结果集可滚动可更新结果集resultSetType取值 TYPE_FORWARD_ONLY 正向顺序的访问结果集。 TYPE_SCROLL_INSENSITIVE 结果集是可滚动的,但是对数据库中的变化不敏感。 TYPE_SCROLL_SENSETIVE 结果集是可滚动的,并且对其他用户引起的数据库变化是敏感的。如果想让结果集是可滚动的和可更新的,那么就使用这个类型。这些常量是定义在ResultSet接口中的常量可滚动可更新结果集可滚动可更新结果集resultSetConcurrency的取值 CONCUR_READ_ONLY 不能通过结果集更新数据库。 CONCUR_UPDATABLE 可以使用结果集更新数据库可滚动可更新结果集可滚动可更新结果集例如,如果让结果集可滚动并且可更新,可以创建一条语句: Statement statement = connection.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATEABLE) 则下列语句可以执行一个返回结果集的SQL查询: ResultSet resultSet = statement.executeQuery(query);可滚动可更新常用方法介绍常用方法介绍移动光标的相对位置 first()、last()、previous()、last() 移动光标到指定行 absolute(int row) 检索当前指定域的值 getXXX(int columnIndex) getXXX(String columnIndex)常用方法介绍常用方法介绍插入、删除和更新当前行 insertRow() deleteRow() updateRow() 把新值写入当前域中 在调用insertRow()或updateRow()方法之前,需要调用下列方法把新值写入当前行的域中: UpdateXxx (int columnIndex, Xxxvalue) UpdateXxx (String columnName, XxxValue)UpdateXxx跟具体更新的数据类型有关,如更新整数字段,则用UpdateInt。 两种UpdateXxx方法分别对应序号法和列名称法。常用方法介绍常用方法介绍取消对行的更新 cancelRowUpdates() 关闭结果集并释放资源 Close() 最近所读的列是否含有一个SQL NULL值 boolean wasNull()null举例1: resultSet.absolute(2); resultSet.updateString("phone","4292111"); resultSet.updateRow(); 第一行将光标移动到结果集的第2行 第二行修改phone字段内容为4292111 第三行将修改的内容写入数据源null举例2: resultSet.updateString("lastName", "Yao"); resultSet.updateString("firstName", "An"); resultSet.insertRow();7. 批处理7. 批处理在前面所有例子中,SQL命令提交到数据库,一次执行一条语句。当要处理大量更新命令时,这种方法效率不高。 例如: 往表中插入1000行,一次提交一条INSERT命令比整批提交所有的INSERT命令多花费将近1000倍的时间。 为提高效率JDBC 2引入了批更新方式,用于批量处理非SELECT语句的SQL命令。批处理批处理调用Statement接口中的addBatch方法把非SELECT命令添加到批中。当所有命令都添加到批以后,调用executeBatch方法把批提交给数据库执行: Statement statement = connection.createStatment(); Statement.addBatch("create table T (C1 integer, C2 varchar(15))"; Statement.addBatch("insert into T values(100, 'smith')"); Statement.addBatch("insert into T values(200, 'Jones')"); int count[] = statement.executeBatch();8. 事务8. 事务说明:A帐户向B帐户转账500元,但A帐户的转账失败,B帐户的转账成功。 存在的问 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 :等于B账户白捡了500元,这样银行肯定不干啊! 所以要解决这样的错误业务逻辑,就引入一个概念原子操作,原子操作必须遵守: 同时成功或同时失败,不可以一个成功一个失败或一个失败一个成功。 对于原子操作来说,右面的图如果转账成功的话A账户为500元,B账户为1500元。null原子操作A操作B操作外力原子操作说明:A操作和B操作原来并不是原子操作 给这两个操作施加一个外力后,转变成 原子操作;这个外力就是事务。 事务把非原子操作转变成原子操作,没 有事务就没有原子操作。 事务是怎样实现的呢? 1. 事务是由数据库服务器实现的 2. JDBC默认情况下采用数据库服务器提 供的自动事务服务记住:原子操作是不可分割的操作,必须一起成功一起失败。事务的特性事务的特性事务必须具备以下四个属性: 原子性:事务是一个完整的操作。事务的各步操作是不可分的(原子的);要么都执行,要么都不执行 一致性:当事务完成时,数据必须处于一致状态 隔离性:对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务 永久性:事务完成后,它对数据库的修改被永久保持,事务日志能够保持事务的永久性事务分为自动事务和手工事务事务分为自动事务和手工事务自动事务 是数据服务器里默认提供的服务,自动提交,自动回滚 2. 手工事务 也是数据库服务器提供的服务,但是手工提交,手工回滚,什么时候提交,什么时候回滚,由程序员编程决定。回滚和提交null解释:A账户里的500元转到B账户里,转账过程中有两种情况 A:转账成功:提交之前有个临时数据(A:500 B:1500) 提交之后,把临时数据转变为永久数据(A:500,B:1500)回滚之前有个临时数据(A:500 B:1500) 回滚之后,把临时数据转变为永久数据(A:1000,B:1000) 在成功情况 下,都是手工提 交手工回滚B:转账失败:只能自动回滚(A:1000 B:1000)总结:手工提交和手工回滚就是把临时数据变为永久数据的过程。提交:我确认把A账户钱转到B账户,确认更新 回滚:我不转账,不更新。事务管理事务管理事务是非显式打开和关闭的 Connection.setAutoCommit(boolean) Connection有一个被称为 AutoCommit的模式,如果AutoCommit 为true, 每一次命令的执行都会自动提交。(缺省情况: true ) 如果AutoCommit为false, 那么每一次执行都被添加到当前事务。 此时,你必须进行显式的提交和回滚 Connection.commit() 提交 Connection.rollback() 回滚null 代码片段: try{ con.setAutoCommit(false); //step① 把自动提交关闭 Statement stm = con.createStatement(); stm.executeUpdate("insert into person(id, name, age) values(520, 'X-Man', 18)"); stm.executeUpdate("insert into Person(id, name, age) values(521, 'Super', 19)"); //step② 正常的DB操作 con.commit(); //step③ 成功主动提交 } catch(SQLException e){ try{ con.rollback(); } catch(Exception e){ e.printStackTrace(); } //step③ 失败则主动回滚 }JDBC事务并发出现的问题JDBC事务并发出现的问题1. 脏读(Dirty Reads)一个事务读到了另一个事务的中间结果。(oracle可以防止) 。 A账户B账户C账户转500元1000变为500-500+500A账户未提交存2001000变为15001000+200=1200null2.不可重复读(UnPrpeatable Read): 同一个事务中读两次但读出的数据不一样的情况,也就是在两次读之间有事务更改了表,也就是读的时候没有对行上锁。 说明:A在往1000的账户存200,但是还没有提交, 但是这时候B往1000 的账户里也存200,然后A账户提交了, 如果A回滚的话,这个更新发生冲突。null3.幻读(Phantom Read):在一个事务里面进行读取时,有另一个事务对这个表进行了增或删的操作,造成一个幻觉,好像是多了记录,或是少了记录,也就是读的时候没有对表上锁。事务隔离机制事务隔离机制为了解决这个这几个事务并发产生的问题,出现了事务隔离机制: TRANSACTION_NONE 不使用事务 TRANSACTION_READ_UNCOMMITTED 可以读取未提交数据 (阻止脏读,但不能阻止幻读和不可重复读 ) TRANSACTION_READ_COMMITTED 可以避免脏读,不能够读取没提交的数据,最常用隔离级别 大部分数据库的默认隔离级别 TRANSACTION_REPEATABLE_READ 可以避免脏读,重复读取 TRANSACTION_SERIALIZABLE 可以避免脏读,重复读取和幻读,(事务串行化)会降低数据库效率事务隔离机制事务隔离机制以上的五个事务隔离级别都是在Connection类中定义的静态常量。 使用setTransactionIsolation(int level) 方法可以设置事务隔离级别。 比如:con.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED); 事务小结事务小结1 事务边界 默认情况下,JDBC每执行一条语句,就提交一次,即一句话就是一个事务。 如果需要更改事务边界,需要调用connection.setAutoCommit(false)来取消    自动提交,然后在事务结束的地方调用Connection.commit()方法提交事务,    发生异常时调用rollback()回滚。事务小结事务小结2 保存点 创建保存点: Connection.setSavepoint()生成保存点。 回滚到保存点:Connection.rollback(Savepoint); 3 事务的隔离级别 有5种事务隔离级别。 事务隔离级别较低时可能会导致的脏读、不可重复读取、幻读。分别什么含义。 知道如何更改驱动程序的事务隔离级别。 事务的隔离级别:幻读>不可重复读>脏读9. 数据库元数据9. 数据库元数据JDBC提供DatabaseMetaData接口,可以获取数据库范围的信息。如:列数量、列名称等。 要得到数据库的一个DatabaseMetaData实例,可以采用如下方法: DatabaseMetaData dbMetaData = connection.getMetadata();nullDatabaseMetaData dbMetaData = connection.getMetaData(); System.out.println("database URL: " + dbMetaData.getURL()); System.out.println("database username: " + dbMetaData.getUserName()); System.out.println("database product name: " + dbMetaData.getDatabaseProductName()); System.out.println("database product version: " + dbMetaData.getDatabaseProductVersion()); System.out.println("JDBC driver name: " + dbMetaData.getDriverName()); System.out.println("JDBC driver version: " + dbMetaData.getDriverVersion()); System.out.println("JDBC driver major version: " + new Integer(dbMetaData.getDriverMajorVersion())); System.out.println("JDBC driver minor version: " + new Integer(dbMetaData.getDriverMinorVersion())); System.out.println("Max number of connections: " + new Integer(dbMetaData.getMaxConnections())); System.out.println("MaxTableNameLentgh: " + new Integer(dbMetaData.getMaxTableNameLength())); System.out.println("MaxColumnsInTable: " + new Integer(dbMetaData.getMaxColumnsInTable())); connection.close();运行结果运行结果10. 在JDBC中存储和检索图像10. 在JDBC中存储和检索图像数据库不仅能存储数值和字符串,而且能够存储图像。 BLOB(二进制大对象) 用于存储二进制是数据,可以存储图像 CLOB(字符型大对象) 用于以字符形式存储大批量文本说明:orcale和SQL Server中都可以定义BLOB对象,数据的最大长度可以达到4G。在JDBC中存储和检索图像在JDBC中存储和检索图像需要引入的包 java.sql.Blob java.sql.Clob 创建含有Blob字段的表 create table Country( name varchar(30), flag blob, description varchar(255)); 其中flag的类型是BLOB,可以用来存储图像null向表中插入一条含有图像的记录: PrepareStatement pstmt = connection.prepareStatement("insert into Country values(?,?,?)"); 建立输入流与表中BLOB单元格的联系 File file = new File(imageFilename); InputStream inputImage = new FileInputStream(file); pstmt.setBinaryStream(2, inputImage, (int)(file.length()));null调用getBlob方法从表中检索一幅图像 Blob blob=rs.getBlob(2); ImageIcon imageIcon = new ImageIcon(blob.getBytes(2, (int)blob.length()));可滚动课更新结果集举例可滚动课更新结果集举例TestTableEditorInsert a new rowTableEditorNewRecordDialog自学一个通用的SQL客户程序举例一个通用的SQL客户程序举例连接到任意JDBC数据源SQL Client输入并执行一个SQL语句显示SELECT查询语句的运行结果,或显示非SELECT查询语句的运行状态。自学批处理举例批处理举例编写一个程序,从文本文件中获取数据,然后把这些数据复制到数据库的Person表中。CopyFileToTable自学Create table Person ( firstName varchar(20); mi char(1); lastName varchar(20) )BLOB程序举例BLOB程序举例StoreAndRetrieveImagecreate table Country( name varchar(30), flag blob, description varchar(255));自学说明:这个程序中用到的DescriptionPanel类,代码见13章,379页,对应的程序文件为:TextAreaDemo.java。TextAreaDemoJDBC其他相关链接JDBC其他相关链接http://java.sun.com/products/jdbc/ http://java.sun.com/products/java-blend/
本文档为【中间件技术2_数据库编程】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_240534
暂无简介~
格式:ppt
大小:801KB
软件:PowerPoint
页数:0
分类:互联网
上传时间:2012-06-08
浏览量:47