JDBC

来源:互联网 发布:淘宝密码对的登不上 编辑:程序博客网 时间:2024/06/14 07:09

JDBC概述

JDBC(Java DataBase Connectivty)从物理结构上说就是Java语言访问数据库的一套接口集合。从本质上来说就是调用者(程序员)和实现者(数据库厂商)之间的协议。JDBC的实现由数据库厂商以驱动程序的形式提供。JDBC API使得开发人员可以使用纯Java的方式来连接数据库,并进行操作。

  • 特性:高度的一致性、简单性
  • ODBC:基于C语言的数据库访问接口

这里写图片描述


JDBC的API介绍

在JDBC中包括了两个包:java.sql和javax.sql。
① java.sql 基本功能。这个包中的类和接口主要针对基本的数据库编程服务,如生成连接、执行语句以及准备语句和运行批处理查询等。同时也有一些高级的处理,比如批处理更新、事务隔离和可滚动结果集等。
② javax.sql 扩展功能。它主要为数据库方面的高级操作提供了接口和类。如为连接管理、分布式事务和旧有的连接提供了更好的抽象,它引入了容器管理的连接池、分布式事务和行集(RowSet)等。
主要对象和接口
注:除了标出的Class,其他均为接口

API 说明 java.sql.Connection 与特定数据库的连接(会话) java.sql.Driver 每个驱动程序类必须实现的接口 java.sql.DriverManager (Class) 管理一组 JDBC 驱动程序的基本服务。 java.sql.Statement 用于执行静态 SQL 语句并返回它所生成结果的对象 java.sql.PreparedStatement 表示预编译的 SQL 语句的对象 java.sql.CallableStatement 用于执行 SQL 存储过程的接口 java.sql.ResultSet 表示数据库结果集的数据表,通常通过执行查询数据库的语句生成 java.sql.ResultSetMetaData 可用于获取关于 ResultSet 对象中列的类型和属性信息的对象

JDBC编程步骤

步骤1: 加载数据库驱动,通常使用Class类的forName()静态方法来加载驱动。

数据库驱动 加载方式 MySQL Class.forName(“com.mysql.jdbc.Driver”); DB2 Class.forName(“com.ibm.db2.jcc.DB2Driver”); Oracle Class.forName(“oracle.jdbc.driver.OracleDriver”); SQL ServerClass.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);
Class.forName("com.mysql.jdbc.Driver");

步骤2:创建数据库的连接,需要定义url、用户名和密码

数据库 url MySQL jdbc:mysql://localhost:3306/test DB2 jdbc:db2://localhost:50000/jdbc Oracle jdbc:oracle:thin:@localhost:jdbc SQL Serverjdbc:sqlserver://localhost:1433;DatabaseName=jdbc
String url="jdbc:mysql://localhost:3306/jdbc";//urlString user="root";//数据库用户名String password="root";//数据库密码Connection conn =null;conn= DriverManager.getConnection(url, user, password);

步骤3:创建一个Statement
Statement实例分为以下三种类型

  1. 执行静态SQL语句:Statement smt = conn.createStatement();
  2. 执行动态SQL语句:PreparedStatement psmt= conn.prepareStatement(sql);
  3. 执行数据库存储过程:CallableStatement cstmt =
    conn.prepareCall(“{CALL demoSp(? , ?)}”) ;

步骤4:执行SQL语句
resultSet= psmt.executeQuery();//返回一个查询结果集合
int result = psmt.executeUpdate();//返回影响记录的条数
执行静态SQL语句时要在执行时要传入SQL语句参数

步骤5:处理结果集

使用Connection对象获得一个Statement,Statement中的executeQuery() 方法可以使用select语句查询,并且返回一个结果集 ResultSet通过遍历这个结果集,可以获得select语句的查寻结果,ResultSet 的next()方法会操作一个游标从第一条记录的前面开始读取,直到最后一条记录。executeUpdate() 方法用于执行 DDL 和 DML 语句,比如可以update,delete操作。

while(resultSet.next()){    System.out.println(resultSet.getString("id"));    System.out.println(resultSet.getInt("age"));}

步骤6:关闭数据库连接
resultSet.close();
psmt.close();
conn.close();
在关闭连接时要保持此顺序关闭。

JDBC中使用Transaction编程

事务四大特性

事务是具备以下特征(ACID)的工作单元

  1. 原子性
    事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行。 原子操作,也就是不可分割的操作,必须一起成功一起失败。
  2. 一致性
    事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。这种特性称为事务的一致性。假如数据库的状态满足所有的完整性约束,就说该数据库是一致的。
  3. 分离性
    分离性指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被其它企图进行修改的事务看到。
  4. 持久性
    持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即一旦一个事务提交,DBMS 保证它对数据库中数据的改变应该是永久性的,耐得住任何系统故障。持久性通过数据库备份和恢复来保证。

事务处理三部曲

①conn.setAutoCommit(false);//把自动提交关闭
②正常的DB操作 //如果有一条SQL语句失败了自动回滚
③ conn.commit();//主动提交或者conn.rollback();//主动回滚

try {    conn.setAutoCommit(false);//把自动提交关闭    conn= DriverManager.getConnection(url, user, password);    psmt= conn.prepareStatement("delete from cms where id=?");    psmt.setInt(0, 1);    psmt.executeUpdate();    conn.commit();//主动提交} catch (SQLException e) {    try {        conn.rollback();//主动回滚    } catch (SQLException e1) {        e1.printStackTrace();    }    e.printStackTrace();}

事务隔离级别

JDBC事务并发产生的问题

  1. 脏读:一个事务读取了另一个并行事务还未提交的数据
  2. 不可重复读:一个事务再次读取之前的数据时,得到的数据不一致,被另一个已提交的事务修改
  3. 幻读:一个事务重新执行一个查询,返回的记录中包含了因为其他最近提交的事务而产生的新记录

事务的隔离级别

TRANSACTION_NONE 不使用事务 TRANSACTION_READ_UNCOMMITTED 可以读取未提交数据 TRANSACTION_READ_COMMITTED 可以避免脏读,不能够读取没提交的最常用的隔离级别 大部分数据库的隔离级别 TRANSACTION_REPEATABLE_READ 可以避免脏读,不可以重复读取 TRANSACTION_SERIALIZABLE 可以避免脏读,不可重复读取和幻读务串行化)会降低数据库效率

以 上 的 五 个 事 务 隔 离 级 别 都 是 在 Connection 类 中 定 义 的 静 态 常 量 , 使 用setTransactionIsolation(int level) 方法可以设置事务隔离级别。
如:con.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);

原创粉丝点击