您的位置:首页 > 数据库 > Oracle

JDBC学习笔记,以oracle 9i为例。

2012-11-24 15:29 375 查看
最典型的Oracle JDBC程序:
1. 查询语句:
import java.sql.*;

publicclass TestJDBC {

publicstaticvoid main(String[] args) {
ResultSet rs = null;
Statement stmt = null;
Connection conn =
null
;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
//neworacle.jdbc.driver.OracleDriver();
conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.1:1521:SXT",
"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();
} catch (SQLException e) {
e.printStackTrace();
} 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();
}
}
}

}
2. DML语句 Insert

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

publicclass TestDML {

publicstaticvoid main(String[] args) {
Statement stmt = null;
Connection conn =
null
;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
//neworacle.jdbc.driver.OracleDriver();
conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.1:1521:SXT",
"scott",
"tiger");
stmt = conn.createStatement();
String sql =
"insert intodept2 values (98, 'GAME', 'BJ')";
stmt.executeUpdate(sql);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if(stmt !=
null) {
stmt.close();
stmt = null;
}
if(conn !=
null) {
conn.close();
conn = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}

}

3. DML语句2 从命令行输入3个值,并把这三个值插入depart2表当中。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

publicclass TestDML2 {

publicstaticvoid main(String[] args) {
if(args.length != 3) {
System.out.println("ParameterError! Please Input Again!");
System.exit(-1);
}

int deptno = 0;

try {
deptno = Integer.parseInt(args[0]);
} catch (NumberFormatException e) {
System.out.println("ParameterError! Deptno should be Number Format!");
System.exit(-1);
}

String dname = args[1];
String loc = args[2];

Statement stmt = null;
Connection conn =
null
;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
//neworacle.jdbc.driver.OracleDriver();
conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.1:1521:SXT",
"scott",
"tiger");
stmt = conn.createStatement();
String sql =
"insert intodept2 values (" + deptno + ",'" + dname +
"','" + loc +
"')";
System.out.println(sql); //打印出当前sql语句去检查该sql是否正确。

stmt.executeUpdate(sql);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if(stmt !=
null) {
stmt.close();
stmt = null;
}
if(conn !=
null) {
conn.close();
conn = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}

}

4. Prepared Statement,比较容易看清楚。可以灵活制定参数类型。

import java.sql.*;

publicclass TestPrepStmt {

publicstaticvoid main(String[] args) {
if(args.length != 3) {
System.out.println("ParameterError! Please Input Again!");
System.exit(-1);
}

int deptno = 0;

try {
deptno = Integer.parseInt(args[0]);
} catch (NumberFormatException e) {
System.out.println("ParameterError! Deptno should be Number Format!");
System.exit(-1);
}

String dname = args[1];
String loc = args[2];

//PreparedStatment 是一种statement,比父接口提供了更丰富的方式。

PreparedStatement pstmt =
null;
Connection conn =
null
;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
//neworacle.jdbc.driver.OracleDriver();
conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.1:1521:SXT",
"scott",
"tiger");
pstmt = conn.prepareStatement("insert intodept2 values (?, ?, ?)");
pstmt.setInt(1, deptno);
pstmt.setString(2, dname);
pstmt.setString(3, loc);
pstmt.executeUpdate();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if(pstmt !=
null) {
pstmt.close();
pstmt = null;
}
if(conn !=
null) {
conn.close();
conn = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}

}

5. CallableStatement是PreparedStatement的子接口,是用来调用存储过程的。所有的java程序调用存储过程都这么写,只是要注意exception不要这么写。要分别try catch

import java.sql.*;
publicclass TestProc {

/**
*@paramargs
*/
publicstaticvoid main(String[] args)
throws Exception {

Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.1:1521:SXT",
"scott",
"tiger");
//调用存储过程
CallableStatementcstmt = conn.prepareCall("{call p(?, ?, ?, ?)}");
cstmt.registerOutParameter(3,Types.INTEGER); //是输出参数,3是指存储过程当中第三个参数是输出参数,然后类型是Types.INTEGER.
cstmt.registerOutParameter(4,Types.INTEGER); //是输出参数

cstmt.setInt(1, 3);
cstmt.setInt(2, 4);
cstmt.setInt(4, 5);//?
cstmt.execute();
//执行方法是execute()
System.out.println(cstmt.getInt(3)); //拿到输出参数
System.out.println(cstmt.getInt(4)); //拿到输出参数
cstmt.close();
conn.close();
}

}

6. 批处理
有两种方式:
第一种是写三条语句,然后一次性执行。
import java.sql.*;
publicclass TestBatch {

publicstaticvoid main(String[] args)
throws Exception {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.1:1521:SXT",
"scott",
"tiger");

Statement stmt = conn.createStatement();
stmt.addBatch("insert intodept2 values (51, '500', 'haha')");
stmt.addBatch("insert intodept2 values (52, '500', 'haha')");
stmt.addBatch("insert intodept2 values (53, '500', 'haha')");
stmt.executeBatch();
stmt.close();

conn.close();

}

}

第二种方式是写一条语句,但是传三次参数,再一并运行。
import java.sql.*;
publicclass TestBatch {

publicstaticvoid main(String[] args)
throws Exception {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.1:1521:SXT",
"scott",
"tiger");

PreparedStatement ps = conn.prepareStatement("insert into dept2 values (?, ?, ?)");
ps.setInt(1, 61);
ps.setString(2,
"haha");
ps.setString(3,
"bj");
ps.addBatch();

ps.setInt(1, 62);
ps.setString(2,
"haha");
ps.setString(3,
"bj");
ps.addBatch();

ps.setInt(1, 63);
ps.setString(2,
"haha");
ps.setString(3,
"bj");
ps.addBatch();

ps.executeBatch();
ps.close();

conn.close();

}

}

7. Transaction
就是一些操作必须同时执行。比如存取钱问题。

import java.sql.*;
publicclass TestTransaction {

publicstaticvoid main(String[] args) {

Connection conn =
null
;
Statement stmt = null;

try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:SXT",
"scott",
"tiger");

//不让系统直接提交
conn.setAutoCommit(false);
stmt = conn.createStatement();
stmt.addBatch("insert intodept2 values (51, '500', 'haha')");
stmt.addBatch("insert intodept2 values (52, '500', 'haha')");
stmt.addBatch("insert intodept2 values (53, '500', 'haha')");
stmt.executeBatch();
//自己提交
conn.commit();
//恢复现场,把属性设回来
conn.setAutoCommit(true);
} catch (ClassNotFoundException e) {
e.printStackTrace();

//如果出现SQLException,就马上先rollback再说。
} catch(SQLException e) {

e.printStackTrace();

try {
if(conn !=
null)
{
//先恢复成没有修改的状态。
conn.rollback();
conn.setAutoCommit(true);
}
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally {
try {
if(stmt !=
null)
stmt.close();
if(conn !=
null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

}

}

8. 可以滚动的结果集:
import java.sql.*;

publicclass TestScroll {
publicstaticvoid main(String args[]) {

try {
new oracle.jdbc.driver.OracleDriver();
String url =
"jdbc:oracle:thin:@192.168.0.1:1521:SXT";
Connection conn = DriverManager
.getConnection(url,
"scott", "tiger");
//对于滚动是否敏感,当并发访问当前结果集的时候,是只读的。就是说,指定这两个参数才可以用这些方法,不然就只可以用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();
//把第一个字段的值当成string类型,拿出来
System.out.println(rs.getString(1));
//是不是最后一条?
System.out.println(rs.isLast());
//是不是最后一条后一条
System.out.println(rs.isAfterLast());
//一共多少条?
System.out.println(rs.getRow());
//向上滚,是倒数第二条
rs.previous();
System.out.println(rs.getString(1));
//定位到第6条
rs.absolute(6);
System.out.println(rs.getString(1));

rs.close();
stmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
事实上,不是所有的数据库都可用这种可以滚动的结果集。

9. 可以更新的结果集。

import java.sql.*;
publicclass TestUpdataRs {
publicstaticvoid main(String args[]){

try{
neworacle.jdbc.driver.OracleDriver();
String url="jdbc:oracle:thin:@192.168.0.1:1521:SXT";
Connectionconn=DriverManager.getConnection(url,"scott","tiger");
Statement

//是否对滚动敏感?是否并发访问可更新?
stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);

ResultSetrs=stmt.executeQuery("select *from emp2");

rs.next();

//更新一行数据
rs.updateString("ename","AAAA");
rs.updateRow();

//插入新行
rs.moveToInsertRow();
rs.updateInt(1, 9999);
rs.updateString("ename","AAAA");
rs.updateInt("mgr", 7839);
rs.updateDouble("sal", 99.99);
rs.insertRow();//插入到数据库中

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

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

//取消更新

//rs.cancelRowUpdates();

}catch(SQLException e){
e.printStackTrace();
}
}
}
不是所有的数据库都支持。oracle9i当中不可以用。

DataSource和RowSet

DataSource是用来替代DriverManager,可以实现连接池实现,支持分布式实现。它的属性可以动态改变。
RowSet是新的ResultSet,他从ResultSet
继承,支持断开的结果集,也支持JavaBean标准。

以上绿色部分,背一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: