JDBC的工作原理

旧巷老猫 提交于 2020-03-02 14:48:59

JAVA接口:是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,
因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
通过接口可以实现不相关的类的相同行为.
通过接口可以指明多个类需要实现的方法.
通过接口可以了解对象的交互方法而不需要了解对象所对应的类.

JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名。

三.JDBC组成:

JDBC有两部分组成:JDBC API和JDBC Driver Interface.

JDBC API:是提供给开发者的一组独立于数据库的API,对任何数据库的操作,都可以用这组API来进行.那么要把这些通用的API翻译成特定数据库能懂的"指令",就要由JDBC Driver Interface来实现了;

 

JDBC Driver Interface 是面向JDBC驱动程序开发商的编程接口,它会把我们通过JDBC API发给数据库的通用指令翻译给他们自己的数据库.

为了使客户端程序独立于特定数据库驱动程序,JDBC规范建议开发者使用接口编程方式,即尽量使应用依赖java.sql 及javax.sql中的接口和类.

\jsp
    Context ctx = (Context) new InitialContext().lookup("java:comp/env");
              DataSource ds = (DataSource) ctx.lookup(jndi);
    Connection cn = ds.getConnection();

3.执行sql语句(Execute the SQL)
 

<1>.用Statement来执行sql语句(主要是不带参的SQL)
              Statement sm = cn.createStatement();
    sm.executeQuery(sql); // 执行数据查询语句(select)
    sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)
 <2>.用PreparedStatement来执行sql语句(带参SQL)
    String sql = "insert into CUSTOMER(id,name) values (?,?)";
              PreparedStatement ps = cn.prepareStatement(sql);
             ps.setInt(1,xxx);
              ps.setString(2,xxx);
             ...
             ResultSet rs = ps.executeQuery(); // 查询
             int c = ps.executeUpdate(); // 更新
 <3>.用PreparedStatement来执行sql语句(批量更新或删除SQL)
    PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SET SALARY = ? WHERE ID = ?");
       for(int i =0;i<length;i++){
                pstmt.setBigDecimal(1, param1[i]);
                pstmt.setInt(2, param2[i]);
                pstmt.addBatch();
        }
        pstmt. executeBatch();
 <4>.用CallablePrepareStatement来调用存储过程
    CallableStatement cstmt = con.prepareCall("{call getTestData(?, ?)}");
    cstmt.registerOutParameter(1, java.sql.Types.TINYINT);
    cstmt.registerOutParameter(2, java.sql.Types.DECIMAL, 3);
    cstmt.executeQuery();
    byte x = cstmt.getByte(1);
    java.math.BigDecimal n = cstmt.getBigDecimal(2, 3);

4.事务的处理(JDBC的事务处理简单,在执行多条更新语句后,加cn.commit()或cn.rollback()就可以)
 <1>.关闭Connection的自动提交
    connection.setAutoCommit(false);

 <2>.执行一系列sql语句:执行新sql前,以前的Statement(或PreparedStatemet)须close
    Statement sm ;
          sm = cn.createStatement(insert into user...);
          sm.executeUpdate();
          sm.close();
          sm = cn.createStatement("insert into corp...);
          sm.executeUpdate();
          sm.close();

 

<3>.提交
    cn.commit();
 <4>.如果发生异常,回滚:
    cn.rollback();

5.处理执行结果:
 

<1>.查询语句,返回记录集ResultSet
 <2>.更新语句,返回数字,表示该更新影响的记录数(0,表示未更新,-1表示更新失败)
 <3>.ResultSet的方法:while(re.next())
        next(),将游标往后移动一行,如果成功返回true;否则返回false
        getInt("id")或getSting("name"),返回当前游标下某个字段的值
6.关闭数据库连接
 rs.close();
 ps.close(); /stat.close();
 con.close();

驱动加载入内存的过程

这里所谓的驱动,其实就是实现了java.sql.Driver接口的类。如oracle的驱动类是 oracle.jdbc.driver.OracleDriver.class(此类可以在oracle提供的JDBC jar包中找到),此类实现了java.sql.Driver接口。

由于驱动本质上还是一个class,将驱动加载到内存和加载普通的class原理是一样的:使用Class.forName("driverName")。以下是将常用的数据库驱动加载到内存中的代码:

//加载Oracle数据库驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
 
//加载SQL Server数据库驱动
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
 
//加载MySQL 数据库驱动
Class.forName("com.mysql.jdbc.Driver");
注意:Class.forName()将对应的驱动类加载到内存中,然后执行内存中的static静态代码段,代码段中,会创建一个驱动Driver的实例,放入DriverManager中,供DriverManager使用。


Driver的功能

java.sql.Driver接口规定了Driver应该具有以下功能:

\

DriverManager角色

事实上,一般我们操作Driver,获取Connection对象都是交给DriverManager统一管理的。

DriverManger可以注册和删除加载的驱动程序,可以根据给定的url获取符合url协议的驱动Driver或者是建立Conenction连接,进行数据库交互。

\

来源:oschina

链接:https://my.oschina.net/u/2397255/blog/608788

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!