330 likes | 558 Views
☆ WEB 应用开发精品课程. 数据库访问. 长沙民政职业技术学院. 案例导入. 项目 运 用 JDBC 技术 查询所用报名考号信息 任务 1. 实现对数据库各种查询功能; 2. 实现新增,更改,删除等数据库操作。 技术要点 ( 关键字 ) 1.JDBC 连接数据库。 2.JDBC 的增,删,改,查操作的实现。. 目标. 理解 JDBC 标准的概念 掌握 JDBC 标准的核心 API 掌握 JDBC 的 Oracle 实现 掌握用 Statement , PreparedStatement 实现增删改查
E N D
☆WEB应用开发精品课程 数据库访问 长沙民政职业技术学院
案例导入 • 项目 运用JDBC技术查询所用报名考号信息 • 任务 1.实现对数据库各种查询功能; 2.实现新增,更改,删除等数据库操作。 • 技术要点(关键字) 1.JDBC连接数据库。 2.JDBC的增,删,改,查操作的实现。
目标 • 理解JDBC标准的概念 • 掌握JDBC标准的核心API • 掌握JDBC的Oracle实现 • 掌握用Statement,PreparedStatement实现增删改查 • 掌握JDBC事务(Transaction)控制 • 了解JDBC的一些优化技巧,包括批处理,设置预取行数等 • 了解JDBC访问CLOB和BLOB对象 • 掌握调用Oracle存储过程
JDBC编程接口简介 • JDBC是进行数据库连接的抽象层 • JDBC支持和ANSI SQL-2标准相容的数据库
JDBC JDBC (Java 数据库连接) Java 应用程序编程接口 Java应用程序 数据库
ODBC ODBC (开放式数据库连接) (Microsoft 提供) 应用程序编程接口 应用程序 数据库
JDBC种类 JDBC种类 JDBC-ODBC桥 Java到网络协议 Java到数据库协议 Java到 本地API
重要的接口 • java.sql.Connection • java.sql.Statement • java.sql.PreparedStatement • java.sql.CallableStatement • java.sql.ResultSet • java.sql.Driver
程序访问数据库的步骤 • 加载JDBC驱动的实例或是通过jdbc.drivers系统属性向系统注册一个驱动程序 • 指定数据库 • 打开数据库连接 • 提交数据库查询 • 取得查询结果 • 清除结果集 • 关闭连接
注册驱动程序 • 加载JDBC驱动程序 • Class.forName(“DriverName”) DriverName为要加载的数据库驱动名称 如:加载JDBC-ODBC数据库驱动程序: Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”) 如:加载Oracle数据库驱动程序 Class.forName(“oracle.jdbc.driver.OracleDriver”)
指定数据库 指定URL字符串 jdbc:subprotocol:subname String url="jdbc:oracle:thin:@"+serverName+":1521:"+database; 例:jdbc:oracle:thin:@localhost:1521:ora8
打开数据库连接 • Connection conn=DriverManager.getConnection(url); • 该方法使用URL字符串作为参数 • 如果能建立连接,则返回一个Connection对象 • Connection对象代表与一个特定数据库的会话过程
Statement • 创建Statement: • Connection.createStatement方法 • 执行INSERT, UPDATE和DELETE • Statement.executeUpdate方法 • 执行SELECT • Statement.executeQuery方法
取得返回结果 • 查询的结果存放在ResultSet对象的一系列行中 • ResultSet对象的最初位置在行首 • ResultSet.next()方法用来在行间移动 • ResultSet.getXXX()方法用来取得字段的内容
使用Prepared Statement • 当需要多次调用同一条SQL语句时,可以使用Prepared Statement • PreparedStatement从Statement继承而来 • setXXX方法 PreparedStatement pstmt = con.prepareStatement( "UPDATE friends SET salary = ? WHERE name like ?"); pstmt.setInt(1, 10000 ); pstmt.setString(2, “李明 "); pstmt.executeUpdate();
使用Callable Statement • 调用数据库中的Store Procedure时,要用到Callable Statement • CallabelStatement从PreparedStatement继承
JDBC高级课题 • 可滚动的ResultSet • 可更新的ResultSet • 事务 • 批处理
可滚动的ResultSet • 要使用可滚动的结果集,必须使用不同于前面所定义的Statement: • Statement stmt = conn.createStatement(type,concurrency); • PreparedStatement stmt = conn.prepareStatement(sql,type,concurrency)
可滚动的结果集(CON.) • 可滚动结果集中的方法: • first • last • beforeFirst • afterLast • isFirst • isLast • isBeforeFirst • isAfterLast • relative • next • previous • absolute
可更新的结果集 • 可更新的结果集:可以直接通过结果集来更新(insert/update/delete)数据库表 • rs.updateXXX(String name,Xxx value)/rs.updateRow(); • rs.moveToInsertRow()/rs.updateXxx()/rs.insertRow(); • rs.deleteRow(); • rs.cancelRowUpdates();
事务 • 在JDBC中,事务默认是自动提交的 • 通过Connection的setAutoCommit()方法来设置事务的提交属性 • 通过Connection的getAutoCommit()方法来获得当前事务的提交方式 • 通过Connection的commit()方法来提交事务 • 通过Connection的rollback()方法来回滚事务
设置事务的提交属性 try { Statement stmt = conn.createStatement(); Statement stmt1 = conn.createStatement(); String strSql,sql,strParameter; conn.setAutoCommit(false); strSql = "delete from File_List where Type_ID='"+request.getParameter("Type_ID")+"'"; stmt.executeUpdate(strSql); sql = "delete from Type_List where Type_ID='"+request.getParameter("Type_ID")+"'"; stmt1.executeUpdate(sql); conn.commit(); stmt1.close(); stmt.close(); conn.close(); response.sendRedirect("OperationSuccess.jsp?msg=删除目录"+request.getParameter("Type_Name")+"成功!&ref=Y&tar=servlet/dbclass.ManagerTree&frame=epost_menu"); }catch(Exception e){ conn.rollback(); response.sendRedirect("OperationFail.jsp?msg=删除目录"+request.getParameter("Type_Name")+"失败!"); } 事务 提交事务 回滚事务
批处理(Batch) • 可以将一些相关的数据库操作放到同一个Batch中 • 使用Statement的addBatch()方法,将一系列的操作放到同一个Batch中 • 利用Statement的executeBatch()方法,来成批执行放到同一个Batch中的操作 • 可以将Batch操作和事务结合起来使用。将放到 Batch中的操作当成一个事务
Batch(con.) conn.setAutoCommit(false); Statement stmt = conn.createStatement(); stmt.addBatch(“insert into table1…”); stmt.addBatch(“insert into table2…”); stmt.addBatch(“update table3…”); … stmt.executeBatch(); conn.commit() …
操作BLOB/CLOB数据 • BLOB-Binary Large Object • CLOB-Character Large Object • 通过Statement的setBinaryStream()方法,将二进制大数据保存到数据库 • 通过Statement的getBinaryStream()方法,获得数据库中保存的二进制数据 • 注意: • 1.并非所有数据库都支持大数据 • 2.对于Oracle数据库,要使用JDBC操作BLOB/CLOB,使用oracle10g以上的classes12.zip中的驱动
获取数据库元数据 • Meta-data:关于数据的数据,在此是有关数据库和数据库表等数据库对象的信息 • 通过Connection的getMetaData()方法获得包含数据库元数据的DatabaseMetaData对象,然后在此对象上调用相关的方法获得对应的信息
DatabaseMetaData相关方法 • getDatabaseProductName() • getDatabaseProductVersion() • getDriverName() • getDriverVersion() • getURL() • getUserName() • getColumnCount() • getColumnName() • … …
总结 • JDBC访问数据库的步骤 • JDBC标准的核心API,包括DriverManager,Connection,Statement,ResultSet等。 • JDBC的Oracle实现和MySQL实现。 • Statement,PreparedStatement • JDBC事务(Transaction)控制。 • JDBC中批处理,设置预取行数。 • JDBC访问CLOB和BLOB对象 • 调用Oracle存储过程。