JDBC

  • 定义

JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据。JDBC代表Java DataBase Connection。

 

  • JDBC架构

JDBC API支持两层和三层处理模型进行数据库访问,但在一般的JDBC体系结构由两层组成:

  • JDBC API: 提供了应用程序对JDBC的管理连接。
  • JDBC Driver API: 支持JDBC管理到驱动器连接。
  • JDBC API的使用驱动程序管理器和数据库特定的驱动程序提供透明的连接到异构数据库。
  • JDBC驱动程序管理器可确保正确的驱动程序来访问每个数据源。该驱动程序管理器能够支持连接到多个异构数据库的多个并发的驱动程序。

主要接口和类:

  • DriverManager: 这个类管理数据库驱动程序的列表。确定内容是否符合从Java应用程序使用的通信子协议正确的数据库驱动程序的连接请求。识别JDBC在一定子协议的第一个驱动器将被用来建立数据库连接。
  • Driver: 此接口处理与数据库服务器通信。很少直接使用驱动程序(Driver)对象,一般使用DriverManager中的对象,它用于管理此类型的对象。它也抽象与驱动程序对象工作相关的详细信息
  • Connection : 此接口与接触数据库的所有方法。连接对象表示通信上下文,即,与数据库中的所有的通信是通过此唯一的连接对象。
  • Statement : 可以使用这个接口创建的对象的SQL语句提交到数据库。一些派生的接口接受除执行存储过程的参数。
  • ResultSet: 这些对象保存从数据库后,执行使用Statement对象的SQL查询中检索数据。它作为一个迭代器,可以通过移动它来检索下一个数据。
  • SQLException: 这个类用于处理发生在数据库应用程序中的任何错误。

 

  • 步骤

 

  1. 打开一个连接

使用DriverManager.getConnection()方法来创建一个Connection对象,它代表一个数据库的物理连接,如下所示:

Connection conn = null;

        try {

//载入驱动程序

            Class.forName("com.mysql.jdbc.Driver");

//问好之后的事情可以使java与数据库的编码相同           

String url = "jdbc:mysql://localhost:3306/blobsystem?useUnicode=true&characterEncoding=utf8";

//连接         

String user = "root";

            String password = "";

            conn = DriverManager.getConnection(url, user, password);

        } catch (Exception e) {

            e.printStackTrace();

            System.out.println("连接失败");

    }

  1.  执行一个查询

需要使用一个类型为StatementPreparedStatement的对象,并提交一个SQL语句到数据库执行查询。如下:

Statement stmt = conn.createStatement();

String sql = "SELECT id, first, last, age FROM Employees";

ResultSet rs = stmt.executeQuery(sql);

如果要执行一个SQL语句:UPDATEINSERTDELETE语句,那么需要下面的代码片段(PreparedStatement):

con.createStatement();

PreparedStatement psmt = con.prepareStatement(sql);

psmt.executeUpdate();

进行数据库插入操作的时候使用 PreparedStatement 更好,好处如下:

  • 1.PreparedStatement可以写动态参数化的查询;
  • 2.PreparedStatement Statement 更快;
  • 3.PreparedStatement可以防止SQL注入式攻击

 

  1.  从结果集中提取数据

这一步中演示如何从数据库中获取查询结果的数据。可以使用适当的ResultSet.getXXX()方法来检索的数据结果如下:

ResultSet rs = stm.executeQuery(sql);

while(rs.next()){

    //Retrieve by column name

    int id  = rs.getInt("id");

    int age = rs.getInt("age");

    String first = rs.getString("first");

    String last = rs.getString("last");

}

  1. JDBC批量处理

批处理允许执行一个批处理组相关的SQL语句,并将其一次提交到数据库中执行。当几个SQL语句一次发送到数据库中时,可以减少通信开销,从而提高性能。

  • JDBC驱动程序不支持此功能。您应该使用DatabaseMetaData.supportsBatchUpdates()方法来确定目标数据库支持批量更新处理。如果JDBC驱动程序支持此功能,则该方法返回true
  • addBatch()方法是PreparedStatementCallableStatementis类中用于添加单个语句的批处理的声明。 executeBatch()将所有语句组合到一起并执行。
  • executeBatch()将返回一个整数数组,每个数组元素的表示为相应的更新语句的更新计数。
  • 添加语句进行批处理时,可以使用clearBatch()方法删除它们。此方法将删除addBatch()方法添加的所有语句。但是不能有选择性地选择某个语句来删除。

 

 

  • SQL数据类型与JAVA数据类型对应关系:

 

SQL

JDBC/Java

setXXX

updateXXX

VARCHAR

java.lang.String

setString

updateString

CHAR

java.lang.String

setString

updateString

LONGVARCHAR

java.lang.String

setString

updateString

BIT

boolean

setBoolean

updateBoolean

NUMERIC

java.math.BigDecimal

setBigDecimal

updateBigDecimal

TINYINT

byte

setByte

updateByte

SMALLINT

short

setShort

updateShort

INTEGER

int

setInt

updateInt

BIGINT

long

setLong

updateLong

REAL

float

setFloat

updateFloat

FLOAT

float

setFloat

updateFloat

DOUBLE

double

setDouble

updateDouble

VARBINARY

byte[ ]

setBytes

updateBytes

BINARY

byte[ ]

setBytes

updateBytes

DATE

java.sql.Date

setDate

updateDate

TIME

java.sql.Time

setTime

updateTime

TIMESTAMP

java.sql.Timestamp

setTimestamp

updateTimestamp

CLOB

java.sql.Clob

setClob

updateClob

BLOB

java.sql.Blob

setBlob

updateBlob

ARRAY

java.sql.Array

setARRAY

updateARRAY

REF

java.sql.Ref

SetRef

updateRef

STRUCT

java.sql.Struct

SetStruct

updateStruct

 

 

  • 使用实例:

见项目JDBCTest

 

一些需要注意的地方:

增删改的PreparedStatement执行语句为:

int i = ps.executeUpdate();

查因为不需要更新,而且返回的是结果集,所以执行语句为:

ResultSet rs=ps.executeQuery();

结果集如果没有查询到任何结果,rs.getMetaData().getColumnCount();获得的行数也为1,所以遍历结果集,i要从1开始。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值