JDBC编程

1.解决乱码的问题:
<%@page contentType="text/html;charset=GBK2312"%>
<%request.setCharacterEncoding="GBK";%>

2.JDBC编程步骤:
  必须捕获异常try...catch...finally,加注释

  (1)load the driver:
     a. class.forName()|class.forName().newlnstance()|new DriverName()
     b.实例化时自动向driverManager注册
  例如,Class.forName("oracle.jdbc.driver.OracleDriver");

  (2)connect to the DataBase
        Connection conn = DriverManager.getConnection

("jdbc:oracle:thin:@127.0.0.1:1521:ORCL", "scott", "tiger");

  (3)Execute The SQL
     a. Connection.CreateStatement()
     b. Statement.executeQuery()
     c.Statement.executeUpdate()
    
     例如,Statement stmt = conn.CreateStatement();
           ResultSet rs = stmt.executeQuery("select * from dept");//和数

据库中游标不同的是指针指在第一条记录的顶上

  (4)Retrieve the result data
     while(r.next()) {
 rs.getString("deptno");//rs.getInt("deptno");
     }
  
 
  (5)Show the result data
     将数据库中的各种类型转换为java中的类型(getXXX)方法
 
  (6) Close
     Close the resultset/close the statement/close the connection
     if(rs != null) {
       rs.close();
       rs = null;
     }

     if(rs != null) {
        stmt.close();
        Stmt = null;
     }

     if(rs != null) {
        conn.close();
        conn = null;
     }
    
3.复杂的插入语句:(运用不同的statement)

  int deptno = 10;
  string dname = "sss";
  string loc = "ddd";
  sql = "insert into dept values ("+deptno+",'"+dname+"','"+loc+"')";//数

值需要不需要单引号,字符串需要

  其实这种复杂语句可以简化:灵活指定sql语句中的变量使用 PreparedStatement
  例如,PreparedStatement pstmt = conn.prepareStatement("insert into

dept2 values (?,?,?)");
        pstmt.setInt(1,deptno);//deptno是上面定义的变量
        pstmt.setSting(2,dname);
        pstmt.setString(3,loc);
        pstmt.executeUpdate();

4.CallableStatement:用来调用存储过程
 
   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;
            end if;
                v_temp:=v_temp+1;
       end;

  调用存储过程:
                CallableStatement cstmt = conn.prepareCall("{call p(?, ?,

?, ?)}");
                //指定哪些是输出参数,用sql里面的类指定输出类型
  cstmt.registerOutParameter(3, Types.INTEGER);
  cstmt.registerOutParameter(4, Types.INTEGER);
                //设置没有指定的参数值
  cstmt.setInt(1, 3);
  cstmt.setInt(2, 4);
  cstmt.setInt(4, 5);

  cstmt.execute();
                //得到输出参数值
  System.out.println(cstmt.getInt(3));
  System.out.println(cstmt.getInt(4));

5.进行批处理:Batch:
                //Statement的批处理,插入三条语句
  Statement 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();
  stmt.close();
  
  //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.setInt(1, 63);
  ps.setString(2, "haha");
  ps.setString(3, "bj");
  ps.addBatch();
  
  ps.executeBatch();

6.运用事务处理:transaction:(重要)意思是妖魔不做,要么一次完成。
    例如,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 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);//又设置回自动提交
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  } catch(SQLException e) {
   
   e.printStackTrace();
   
   try {
    if(conn != null)//遇到异常时会滚,同时设

置回自动提交
    {
     conn.rollback();
     conn.setAutoCommit(true);
    }
   } catch (SQLException e1) {
    e1.printStackTrace();
   }
  }

 }

7.JDBC处理可滚动的结果集:
                        //必须指定对滚动不敏感,否则会逐条执行下去而不能

定位,第二个参数表示只能读不能改
                        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("empno"));//得到第一

条语句的第一个字段内容
   rs.last();
   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));
   rs.absolute(6);//定位到制定行
   System.out.println(rs.getString(1));

8.JDBC处理可更新的结果集:(不重要,oracle不支持,要用传统方式修改)
 
            Statement stmt=conn.createStatement
           

(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);//指定结果

可更新
    
     ResultSet rs=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();

你可能感兴趣的:(JDBC编程)