JDBC

什么是JDBC

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

JDBC 的使用

建立一个JDBC应用程序,本教程中以Java连接MySQL为一个示例:

  1. 导入包,在程序中包含数据库编程所需的JDBC类。大多数情况下,使用 import java.sql.*
1
import java.sql.*;
  1. 注册JDBC驱动程序,需要初始化驱动程序,这样就可以打开与数据库的通信。
1
Class.forName("com.mysql.jdbc.Driver");
  1. 打开一个连接,使用DriverManager.getConnection()方法来创建一个Connection对象,它代表一个数据库的物理连接。
1
2
3
4
static final String USER = "root"; //用户名
static final String PASS = "pwd123456"; //密码
System.out.println("Connecting to database...");
conn = DriverManager.getConnection(DB_URL,USER,PASS); //上面的名字可以自定义的 但是这里要写对

4.执行一个查询, 需要使用一个类型为Statement或PreparedStatement的对象,并提交一个SQL语句到数据库执行查询。

1
2
3
4
5
System.out.println("Creating statement...");
stmt = conn.createStatement();
String sql;
sql = "SELECT id, first, last, age FROM Employees";
ResultSet rs = stmt.executeQuery(sql);

如果要执行一个SQL语句:UPDATE,INSERT或DELETE语句,那么需要下面的代码:

1
2
3
4
5
System.out.println("Creating statement...");
stmt = conn.createStatement();
String sql;
sql = "DELETE FROM Employees";
ResultSet rs = stmt.executeUpdate(sql);
  1. 获取结果,可以使用适当的ResultSet.getXXX()方法来检索的数据结果。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    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");

    //Display values
    System.out.print("ID: " + id);
    System.out.print(", Age: " + age);
    System.out.print(", First: " + first);
    System.out.println(", Last: " + last);
    }
  2. 清理环境资源,在使用JDBC与数据交互操作数据库中的数据后,应该明确地关闭所有的数据库资源以减少资源的浪费,对依赖于JVM的垃圾收集。

1
2
3
rs.close();
stmt.close();
conn.close();
  1. 完整示例。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// 1. 
import java.sql.*;

public class FirstExample {
//注册驱动
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost/test";

//数据库名和密码自己修改
static final String USER = "username";
static final String PASS = "password";

public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try{
// 2.
Class.forName("com.mysql.jdbc.Driver");
//3.
conn = DriverManager.getConnection(DB_URL,USER,PASS);
//4.
stmt = conn.createStatement();
String sql;
sql = "SELECT id, first, last, age FROM Employees";
ResultSet rs = stmt.executeQuery(sql);
//5.
while(rs.next()){
int id = rs.getInt("id");
int age = rs.getInt("age");
String first = rs.getString("first");
String last = rs.getString("last");

System.out.print("ID: " + id);
System.out.print(", Age: " + age);
System.out.print(", First: " + first);
System.out.println(", Last: " + last);
}
//6.
rs.close();
stmt.close();
conn.close();
}catch(SQLException se){
// 异常不要这么处理 不好,要携带异常描述和原因。有日志要用日志输出。
se.printStackTrace();
}catch(Exception e){
e.printStackTrace();// 同上
}finally{
try{
if(stmt!=null)
stmt.close();
}catch(SQLException se2){
//自定义后续处理,这里不写了
}
try{
if(conn!=null)
conn.close();
}catch(SQLException se){
se.printStackTrace();
}
}
}
}

JDBC 的数据类型

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

在JDBC3.0中增强支持BLOB,CLOB,ARRAY,REF等数据类型。ResultSet对象可调用UPDATEBLOB(),updateCLOB(),updateArray()和updateRef()方法,使您可以在数据库服务器上直接操作相应的数据。

对于setXXX()和updateXXX()方法,可以转换成特定的Java类型到特定的JDBC数据类型。而使用setObject()和updateObject()方法,几乎所有的Java类型映射到JDBC数据类型。

ResultSet对象提供相应的getXXX()方法为每个数据类型来检索列值。每一种类型方法,可以使用与列名或由列的序号位置来获取列的数据。