附件:完整的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
存储过程