Chinaunix首页 | 论坛 | 博客
  • 博客访问: 267404
  • 博文数量: 138
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 971
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-03 10:05
文章分类

全部博文(138)

文章存档

2016年(1)

2015年(137)

我的朋友

分类: Java

2015-05-21 22:00:29

1.JDBC是什么
jdbd的概念
    通俗地说:JDBC是java和关系数据库的之间的桥梁;
     根据"百科名片"所描述:
     JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序是JAVA与数据的连接。因为是完全用C语言编写的,而JAVA中实现与C语言程序的通信是比较困难的,因此就产生了由JAVA语言编写的用于JAVA程序与数据库连接的接口技术。

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中的接口和类.

2 JDBC原理
结构:
 DriverManager (是一工厂实现类,用了工厂方法模式) DriverManager类此类用于装载驱动程序,它所有的成员都是静态成员,所以在程序中无须对它进行实例化,直接通过类名就可以访问它。DriverManager类是JDBC的管理层,作                           用于用户和驱动程序间
    |
 Dirver  (是驱动程序对象的接口,指向具体数据库驱动程序对象=DriverManager.getDriver(String URL))  加载驱动原型Class.forName(“公司名.数据库名.驱动程序名”)
    |
 Connection (是连接对象接口,指向具体数据库连接对象=Drivermanager.getConnection(String URL)) 加载Driver类并在DriverManager类注册后,(驱动就可用来与数据库建立连接。当调用Driver.Manager.getConnection()发出连连接请                                                求时,DriverManager将检查每个驱动程序,看它是否可以建立连接。
                                                              建立连接原型  Connection getConnection(String url,String user,String password) 
                                                      其中user和password是登录数据库的用户和密码
                                                      第一个参数是指向数据库的url,它的格式如下:jdbc:(subprotocol):(subname)
                                                                                   subprotocol:子协议,指定连接何种数据库或用什么方式连接数据库
                                                                                   subname:确立一个连接,可以是一个数据源名,也可以是指向一个网上数据库

    |
 Statement (执行静态SQL语句接口,=Connection.CreateStatement())
    |
 ResultSet  (是指向结果集对象的接口,=Statement.excuteXXX())

<2>.工作原理:
1.装载驱动程序:(实例化时自动向DriverManager注册(DriverManager.registerDriver())
 <1>.Class.forName(driver) 
 <2>.Class.forName(driver).newInstance()
 <3>.new driver()

2.取得数据库连接(Connect to the DataBase)
 <1>.用DriverManager取数据库连接
     Connection cn = DriverManager.getConnection(url,uid,pwd);

 <2>.用jndi(java的命名和目录服务)方式:多用于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                  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();


阅读(1009) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~