General JDBC Usage

2018-03-07

JDBC是一个Java标准,为Java连接到相关数据库提供接口。JDBC标准通过java.sql接口设计、实现。独立开发者可以独自实现和扩展专属的JDBC驱动。JDBC基于X/OPEN SQL Call Level Interface(CLI)。JDBC4.0符合SQL 2003标准。

检查JDBC驱动版本

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
import java.sql.*;

class JDBCVersion
{
static {
try {
Class.forName("com.pivotal.jdbc.GreenplumDriver");
} catch (ClassNotFoundException e) {
System.out.println("Driver not found.");
e.printStackTrace();
}
}
public static void main (String args[]) throws SQLException
{
String URL = "jdbc:pivotal:greenplum://host:5432;DatabaseName=dbname";
String USER = "username";
String PWD = "passwd";
Connection conn = null;
try {
conn = DriverManager.getConnection(URL, USER, PWD);
DatabaseMetaData meta = conn.getMetaData();
System.out.println("JDBC driver version is " + meta.getDriverVersion());
} catch (SQLException e) {
System.out.println("Connection failed.");
e.printStackTrace();
}
}
}

这里的数据库是Pivotal的Greenplum。不同数据库驱动的详细参数应该查看对应文档。主要区别在于驱动名和URL的内容。

Class.forName("com.pivotal.jdbc.GreenplumDriver")指定了所用的驱动。

String URL = "jdbc:pivotal:greenplum://host:5432;DatabaseName=dbname"指定了数据库的URL。5432是Greenplum和PostgreSQL的默认端口。对于其他数据库,格式会有所不同,具体应该参考相对应的文档。

DriverManager.getConnection(URL, USER, PWD)用来获取相应的数据库连接对象。

执行SQL语句

Statement接口

Statement提供了三个主要的执行SQL语句的方法:execute(), executeQuery(), executeUpdate()
executeQuery()用于查询,方法返回查询内容。
executeUpdate()用于更改操作,返回值为0、1,表示操作的结果。
execute()可以执行所有类型SQL,返回值为0、1,表示操作结果。

执行SQL查询语句:

1
2
3
4
5
6
7
8
9
10
String sql = "SQL query statement to execute";
Connection connection = null;
try {
connection = DriverManager.getConnection(URL, USER, PWD);
Statement statement = connection.createStatement();
ResultSet rs = statement.executeQuery(sql);
} catch (SQLException) {
System.out.println("Connection failed.");
e.printStackTrace();
}

ResultSet rs用来获取查询的结果。

PreparedStatement接口

PreparedStatement接口是Statement的子接口,用于执行带有占位符的SQL语句。PreparedStatement语句的参数要被提供之后才能执行。

PreparedStatement提供了若干setTypename(parameterIndex, value)方法来设置参数。参数的顺序号要和其位置相同,值类型与Typename相同。

1
2
3
4
5
6
String sql = "SELECT a, b FROM table t WHERE t.a BETWEEN ? AND ? AND t.b = ?";// a为Timestamp对象, b为String对象
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setTimestamp(1, timestamp1);
pstmt.setTimestamp(2, timestamp2);
pstmt.setString(3, str);
ResultSet rs = pstmt.executeQuery();

ResultSet获取结果

ResultSet提供了getTypename(columnindex/columnlabel)方法来获取相应的数据。列号列名选择其中一个即可。
ResultSet获取的结果第一次执行.next()之后,将会指向第一个结果。
例如,对于前一小节的查询结果:

1
2
3
4
while (rs.next()) {
Timestamp ts = rs.getTimestamp(1 or "a");
String str = rs.getString(2 or "b");
}

c3p0连接池

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import com.mchange.v2.c3p0.*;

ComboPooledDataSource connectionPool = new ComboPooledDataSource();
try {
connectionPool.setDriverClass("com.pivotal.jdbc.GreenplumDriver");
} catch (PropertyVetoException e) {
e.printStackTrace();
}
connectionPool.setJdbcUrl(URL);
connectionPool.setUser(USER);
connectionPool.setPassword(PWD);
connectionPool.setMaxPoolSize(40); // 连接池最大连接数
connectionPool.setMinPoolSize(2); // 连接池最小连接数
connectionPool.setInitialPoolSize(5); // 连接池初始连接数
connectionPool.setMaxStatements(200); // 最长statement长度

Reference

Java JDBC Tutorial
Interface Connection
Interface Statement
Interface PreparedStatement
Interface ResultSet
swaldman/c3p0

Farewell

..-. . -.