速成笔记:Java DataBase Connectivity

本文详细介绍了如何使用JDBC连接并操作Oracle数据库,包括加载驱动、建立连接、执行SQL查询、结果处理及资源关闭等关键步骤,并讨论了JDBC的优缺点、编程步骤、优化技巧及常见问题解决方法。

附件:完整的JDBC程序范例(连接Oracle)

import java.sql.*;

public class TestJDBC {

public static void main(String[] args) {

ResultSet rs = null;

Statement stmt = null;

Connection conn = null;

try {

Class.forName("oracle.jdbc.driver.OracleDriver");

//new oracle.jdbc.driver.OracleDriver();

conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:mydb", "scott", "tiger");

stmt = conn.createStatement();

rs = stmt.executeQuery("select * from dept");

while(rs.next()) {

System.out.println(rs.getString("deptno"));

System.out.println(rs.getInt("deptno"));

}

} catch (ClassNotFoundException e) {

e.printStackTrace(); //此处应用logforJ替换

} catch (SQLException e) {

e.printStackTrace();      //此处应用logforJ替换

} finally {

try {

if(rs != null) {

rs.close();

rs = null;

}

if(stmt != null) {

stmt.close();

stmt = null;

}

if(conn != null) {

conn.close();

conn = null;

}

} catch (SQLException e) {

e.printStackTrace();   //此处应用logforJ替换

}

}

}

}

Lomboz_eclipse

1.Eclipse的J2EE插件版:

①Eclipse基于插件实现扩展,Lomboz要依赖于其他Eclipse插件

②竞争对手为:MyEclipse、JBuilder

③下载:搜索lomboz Eclipse选择all in one Eclipse r3.2 

JDBC (数据库的链接纽带)

1.基于数据库的API进行编程的时候:变换数据库就要改变程序的代码为相应的API

  进行分层设计:使用ODBC/JDBC,屏蔽数据库具体API,可以方便的变换数据库

JDBC的缺陷:SQL语句在不同种类数据库之间的区别没有屏蔽掉

2.在java端使用统一接口,在不同的数据库端用不同的数据库接口

3.编程步骤:import java.sql.*;

Oracle提供的JDBC的jar包:oracle\ora90\jdbc\lib\classes12.jar

工程文件夹右键|Build path|add external archive将该jar包添加到工程中

①Load the Driver:Class.forName(“Oracle.jdbc.driver.OracleDriver”)

DriverManager作为连接数据库的大管家,实例化时自动向其注册(不用显示调用其registerDriver方法)

//new Oracle.jdbc.driver.OracleDriver 

②Connect to the DataBase:定义标准Interface Connection

Connection conn = DriverManager.getConnection(jdbc:oracle:thin:@ip地址:端口号1521:SID的名字,scott,tiger)

③Execute the SQL:

Statement stmt = conn.CreateStatement(); 

ResultSet rs = stmt.executeQuery(select * from dept); //指到结果集上边的结果

④Retrieve the result data:循环去的结果

⑤Show the result data:将数据库中的各种类型转为Java中的类型(getXXX)方法

whiler(rs.next()){

rs.getString(deptno);  //将deptno字段对应的结果转为string类型

}

⑥Close:Close the resultset / Close the statement / close the connection

rs.close(); stmt.close();    conn.close();

4.上述编程进行优化

注意1:try-catch(classNotFoundException e) {e.printStackTrack() ;  }

catch{SQLException e}             {e.printStackTrack();  }

-finally{关闭相应资源} //为了防止中间出错而无法关闭资源 造成服务器“安乐死”

注意2:相应资源应在try之前声明对象 //否则在finially中无法找到对象

Connection conn=NULL; Statement stmt=NULL; ResultSet rs=NULL 

注意3:finially中关闭资源也要写成try-catch结构

注意4:对关闭相应资源应先判定非空,再关闭 (否则会造成数据库未连接时,也连带报异常)

JDBC处理DML语句

1.利用String传参//去除rs相关的语句

String sql = “insert into dept2 value (98,’game’,’BJ’)”//dept2表的字段deptno、dname、loc

stmt.executeUpdate(sql) //用来执行insert update delete 语句

2.windows|show view|others|data|database explorer   //作为lomboz的功能

在对应窗口中Connections点右键|New connections|oracle|进行设置

找到对应表右键|data|sample Contents //查看相应数据库表格的数据的变化

3.利用命令行参数传参

if(args.length != 3) {   //命令行参数转为对应的变量 写入到String sql中

System.out.println("Parameter Error! Please Input Again!");

System.exit(-1);

}

int deptno = 0;

try {

deptno = Integer.parseInt(args[0]);

} catch (NumberFormatException e) {

System.out.println("Parameter Error! Deptno should be Number Format!");

System.exit(-1);

}

String dname = args[1];

String loc = args[2];                 

......               //处理下面的逗号单引号比较麻烦

String sql = "insert into dept2 values (" + deptno + ",'" + dname + "','" + loc + "')"; 

4. 利用PreparedStatement://将stmt对应的部分换为下面代码

PreparedStatementp stmt=NULL

pstmt=conn.prepareStatment(“insert into dept2 value(?,?,?)”)

pstmt.setInt(1,deptno);  stmt.setString(2,dname);  stmt.setString(3,loc);

pstmt.executeUpdate();

JDBC处理存储过程

callableStatement:用来调用数据库中的存储过程

callableStatement cstmt = conn.prearecall(“{call p(?, ?, ?, ?)}”);

cstmt.registerOutParameter(3, Types.INTEGER); //第3个问号为输出

cstmt.registerOutParameter(4, Types.INTEGER); //第4个问号为输出

cstmt.setInt(1, 3); cstmt.setInt(2, 4); cstmt.setInt(4, 5);

cstmt.execute();

cstmt.getInt(3);  cstmt.getInt(4); //获取输出结果

JDBC批处理

1,当插入多条记录时:不用创建对应的多个stmt

stmt.addBatch("insert into dept2 values (51, '500', 'haha')");

stmt.addBatch("insert into dept2 values (52, '500', 'haha')");

stmt.addBatch("insert into dept2 values (53, '500', 'haha')");

stmt.executeBatch();

2.对于PreparedStatement执行批处理:对应于上述位置

pstmt.addBatch();  pstmt.executeBatch();

JDBC处理Transaction

1.必须一起提交一些语句:要么全部提交,要么全部失败

conn.setAutoCommit(false);  //关闭自动提交

stmt = conn.createStatement();

stmt.addBatch("insert into dept2 values (51, '500', 'haha')");

stmt.addBatch("insert into dept2 values (52, '500', 'haha')");

stmt.addBatch("insert into dept2 values (53, '500', 'haha')");

stmt.executeBatch();

conn.commit(); //手动提交

conn.setAutoCommit(true); //开启自动提交

2.注意:异常处理时候 有些要添加以下语句

conn.rollback(); conn.setAutoCommit(true);

JDBC处理可滚动的结果集

1.与遍历next向下不同:向上遍历 或 遍历的时候跳过几个记录

Statement stmt = conn.createStatement(  //对滚动不敏感 并发访问时候只读

ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

ResultSet rs = stmt.executeQuery("select * from emp order by sal");

rs.next();System.out.println(rs.getInt(1));//打印第一个记录里第一个字段的内容

rs.last(); //定位到最后一条  rs.getRow());//获取当前行号

rs.isLast()  rs.isAfterLast()  

rs.previous()//向上遍历 rs.absolute(6);//直接定位到第6行

JDBC处理可更新的结果集

1.sun提供接口 但oracle驱动不支持 mysql支持

Statement stmt = conn.createStatement(  //对滚动不敏感 并发访问时候可更新

ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

rs.updateString("ename","AAAA");//更新内存中的

rs.updateRow();//更新数据库中一行数据

rs.moveToInsertRow();//插入新行

rs.updateInt(1, 9999);rs.updateString("ename","AAAA");rs.updateInt("mgr", 7839);

rs.insertRow();

rs.moveToCurrentRow();//将光标移动到新建的行

rs.absolute(5);rs.deleteRow();//删除行

rs.cancelRowUpdates();//取消更新

JDBC3.0新增功能:DataSource&RowSet(在javax包中)

1.DataSource作为DiverManager的替代

可以实现连接池和分布式实现

2.RowSet:支持断开的结果集(可以和数据库断开连接 在内存中使用结果集)

与J2EE应用连接紧密

*SQL回顾

Select * from t where....

Insert into t values(...)

Delete from T where...

Update T set t1=... and t2=... where t3=...

Create table T(...)

Drop table T

存储过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值