JDBC讲课流程.doc_第1页
JDBC讲课流程.doc_第2页
JDBC讲课流程.doc_第3页
JDBC讲课流程.doc_第4页
JDBC讲课流程.doc_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

JDBC讲课流程第一课 JDBC概述和基本数据库操作JDBC(java database connectivity)用于在java程序中实现数据库操作的数据库编程接口,支持基本的SQL语句,为应用程序和数据库之间提供了桥梁java程序和数据库之间的关系如下图:JAVA应用程序JDBC APIJDBC驱动程序管理器JDBC FOR ORACLEJDBC FOR SQL SERVERJDBC FOR OTHER DBORACLESQL SERVEROTHERS DBJDBC的版本:JDK1.4,1.5对应JDBC3.0JDK1.6对应JDBC4.0介绍java中和操作数据库相关的API,解释这些API都是未实现的,真正实现操作的是数据库厂家提供的类库,例如oracle提供的classes12.jar,sql server提供的mssqlserver.jar等。将oracle安装文件下的classes12.jar文件构建到myeclipse开发工具下。开始数据库编程:(别忘先导入包)第一步 加载数据库驱动程序Class.forName(oracle.jdbc.driver.OracleDriver);这是利用反射注册一个数据库驱动或者用驱动管理器也可以注册数据库驱动DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver();第二步 创建数据库连接对象String url=jdbc:oracle:thin::1521:dhc;String user = scott;String pwd = tiger;Connection conn = DriverManager.getConnection(url,user,pwd);其中dhc表示的是数据库名或域名而并非是服务名DriverManager 类存有已注册的 Driver 类的清单。当调用方法getConnection 时,它将检查清单中的每个驱动程序,直到找到可与URL 中指定的数据库进行连接的驱动程序为止。如果改成用OCI形式连接,url字符串改为类似以下语句:String url = jdbc:oracle:oci8:scott/tigerdhc;或者String url = jdbc:oracle:oci:scott/tigerdhc;第三步 创建SQL语句载体对象Statement stmt = conn.createStatement();第四步 执行SQL语句返回结果集对象ResultSet rs = stmt.executeQuery(select * from employees);第五步 遍历结果集返回数据while (rs.next()System.out.println(编号: + rs.getInt(1) + t姓名: + rs.getString(3);在这一步讲解结果集指针的概念,默认状态下游标只能向下移动需要注意getXXX方法的数据类型要和表中字段的数据类型兼容。讲解getXXX()括号中的参数既可以是列索引,也可以是列名,如果使用列名并且结果集中有多个列的名字是相同的,那么返回第一列的的列值,一般用列索引效率会高一些介绍rs.wasNull方法,当前最后一次getXXX()返回的列值是否为null,需要注意的是如果get方法以数字的形式获取列值且返回的列值为null,得到的结果会自动的转换为0或0.0别忘记在下面介绍java的数据类型和SQL的数据类型之间的映射关系第六步 关闭对象释放资源采取逆向关闭对象的顺序rs.close();stmt.close();conn.close();在关闭stmt对象或利用stmt对象重新执行其他SQL语句时时会自动关闭rs对象。解讲数据类型之间的映射关系SQL类型JAVA类型CHARStringREALFloatDATALINK.URLREFRefSTRUCTStructDISTINCTMappingofunderlyingtypeARRAYArrayBLOBBlobCLOBClobTIMESTAMPjava.sql.TimestampTIMEjava.sql.TimeDATEjava.sql.DateLONGVARBINARYbyteVARBINARYbyteBINARYbyteDOUBLEdoubleFLOATdoubleVARCHARStringLONGVARCHARString以上操作的完整代码:import java.sql.*;public class JDBC1 public static void main(String args) throws SQLException /注册数据库驱动程序DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver();/创建数据库连接对象String url = jdbc:oracle:thin::1521:dhc;String user = scott;String pwd = tiger;Connection conn = DriverManager.getConnection(url, user, pwd);/创建SQL语句载体对象Statement stmt = conn.createStatement();/返回结果集对象ResultSet rs = stmt.executeQuery(select * from employees);/遍历结果集返回数据while (rs.next()System.out.println(编号: + rs.getInt(1) + t姓名: + rs.getString(3);/关闭对象rs.close();stmt.close();conn.close();经过优化的代码:import java.sql.*;public class JDBC1 public static void main(String args) Connection conn = null;Statement stmt = null;ResultSet rs = null;try / 注册数据库驱动程序DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver();/ 创建数据库连接对象String url = jdbc:oracle:thin::1521:dhc;String user = scott;String pwd = tiger;conn = DriverManager.getConnection(url, user, pwd);/ 创建SQL语句载体对象stmt = conn.createStatement();/ 返回结果集对象rs = stmt.executeQuery(select * from employees);/ 遍历结果集返回数据while (rs.next() System.out.println(编号: + rs.getInt(1) + t姓名:+ rs.getString(3); catch (SQLException e) e.printStackTrace(); finally try / 关闭对象if (rs != null)rs.close();if (stmt != null)stmt.close();if (conn != null)conn.close(); catch (SQLException e) e.printStackTrace();练习:查询departments表中的50190号部门信息(部门编号,部门名称,部门管理者姓名,部门所在城市)import java.sql.*;public class Test6 public static void main(String args) Connection conn = null;Statement stmt = null;ResultSet rs = null;try DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver();String url = jdbc:oracle:thin:localhost:1521:dhc;String user = scott;String pwd = tiger;conn = DriverManager.getConnection(url, user, pwd);stmt = conn.createStatement();rs = stmt.executeQuery(select d.department_id,department_name,last_name,city from departments d,employees e,locations l where d.manager_id=e.employee_id(+) and d.location_id=l.location_id and d.department_id between 50 and 190 order by d.department_id);while (rs.next() System.out.println(rs.getInt(1) + + rs.getString(2) + + rs.getString(3) + + rs.getString(4); catch (SQLException e) e.printStackTrace(); finally try if (rs != null)rs.close();if (stmt != null)stmt.close();if (conn != null)conn.close(); catch (Exception e) e.printStackTrace();综合练习:查询job_history表中所有数据,将数据写入到文本文件中,一条记录一行,列值之间用|隔开import java.sql.*;import java.io.*;public class Test7 public static void main(String args) Connection conn = null;Statement stmt = null;ResultSet rs = null;FileWriter fw = null;BufferedWriter bw = null;try DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver();String url = jdbc:oracle:thin:localhost:1521:dhc;String user = scott;String pwd = tiger;conn = DriverManager.getConnection(url, user, pwd);stmt = conn.createStatement();rs = stmt.executeQuery(select * from job_history);fw = new FileWriter(e:job_history.txt);bw = new BufferedWriter(fw);while (rs.next() bw.write(rs.getInt(1) + | + rs.getString(2) + |+ rs.getString(3) + | + rs.getString(4) + |+ rs.getInt(5);bw.newLine(); catch (SQLException e) e.printStackTrace(); catch (IOException e) e.printStackTrace(); finally tryif (bw != null)bw.close();if (rs != null)rs.close();if (stmt != null)stmt.close();if (conn != null)conn.close();catch (Exception e)e.printStackTrace();第二课 数据增删改和可滚动结果集讲述Statement对象执行SQL语句的三种方法:executeQuery() 执行查询单个结果集的语句,该语句返回单个 ResultSet 对象executeUpdate() 执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句(如 SQL DDL 语句),该语句返回影响的行数,如果是DDL语句则返回0execute() 执行给定的 SQL 语句,这个SQL语句可能实现并不知道是查询还是增删改,返回值是布尔值,如果是查询语句返回结果则为true,可以用getResultSet得到ResultSet 结果创建一个学生表做数据增删改试验:create table Student(sid number,sname varchar2(50),addDate date);演示增加学生数据import java.sql.*;public class Test8 public static void main(String args) Connection conn = null;Statement stmt = null;try DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver();String url = jdbc:oracle:thin:localhost:1521:dhc;String user = scott;String pwd = tiger;conn = DriverManager.getConnection(url, user, pwd);stmt = conn.createStatement();int i = stmt.executeUpdate(insert into Student values (101,tom,to_date(2008-3-1,yyyy-mm-dd);System.out.println(操作了 + i + 行); catch (SQLException e) e.printStackTrace(); finally try if (stmt != null)stmt.close();if (conn != null)conn.close(); catch (Exception e) e.printStackTrace();演示修改学生数据:int i = stmt.executeUpdate(update Student set sname=jack,addDate=to_date(2007-3-1,yyyy-mm-dd) where sid=101);System.out.println(操作了 + i + 行);学生自己动手改成删除101学生数据:int i = stmt.executeUpdate(delete from Student where sid=101);System.out.println(操作了 + i + 行);学生试验执行DDL语句删除表:int i = stmt.executeUpdate(drop table Student);System.out.println(操作了 + i + 行);学生练习:提供一个原始文本文件Student.txt,将文本文件中的数据导入到数据库中的表中Student.txt文件内容101,tom,2008-3-1102,jack,2008-3-2103,rose,2008-3-3104,smith,2008-3-4105,john,2008-3-5106,zhang,2008-3-6107,li,2008-3-7import java.sql.*;import java.io.*;public class Test10 public static void main(String args) throws Exception Connection conn = null;Statement stmt = null;ResultSet rs = null;DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver();String url = jdbc:oracle:thin:localhost:1521:dhc;String user = scott;String pwd = tiger;conn = DriverManager.getConnection(url, user, pwd);stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);FileReader fr = new FileReader(e:Student.txt);BufferedReader br = new BufferedReader(fr);String s = br.readLine();while (s != null) String rows = s.split(,);stmt.executeUpdate(insert into Student values ( + rows0 + ,+ rows1 + ,to_date( + rows2 + ,yyyy-mm-dd);s = br.readLine();br.close();stmt.close();conn.close();讲解可滚动的结果集游标指针Connection对象创建Statement对象有两种形式:l 一种是用createStatement()无参方法,这种方法创建的Statement对象执行的查询的结果集指针只能向下移动l 另一种方法是用createStatement(int resultSetType, int resultSetConcurrency)有参方法,这种方法创建的Statement对象执行的查询结果集的指针是可以任意移动的后一种方法有两个参数:分别是结果集游标类型和结果集是否可更新结果集游标类型有三个设置值:1. ResultSet.TYPE_FORWARD_ONLY 指针只能向下移动(默认)2. ResultSet.TYPE_SCROLL_INSENSITIVE 指针可任意滚动,但结果集中被更新的行不可视3. ResultSet.TYPE_SCROLL_SENSITIVE 指针可任意滚动,结果集中被更新的行可视结果集是否可更新有两个设置值:1. ResultSet.CONCUR_READ_ONLY 只读(默认)2. ResultSet.CONCUR_UPDATABLE可更新记录关于指针移动的方法:默认打开结果集的时候指针位于第一行记录的上面next() 下一行previous() 上一行first() 第一行last() 最后一行absolute(n) 定位到第n条relative(n) 相对于当前指针位置定位到第n条,n为正数下移,n为负数上移beforeFirst() 第一条的前面afterLast() 最后一条的后面getRow() 获得当前行的行号学生练习:查询出工资排名在第6位到第10位的员工编号,姓名和工资stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);rs = stmt.executeQuery(select * from employees order by salary desc);if (rs.absolute(6) for (int i = 6; i = 10; i+) System.out.println(i + :t + rs.getInt(1) + /+ rs.getString(3) + / + rs.getDouble(8);if (!rs.next()break;学生练习2(选做):每次执行程序都随机查询出1个员工的编号和姓名作为中奖名单,以前已经中过奖的员工不在抽奖的范围内创建一个临时表存放中过奖的员工编号create table award(employee_id number);代码片断stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);/ 查询出以前未抽过奖的所有员工rs = stmt.executeQuery(select * from employees where employee_id not in (select employee_id from award);/ 获得员工总数int empcount = 0;if (rs.last()empcount = rs.getRow();/ 产生随机数指针位置int r = (int) (empcount - 1 + 1) * Math.random() + 1);/ 指针定位打印出员工信息,并保存中奖员工编号if (rs.absolute(r) System.out.println(中奖员工: + rs.getInt(1) + t + rs.getString(3);stmt.executeUpdate(insert into award values ( + rs.getInt(1)+ ); else System.out.println(已经没有未中过奖的员工了);将上例修改为每次执行程序抽出3个中奖员工,并且不能和已经抽出过的员工重复。for (int i = 1;i = 3;i +)/ 查询出以前未抽过奖的所有员工rs = stmt.executeQuery(select * from employees where employee_id not in (select employee_id from award);/ 获得员工总数int empcount = 0;if (rs.last()empcount = rs.getRow();elsebreak;/ 产生随机数指针位置int r = (int) (empcount - 1 + 1) * Math.random() + 1);/ 指针定位打印出员工信息,并保存中奖员工编号if (rs.absolute(r) System.out.println(中奖员工: + rs.getInt(1) + t + rs.getString(3);stmt.executeUpdate(insert into award values ( + rs.getInt(1)+ );第三课 元数据(Meta-Data)Connection对象的getMetaData()方法返回DatabaseMetaData对象中包含了数据库信息ResultSet对象的getMetaData()方法返ResultSetMetaData对象包含了结果集信息演示获取数据库信息/获得数据库元数据DatabaseMetaData dmd = conn.getMetaData();/打印URLSystem.out.println(dmd.getURL();/打印用户名System.out.println(dmd.getUserName();/打印JDBC驱动版本号System.out.println(dmd.getDriverName();/打印数据库名称System.out.println(dmd.getDatabaseProductName();/打印数据库版本号System.out.println(dmd.getDatabaseMajorVersion();演示获取结果集信息stmt = conn.createStatement();rs = stmt.executeQuery(select * from employees);/获取元数据ResultSetMetaData rsMeta = rs.getMetaData();/打印列的个数System.out.println(列数: + rsMeta.getColumnCount();/第1列列名System.out.println(rsMeta.getColumnName(1);/第1列数据类型System.out.println(rsMeta.getColumnTypeName(1);/第1列数据允许宽度System.out.println(rsMeta.getPrecision(1);/第一列数据小数位数System.out.println(rsMeta.getScale(1);学生练习:打印出查询员工表结果集的数据结构,如下图1EMPLOYEE_ID/NUMBER(6,0)2FIRST_NAME/VARCHAR2(20,0)3LAST_NAME/VARCHAR2(25,0)4EMAIL/VARCHAR2(25,0)5PHONE_NUMBER/VARCHAR2(20,0)6HIRE_DATE/DATE(0,0)7JOB_ID/VARCHAR2(10,0)8SALARY/NUMBER(8,2)9COMMISSION_PCT/NUMBER(2,2)10MANAGER_ID/NUMBER(6,0)11DEPARTMENT_ID/NUMBER(4,0)rs = stmt.executeQuery(select * from employees);/获取元数据ResultSetMetaData rsMeta = rs.getMetaData();/循环输出列结构for (int i =1;i = rsMeta.getColumnCount();i +)System.out.print(i + t);System.out.print(rsMeta.getColumnName(i) + /);System.out.print(rsMeta.getColumnTypeName(i) + ();System.out.print(rsMeta.getPrecision(i) + , + rsMeta.getScale(i) + );System.out.println();学生练习(选做):输出scott用户下的所有的表结构,如下表名:AWARD1EMPLOYEE_ID/NUMBER(0,-127)-表名:COUNTRIES1COUNTRY_ID/CHAR(2,0)2COUNTRY_NAME/VARCHAR2(40,0)3REGION_ID/NUMBER(0,-127)-表名:STUDENT1SID/NUMBER(0,-127)2SNAME/VARCHAR2(50,0)3ADDDATE/DATE(0,0)-Statement stmt = null;ResultSet rs = null;Statement stmt2 = null;ResultSet rs2 = null;/创建SQL语句载体stmt = conn.createStatement();stmt2 = conn.createStatement();/查询数据字典获得表名rs = stmt.executeQuery(select table_name from tabs);/遍历表while (rs.next()/打印表名System.out.println(表名: + rs.getString(1);/查询表的所有列rs2 = stmt2.executeQuery(select * from + rs.getString(1);/获取元数据ResultSetMetaData rsMeta = rs2.getMetaData();/循环输出列结构for (int i =1;i = rsMeta.getColumnCount();i +)System.out.print(i + t);System.out.print(rsMeta.getColumnName(i) + /);System.out.print(rsMeta.getColumnTypeName(i) + ();System.out.print(rsMeta.getPrecision(i) + , + rsMeta.getScale(i) + );System.out.println();System.out.println(-);stmt2.close();stmt.close();conn.close();第四课 预制SQL语句和已存储过程PreparedStatement(预制SQL语句)继承了Statement,特点是预编译好SQL语句并存放在PreparedStatement对象中,适合在SQL语句中具有一个或多个输入参数,用?做占位符,例如员工的编号,更新后的新工资,在语句执行之前用setXXX方法给参数赋值,如果是多条语句结构相同但是参数不同,用PreparedStatement速度会比Statement快。还有一个好处是用占位符参数的形式不用考虑用户在设置参数的实参的时候无意中输入的SQL关键字,如单引号。演示用预编译语句增加学生信息:import java.sql.*;import java.util.*;public class Test16 public static void main(String args) Connection conn = null;PreparedStatement pstmt = null;try Class.forName(oracle.jdbc.driver.OracleDriver);String url = jdbc:oracle:thin:localhost:1521:dhc;String user = scott;String pwd = tiger;conn = DriverManager.getConnection(url,user,pwd);pstmt = conn.prepareStatement(insert into student values (?,?,?);pstmt.setInt(1, 101);pstmt.setString(2, tom);/创建GregorianCalendar对象保存制定时间,月份是从011!GregorianCalendar gc = new GregorianCalendar(2007,4,1);/实际是5月pstmt.setTimestamp(3, new java.sql.Timestamp(gc.getTimeInMillis();pstmt.executeUpdate(); catch (ClassNotFoundException e) e.printStackTrace(); catch (SQLException e) e.printStackTrace();finallytryif (pstmt != null)pstmt.close();if (conn != null)conn.close();catch (Exception e)e.printStackTrace();关于JDBC日期时间的补充:sql.Date 类sql包中的日期类Date是util包中Date类的子类,实际上也是util.Date类的子集。它只处理年月日,而忽略小时和分秒,用以代表SQL的DATE信息。 sql.Time 类该类是util.Date类的子类,也是它的一个子集。在Time类里,只处理小时和分秒,代表SQL的TIME类型。它与sql.Date合起来才表示完整的util.Date类信息。sql.Timestamp 类这个类也是util.Date类的子类,其中除了包含年月日、小时和分秒和信息之外,还加入了纳秒信息(nanosecond),1纳秒即1毫微秒。Timestamp类用来代表SQL时间戳(Timestamp)类型信息。演示更新学生信息:pstmt = conn.prepareStatement(update student set sname=?,adddate=? where sid=?);pstmt.setInt(3, 101);pstmt.setString(1, jack);/创建GregorianCalendar对象保存制定时间,月份是从011!GregorianCalendar gc = new GregorianCalendar(2007,4,10);/是5月10日pstmt.setTimestamp(2, new java.sql.Timestamp(gc.getTimeInMillis();pstmt.executeUpdate();演示删除学生信息:pstmt = conn.prepareStatement(delete from student where sid=?);pstmt.setInt(1, 101);pstmt.executeUpdate();演示查询员工信息部门编号从5090的员工编号,姓名,工资,入职日期和部门:编号:100姓名:King工资:24000.0入职日期:1987-6-17部门编号:90-编号:101姓名:Kochhar工资:17000.0入职日期:1989-9-21部门编号:90-略pstmt = conn.prepareStatement(select employee_id,last_name,salary,hire_date,department_id from employees where department_id between ? and ?);pstmt.setInt(1, 50);pstmt.setInt(2, 90);rs = pstmt.executeQuery();while (rs.next() System.out.println(编号: + rs.getInt(1);System.out.println(姓名: + rs.getString(2);System.out.println(工资: + rs.getDouble(3);Calendar calendar = new GregorianCalendar();calendar.setTime(rs.getTimestamp(4);System.out.println(入职日期: + calendar.get(Calendar.YEAR) + -+ (calendar.get(Calendar.MONTH) + 1) + -+ calendar.get(Calendar.DAY_OF_MONTH);System.out.println(部门编号: + rs.getInt(5);System.out.println(-);讲述已存储过程(CallableStatement)CallableStatement 对象为所有的 DBMS 提供了一种以标准形式调用已储存过程的方法。已储存过程储存在数据库中。对已储存过程的调用是 CallableStatement对象所含的内容。这种调用是用一种换码语法来写的,有两种形式:一种形式带结果参,另一种形式不带结果参数。结果参数是一种输出 (OUT) 参数,是已储存过程的返回值。两种形式都可带有数量可变的输入(IN 参数)、输出(OUT 参数)或输入和输出

温馨提示

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

评论

0/150

提交评论