JDBC讲课流程.docx
《JDBC讲课流程.docx》由会员分享,可在线阅读,更多相关《JDBC讲课流程.docx(66页珍藏版)》请在冰豆网上搜索。
JDBC讲课流程
JDBC讲课流程
第一课ﻬJDBC概述和基本数据库操作
JDBC(javadatabase connectivity)用于在java程序中实现数据库操作的数据库编程接口,支持基本的SQL语句,为应用程序和数据库之间提供了桥梁
java程序和数据库之间的关系如下图:
JDBC的版本:
JDK1.4,1.5对应JDBC3.0
JDK1.6对应JDBC4.0
介绍java中和操作数据库相关的API,解释这些API都是未实现的,真正实现操作的是数据库厂家提供的类库,例如oracle提供的classes12.jar,sqlserver提供的mssqlserver.jar等。
将oracle安装文件下的classes12.jar文件构建到myeclipse开发工具下。
开始数据库编程:
(别忘先导入包)
第一步加载数据库驱动程序
Class.forName("oracle.jdbc.driver.OracleDriver");这是利用反射注册一个数据库驱动
或者用驱动管理器也可以注册数据库驱动
DriverManager.registerDriver(neworacle.jdbc.driver.OracleDriver());
第二步创建数据库连接对象
Stringurl="jdbc:
oracle:
thin:
@127.0.0.1:
1521:
dhc";
Stringuser="scott";
Stringpwd= "tiger";
Connectionconn=DriverManager.getConnection(url,user,pwd);
其中dhc表示的是数据库名或域名而并非是服务名
DriverManager类存有已注册的 Driver类的清单。
当调用方法getConnection时,它将检查清单中的每个驱动程序,直到找到可与URL中指定的数据库进行连接的驱动程序为止。
如果改成用OCI形式连接,url字符串改为类似以下语句:
Stringurl="jdbc:
oracle:
oci8:
scott/tiger@dhc";
或者
Stringurl ="jdbc:
oracle:
oci:
scott/tiger@dhc";
第三步创建SQL语句载体对象
Statementstmt =conn.createStatement();
第四步执行SQL语句返回结果集对象
ResultSetrs= stmt.executeQuery("select*fromemployees");
第五步遍历结果集返回数据
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类型
CHAR
String
REAL
Float
DATALINK
java.net.URL
REF
Ref
STRUCT
Struct
DISTINCT
Mappingofunderlyingtype
ARRAY
Array
BLOB
Blob
CLOB
Clob
TIMESTAMP
java.sql.Timestamp
TIME
java.sql.Time
DATE
java.sql.Date
LONGVARBINARY
byte[]
VARBINARY
byte[]
BINARY
byte[]
DOUBLE
double
FLOAT
double
VARCHAR
String
LONGVARCHAR
String
以上操作的完整代码:
importjava.sql.*;
publicclass JDBC1{
publicstaticvoidmain(String[]args)throwsSQLException{
//注册数据库驱动程序
ﻩDriverManager.registerDriver(neworacle.jdbc.driver.OracleDriver());
//创建数据库连接对象
String url= "jdbc:
oracle:
thin:
@127.0.0.1:
1521:
dhc";
ﻩStringuser = "scott";
ﻩStringpwd="tiger";
Connectionconn =DriverManager.getConnection(url, user,pwd);
//创建SQL语句载体对象
Statementstmt=conn.createStatement();
ﻩﻩ//返回结果集对象
ﻩResultSetrs=stmt.executeQuery("select*fromemployees");
ﻩ//遍历结果集返回数据
ﻩwhile(rs.next()){
ﻩﻩSystem.out.println("编号:
"+ rs.getInt
(1)+ "\t姓名:
"+rs.getString(3));
}
ﻩﻩ//关闭对象
ﻩrs.close();
ﻩstmt.close();
ﻩconn.close();
}
}
经过优化的代码:
importjava.sql.*;
publicclassJDBC1{
ﻩpublicstaticvoidmain(String[] args){
Connectionconn= null;
ﻩStatementstmt= null;
ﻩﻩResultSetrs=null;
ﻩﻩtry{
ﻩﻩﻩ// 注册数据库驱动程序
ﻩDriverManager.registerDriver(neworacle.jdbc.driver.OracleDriver());
//创建数据库连接对象
ﻩﻩString url ="jdbc:
oracle:
thin:
@127.0.0.1:
1521:
dhc";
ﻩStringuser ="scott";
ﻩString pwd ="tiger";
ﻩﻩconn= DriverManager.getConnection(url, user,pwd);
ﻩﻩﻩ//创建SQL语句载体对象
ﻩﻩstmt=conn.createStatement();
ﻩﻩ//返回结果集对象
ﻩﻩrs = stmt.executeQuery("select * fromemployees");
ﻩﻩ//遍历结果集返回数据
ﻩﻩwhile (rs.next()) {
ﻩﻩSystem.out.println("编号:
"+rs.getInt(1)+"\t姓名:
"
ﻩﻩ+rs.getString(3));
}
ﻩ} catch(SQLExceptione){
e.printStackTrace();
} finally{
ﻩﻩﻩtry{
ﻩ//关闭对象
ﻩﻩif (rs!
=null)
ﻩﻩrs.close();
ﻩﻩﻩif(stmt!
=null)
ﻩﻩﻩﻩstmt.close();
ﻩif(conn!
=null)
ﻩﻩﻩﻩconn.close();
ﻩ}catch(SQLExceptione){
ﻩe.printStackTrace();
ﻩﻩ}
ﻩﻩ}
ﻩ}
}
练习:
查询departments表中的50~190号部门信息(部门编号,部门名称,部门管理者姓名,部门所在城市)
importjava.sql.*;
publicclassTest6{
publicstaticvoidmain(String[]args){
ﻩConnection conn=null;
ﻩﻩStatementstmt=null;
ﻩResultSet rs= null;
ﻩﻩtry{
DriverManager.registerDriver(neworacle.jdbc.driver.OracleDriver());
ﻩStringurl="jdbc:
oracle:
thin:
@localhost:
1521:
dhc";
ﻩStringuser="scott";
ﻩﻩﻩStringpwd= "tiger";
ﻩﻩconn =DriverManager.getConnection(url,user, pwd);
ﻩﻩstmt=conn.createStatement();
ﻩrs=stmt
ﻩﻩ.executeQuery("selectd.department_id,department_name,last_name,cityfromdepartmentsd,employeese,locations l whered.manager_id=e.employee_id(+)andd.location_id=l.location_idand d.department_id between50and190order byd.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表中所有数据,将数据写入到文本文件中,一条记录一行,列值之间用|隔开
importjava.sql.*;
importjava.io.*;
publicclassTest7{
ﻩpublicstaticvoidmain(String[] args) {
ﻩConnection conn=null;
Statementstmt=null;
ﻩﻩResultSetrs= null;
ﻩ fw=null;
ﻩﻩBufferedWriter bw=null;
try{
ﻩDriverManager.registerDriver(neworacle.jdbc.driver.OracleDriver());
ﻩﻩString url="jdbc:
oracle:
thin:
@localhost:
1521:
dhc";
ﻩStringuser ="scott";
ﻩﻩStringpwd="tiger";
ﻩconn=DriverManager.getConnection(url,user, pwd);
ﻩﻩﻩstmt =conn.createStatement();
ﻩrs=stmt.executeQuery("select*from job_history");
ﻩﻩfw=new("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(SQLExceptione){
ﻩe.printStackTrace();
ﻩﻩ}catch(IOExceptione){
ﻩe.printStackTrace();
} finally{
ﻩﻩtry{
ﻩﻩﻩif(bw !
=null)
ﻩﻩﻩbw.close();
ﻩif(rs!
= null)
ﻩﻩrs.close();
ﻩﻩif (stmt !
=null)
ﻩﻩﻩﻩstmt.close();
ﻩﻩif(conn!
=null)
ﻩﻩﻩconn.close();ﻩﻩ
ﻩﻩ}catch (Exceptione){
ﻩﻩﻩe.printStackTrace();
ﻩﻩ}
ﻩ}
}
}
第二课ﻬ数据增删改和可滚动结果集
讲述Statement对象执行SQL语句的三种方法:
executeQuery()执行查询单个结果集的语句,该语句返回单个ResultSet对象
executeUpdate()执行给定 SQL语句,该语句可能为INSERT、UPDATE 或DELETE 语句,或者不返回任何内容的SQL 语句(如 SQLDDL语句),该语句返回影响的行数,如果是DDL语句则返回0
execute()执行给定的 SQL语句,这个SQL语句可能实现并不知道是查询还是增删改,返回值是布尔值,如果是查询语句返回结果则为true,可以用getResultSet得到ResultSet结果
创建一个学生表做数据增删改试验:
createtableStudent
(
sid number,ﻫsnamevarchar2(50),ﻫaddDatedateﻫ);
演示增加学生数据
importjava.sql.*;
publicclass Test8{
ﻩpublicstaticvoid 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";
Stringuser="scott";
ﻩStringpwd="tiger";
ﻩconn =DriverManager.getConnection(url,user,pwd);
ﻩstmt=conn.createStatement();
ﻩﻩinti=stmt
ﻩﻩﻩﻩ.executeUpdate("insertinto Studentvalues (101,'tom',to_date('2008-3-1','yyyy-mm-dd'))");
ﻩﻩSystem.out.println("操作了"+i+"行");
ﻩ}catch(SQLExceptione){
ﻩﻩe.printStackTrace();
}finally{
try{
ﻩﻩif(stmt!
= null)
ﻩﻩﻩstmt.close();
ﻩﻩif(conn!
= null)
ﻩconn.close();
ﻩ}catch (Exceptione){
ﻩﻩe.printStackTrace();
ﻩﻩ}
ﻩﻩ}
ﻩ}
}
演示修改学生数据:
……
int i =stmt
ﻩﻩﻩ.executeUpdate("updateStudentsetsname='jack',addDate=to_date('2007-3-1','yyyy-mm-dd')where sid=101");
System.out.println("操作了"+i+"行");
……
学生自己动手改成删除101学生数据:
……
int i= stmt
ﻩﻩﻩ.executeUpdate("delete fromStudentwhere sid=101");
System.out.println("操作了"+i+"行");
……
学生试验执行DDL语句删除表:
……
inti=stmt
ﻩ.executeUpdate("droptable Student");
System.out.println("操作了" +i +"行");
……
学生练习:
提供一个原始文本文件Student.txt,将文本文件中的数据导入到数据库中的表中
Student.txt文件内容
101,tom,2008-3-1
102,jack,2008-3-2
103,rose,2008-3-3
104,smith,2008-3-4
105,john,2008-3-5
106,zhang,2008-3-6
107,li,2008-3-7
importjava.sql.*;
importjava.io.*;
publicclass Test10{
ﻩpublic staticvoidmain(String[] args)throwsException{
ﻩConnectionconn=null;
ﻩStatementstmt=null;
ﻩResultSetrs =null;
ﻩDriverManager.registerDriver(neworacle.jdbc.driver.OracleDriver());
String url="jdbc:
oracle:
thin:
@localhost:
1521:
dhc";
ﻩﻩString user="scott";
Stringpwd="tiger";
conn=DriverManager.getConnection(url, user,pwd);
ﻩﻩstmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ﻩResultSet.CONCUR_UPDATABLE);
fr =new("e:
\\Student.txt");
ﻩﻩBufferedReaderbr=newBufferedReader(fr);
String s = br.readLine();
ﻩwhile (s!
=null){
ﻩﻩﻩString[]rows=s.split(",");
ﻩstmt.executeUpdate("insertintoStudentvalues("+rows[0]+",'"
ﻩﻩ+rows[1]+"',to_date('"+rows[2] + "','yyyy-mm-dd'))");
s=br.readLine();
ﻩ}
ﻩﻩ
ﻩﻩbr.close();
ﻩﻩstmt.close();
ﻩconn.close();
ﻩ}
}
讲解可滚动的结果集游标指针
Connection对象创建Statement对象有两种形式:
●一种是用createStatement()无参方法,这种方法创建的Statement对象执行的查询的结果集指针只能向下移动
●另一种方法是用createStatement(int resultSetType,intresultSetConcurrency)有参方法,这种方法创建的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 employeesorder bysalarydesc");
if (rs.absolute(6)) {
ﻩfor(inti =6;i<=10;i++){
ﻩﻩSystem.out.println(i+ ":
\t" +rs.getInt
(1) +"/