JDBC介绍

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标准

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值