JDBC编程步骤:
1.Load the Driver
1. Class.forName()|Class.forName().newInstance()|new DriverName()
2. 实例化时自动向DriverManager注册,不需显示调用DriverManager.registerDriver方法
2.Connect to the DataBase
1. DriverManager.getConnect()
3.Execute the SQL
1. Connection.CreateStatement()
2. Statement.executeQuery()
3. Statement.executeUpdate()
4.Retrieve the result data
1. 循环取得结果 while(rs.next())
5.Show the result data
1. 将数据库中的各种类型转换为Java中的类型(getXXX)方法
6.Close
1.close the resulteset./ close the statement / close the connection
eclispe 里面使用需要先把各种数据库的驱动jar包加进来。
ProjectName右击---Build Path--Add External Archives...--选本地的jar包。
循环取得数据(rs.next())
程序完美发展:try-catch-finnaly
可打印出SQL语句,copy出来在Oracle-SQL*Plus里面执行下试试SQL语句是否正常---Oracle
JDBC 进阶:
1.介绍PreparedStatement:---省掉单引号出错步骤。
Statement的子接口,insert into 插入数据时,对sql语句格式比较好用
PreparedStatement pstmt = conn.prepareStatement("insert into tablename values (?,?,?)");
pstmt.setInt(1,整数型变量);---指定欲插入第一列的值
pstmt.setString(2,字符串型变量);
pstmt.setString(3,字符串型变量);
pstmt.executeUpdate();---执行SQL语句
2.对存储过程进行调用。
存储过程示例:
SQL> create or replace procedure p
(v_a in number, v_b number, v_ret out number, v_temp in out number )
is
begin
if(v_a > v_b) then
v_ret := v_a;
else
v_ret := v_b;
else if;
v_temp := v_temp + 1;
end;
/
调用数据库中的procedure。
CallableStatement 是 PreparedStatement,Statement的子接口。
CallableStatement cstmt = conn.prepareCall("{call p(?,?,?,?)}");
cstmt.registerOutParameter(3, Typer.INTEGER); //在JDBC中注册输出参数及输出类型。
cstmt.registerOutParameter(4,Typer.INTEGER); //同上。Typer类在sql包里面
cstmt.setInt(1, 3);
cstmt.setInt(2, 4);
cstmt.setInt(4, 5);
cstmt.execute();
3.批处理
一个Statement处理多条SQL语句。
1.Statement执行批处理
Statement stmt = conn.createStatement();
stmt.addBatch("insert into dept2 values (51, '500','haha')");
stmt.addBatch("sql语句");
stmt.addBatch("...");
stmt.executeBatch();
stmt.close();
2.PreparedStatement 执行批处理。
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.executeBatch();
ps.close();
4.运用事务处理
Transaction问题-(转账的问题)两条或多条SQL语句必须同时执行成功或者同时不成功。保持数据的一致性
默认SQL语句是自动提交的。
try {
...
...
conn.setAutoCommit(false);
stmt = conn.createStatement();
stmt.addBatch("insert into dept2 values(51, '500', 'haha')");
stmt.addBatch(sql 语句);
stmt.addBatch(...);
stmt.executeBatch();
conn.commit();
conn.setAutoCommit(true);
} catch(ClassNotFoundException e) {
e.printStackTrace();
} catch(SQLException e) {
e.printStackTrace();
try {
if(conn != null) {
conn.rollback(); //sql失败,连接不为空,程序回滚。
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();
}
}
5.Moveable ResultSet(可前后移动的结果集)
Rs.last()
Rs.getRow()返回值可以确定一共有多少条记录。
此处不同数据库厂商有点不同,有些不支持。Oracle支持。//现在几乎都支持。
Statement stmt = conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,//对滚动不敏感,可以任意滚动。
ResultSet.CONCUR_READ_ONLY);//并发只读。
ResultSet rs = stmt.executeQruery("select * from emp order by sal");
rs.next();
System.out.println(rs.getString(1));//字段顺序也可用字段名来定位
rs.last();//定位到最后一条记录。
rs.isLast();//是否是最后一条记录
rs.isAfterLast();//是否是最后一条的下一条记录。
rs.previous();//前一条记录
rs.getRow();//第几条记录
rs.absoulute(6);//直接定位到第几条(六)
rs.close();
6.Updatable ResultSet(*)---掌握与否,都OK
很多数据库厂商不支持。oracle不支持,mySQL支持。
Statement stmt = conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,//对滚动不敏感,可以任意滚动。
ResultSet.CONCUR_UPDATABLE);//并发可修改。
ResultSet rs = stmt.executeQruery("select * from emp2");
rs.next();
//更新一行数据。
rs.updateString("ename","AAAA");
rs.updateRow();
//插入新行
rs.moveToIsertRow();
rs.updateInt(1,9999);
rs.updateString("ename","AAAA");
rs.updateInt("mgr",7839);
...
rs.insertRow();
//将光标移动到新建的行
rs.moveToCurrentRow();
//删除行
rs.absolute(5);
rs.deleteRow();
另外:
JDBC新增两个接口:j2ee标准 //javax.sql包里
1.DataSource
DriverManager的替代
连接池实现
分布式实现---DataSource的属性可以动态改变
2.RowSet
新的ResultSet,从ResultSet继承。
支持断开的结果集
支持JavaBean标准