Java原生JDBC概览
一、是什么?
JDBC是Java DataBase Connectivity的缩写,它是Java程序访问数据库的标准接口。
Java代码并不是直接通过TCP连接去访问数据库,而是通过JDBC接口来访问,而JDBC接口则通过JDBC驱动来实现对数据库的访问。
例如访问MySQL,那么必须编写代码操作JDBC接口。注意到JDBC接口是Java标准库自带的,所以可以直接编译。而具体的JDBC驱动是由数据库厂商提供的。MySQL的JDBC驱动由Oracle提供。
访问某个具体的数据库只需要引入该厂商提供的JDBC驱动。这样保证了Java程序编写的是一套数据库访问代码,却可以访问各种不同的数据库,因为他们都提供了标准的JDBC驱动。
二、怎么用?
所谓JDBC驱动,其实就是一个第三方jar包,我们直接添加一个Maven依赖:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
<scope>runtime</scope>
</dependency>
2.1 连接数据库
首先得先连接到数据库。打开一个Connection时,需要准备URL、用户名和口令。
URL是由数据库厂商指定的格式,MySQL的URL格式是:
jdbc:mysql://<hostname>:<port>/<db>?key1=value1&key2=value2
假设数据库运行在本机localhost
,端口使用标准的3306
,数据库名称是learnjdbc
,那么URL如下:
jdbc:mysql://localhost:3306/learnjdbc?useSSL=false&characterEncoding=utf8
要获取数据库连接,使用如下代码:
// JDBC连接的URL, 不同数据库有不同的格式:
String JDBC_URL = "jdbc:mysql://localhost:3306/test";
String JDBC_USER = "root";
String JDBC_PASSWORD = "password";
// 获取连接:
Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD);
// TODO: 访问数据库
// 关闭连接:
conn.close();
2.2 访问数据库操作
经典的数据库操作CRUD:创建、读取、更新和删除。
(1)创建Sql语句
User login(String name, String pass) {
...
String sql = "SELECT * FROM user WHERE login=? AND pass=?"; //?是占位符
PreparedStatement ps = conn.prepareStatement(sql);
ps.setObject(1, name); //索引从1开始
ps.setObject(2, pass);
...
}
(2)执行Sql语句
ResultSet rs = ps.executeQuery();
(3)获取返回结果
while (rs.next()) {
long id = rs.getLong("id");
long grade = rs.getLong("grade");
String name = rs.getString("name");
String gender = rs.getString("gender");
}
完整代码:
try (Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD)) {
try (PreparedStatement ps = conn.prepareStatement("SELECT id, grade, name, gender FROM students WHERE gender=? AND grade=?")) {
ps.setObject(1, "M"); // 注意:索引从1开始
ps.setObject(2, 3);
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
long id = rs.getLong("id");
long grade = rs.getLong("grade");
String name = rs.getString("name");
String gender = rs.getString("gender");
}
}
}
}