JDBC核心API

一.JDBC简介

  • Java Database Connectivity Java 数据库连接
  • 是指Java和许多数据库间连接的工业标准。这种连接独立于数据库。
  • JDBC提供了基于SQL数据库访问的调用级API

二.JDBC核心API关键接口描述

  • java.sql.DriverManager 处理驱动的调入并且对产生新的数据库连 接提供支持。
  • java.sql.Connection 代表对特定数据库的连接。
  • java.sql.Statement 代表一个特定的容器,来对一个特定的数据库执行SQL语句。
  • java.sql.ResultSet 控制对一个特定语句的行数据的存取
  • java.sql.Statement两个子类型:
    java.sql.PreparedStatement 用于执行预编译的SQL语句
    CallableStatement :用于执行 SQL 存储过程的接口

三.JDBC示例

1.JDBC示例:

 Class.forName("oracle.jdbc.driver.OracleDriver");
 Connection con = DriverManager.getConnection ("jdbc:oracle:thin:@127.0.0.1:1521:orcl","login", "password");
 Statement stmt = con.createStatement();
 ResultSet rs = stmt.executeQuery("SELECT count(*) FROM Table1");
 if (rs.next()){
    System.out.println(rs.getInt(1) ); 
 }

2.ODBC示例:

 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
 String url = "jdbc:odbc:dbdemo";
 Connection con = DriverManager.getConnection(url);
 Statement st = con.createStatement();
 ResultSet rs = st.executeQuery("select * from userinfo");

四.注册驱动

       必须先向java程序注册Oracle JDBC驱动程序,然后才能打开数据库连接。 两种注册Oracle JDBC驱动程序的办法:
1.使用java.lang.Class的forName()方法,将显式地加载驱动程序类

  Class.forName("oracle.jdbc.OracleDriver");

2.使用JDBC DriverManager类的registerDriver()方法。

  DriverManager.registerDriver(new oracle.jdbc.OracleDriver());

五.打开数据库连接

  • 必须先打开数据库连接,然后才能在Java程序中执行SQL语句。打开数据库连的办法:DriverManager类的getConnection()
  • DriverManager.getConnection(URL,USERNAME,PASSWROD);
    URL:程序要连接的数据库,以及要使用的JDBC驱动程序
   String url = "jdbc:oracle:thin:@127.0.0.1:1521:DBA"
   DriverManager.getConnection(url,"scott","tiger");

六.执行sql语句

       Statement 对象用于将SQL语句发送到数据库中, Statement接口提供了执行语句和获取结果的基本方法,如:

Statement sm = cn.createStatement();
// 执行数据查询语句(select)
sm.executeQuery(sql); 
// 执行数据更新语句(delete、update、insert)
sm.executeUpdate(sql);
statement.close();

七.使用proparedStatement执行sql语句

//用PreparedStatement来执行sql语句
String sql = "insert into user (id,name) values (?,?)"; 
PreparedStatement ps = cn.prepareStatement(sql); 
ps.setInt(1,xxx); 
ps.setString(2,xxx); 
...
ResultSet rs = ps.executeQuery(); // 查询
int c = ps.executeUpdate(); // 更新

八.处理执行结果

  • ResultSet 包含符合 SQL 语句中条件的所有行,并且它通过一套get 方法(这些 get 方法可以访问当前行中的不同列)提供了对这些 行中数据的访问。ResultSet.next方法用于移动到 ResultSet 中的下一行,使下一行成为当前行。
  • 查询语句,返回记录集ResultSet。
  • 更新语句,返回数字,表示该更新影响的记录数。
  • ResultSet的方法:
    next(),将游标往后移动一行,如果成功返回true;否则返回 false。
    getInt(“id”)或getSting(“name”),返回当前游标下某个字段的值。
  • 释放连接时,一般先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection

九.批量更新

  Statement 
  Statement sm = cn.createStatement(); 
  sm.addBatch(sql1); 
  sm.addBatch(sql2); 
  ... 
  sm.executeBatch() 

一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有

十.批量更新PreparedStatement

  PreparedStatement ps = cn.preparedStatement(sql); 
  { 
  ps.setXXX(1,xxx); 
  ... 
  ps.addBatch(); 
  } 
  ps.executeBatch(); 

一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新

十一.事务的处理

1、关闭Connection的自动提交

con.setAutoCommit(false); 

2、执行一系列sql语句

要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close。

  Statement sm ; 
  sm = con.createStatement(insert into user...); 
  sm.executeUpdate(); 
  sm.close(); 
  sm = con.createStatement("insert into corp...); 
  sm.executeUpdate(); 
  sm.close(); 

3、提交

  con.commit(); //提交
  con.rollback();//如果发生异常,那么回滚

十二.大数据类型的保存

  Class.forName("oracle.jdbc.driver.OracleDriver");
  String url = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL";
  Connection con = DriverManager.getConnection(url, "scott", "tiger");
  PreparedStatement ps = con.prepareStatement("INSERT INTO AA(AID,PIC) VALUES(?,?)");
  ps.setInt(1, 1234);
  File file = new File("E:\\PLSQL.doc");
  ps.setBinaryStream(2, new FileInputStream(file), (int)file.length());
  ps.executeUpdate();
  ps.close();

十三.大数据类型的提取

  Class.forName("oracle.jdbc.driver.OracleDriver");
  String url = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL";
  Connection con = DriverManager.getConnection(url, "scott", "tiger");
  PreparedStatement ps = con.prepareStatement("SELECT * FROM AA");
  InputStream is = rs.getBinaryStream(2); 
  BufferedInputStream bis = new BufferedInputStream(is);
  FileOutputStream fos = new FileOutputStream("c:/demo.jpg");
  while(true){
     int n = bis.read();
     if(n==-1){
       break;
     }
     fos.write(n);
  }

十四.可滚动.更新的记录集

  • 创建可滚动、更新的Statement
 Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 

该Statement取得的ResultSet就是可滚动的

  • 创建PreparedStatement时指定参数
 PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSI TIVE,ResultSet.CONCUR_READ_ONLY); 
  • 结果集定位
 ResultSet.absolute(5);

十五.游标及结果集类型

  • resultSetType可选值是:
    1、ResultSet.TYPE_FORWARD_ONLY 在ResultSet中只能先前(向下)移动游标
    2、ResultSet.TYPE_SCROLL_INSENSITIVE 在ResultSet中可以随心所欲的先前向后(上下移动)移动游标,当数据库变化时,当前结果集不变
    3、ResultSet.TYPE_SCROLL_SENSITIVE 在ResultSet中可以随心所欲的先前向后(上下移动)移动游标,同时ResultSet的值有所改变的时候,可以得到改变后的最新的值
  • resultSetConcurrency可选值是:
    1、ResultSet.CONCUR_READ_ONLY 在ResultSet中的数据记录是只读的,不能用结果集更新数据库
    2、ResultSet.CONCUR_UPDATABLE 在ResultSet中的数据记录可以任意修改,能用结果集更新数据库

十六.结果集处理

 Statement stmt = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); 
 ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2"); 
 //在执行下面的代码时,查询语句中不能使用*来代替所有的字段
 rs.absolute(5); 
 rs.updateString("NAME", "AINSWORTH");
 rs.updateRow(); 
 rs.moveToInsertRow();
 rs.updateString(1, "AINSWORTH");
 rs.updateInt(2,35);
 rs.insertRow();
 rs.moveToCurrentRow();

十七.执行存储过程

 Class.forName("oracle.jdbc.driver.OracleDriver");
 String url = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL";
 Connection con = DriverManager.getConnection(url, "scott", "tiger");
 CallableStatement cs = con.prepareCall("{call pro_demo(?,?)}");
 //设置输入参数
 cs.setInt(1, 7902);
 //定义输出类型
 cs.registerOutParameter(2, OracleTypes.VARCHAR);
 //执行存储过程
 cs.executeUpdate();
 //提取存储过程输出
 System.out.println(cs.getString(2));//根据下标提取

十八.执行函数

 String sql = "{?=call FUNC_DEMO (?,?)}";
 CallableStatement cs = con.prepareCall(sql);
 cs.registerOutParameter(1, OracleTypes.VARCHAR);
 cs.setInt(2, 7369);
 cs.registerOutParameter(3, OracleTypes.VARCHAR);
 cs.execute();
 String strJob = cs.getString(1);
 String strName = cs.getString(3);

十九.元数据

       ResultSetMetaData可用于获取关于 ResultSet 对象中列的类型和属性信息的对象。

 ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2"); 
 ResultSetMetaData rsmd = rs.getMetaData(); 
 int numberOfColumns = rsmd.getColumnCount();
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值