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

来源:互联网 发布:最近流行的网络歌手 编辑:程序博客网 时间:2024/06/05 13:21

最典型的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标准。

 

以上绿色部分,背一下。

原创粉丝点击