一、什么是JDBC?
Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。

二、JDBC应用流程
以下是我们使用JDBC进行数据访问时的常规步骤,如果感觉理解起来有一点云里雾里也没关系,可以看看后面的代码自己实践体会一下。
1. 加载驱动类
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
2. 创建数据库连接
String url = "jdbc:mysql://localhost:3306/databasename";
Connection connection = DriverManager.getConnection(url, "username", "password");
3. 创建数据库操作通道
Statement statement = connection.createStatement();
4. 执行数据操作,返回结果集
ResultSet resultSet = statement.executeQuery("sql statement");
5. 解析并处理结果集
resultSet.getInt(1);//获取结果集的第1列(必须能够以int类型接收)
resultSet.getString(2);//获取结果集的第2列(必须能够以String类型接收)
resultSet.getDate(3);//获取结果集的第3列(必须能够以Date类型接收)
6. 关闭数据接口(注意关闭顺序)
resultSet.close();
statement.close();
connection.close();
三、绑定statement的数据访问示例
假定我们新建了一个数据库名为test,里面有一张表user,里面的结构和数据如下图所示:

1.使用Statement进行数据访问
废话不多说,直接贴代码:
import java.sql.*;public class MysqlTest {private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/";private static final String DATABASE_NAME = "test";private static final String DATABASE_USERNAME = "root";private static final String DATABASE_PASSWORD = "root";public static void main(String[] args) {try {//1.注册数据库驱动DriverManager.registerDriver(new com.mysql.jdbc.Driver());//Class.forName("com.mysql.jdbc.Driver");System.out.println("注册驱动成功!");} catch (Exception e1) {System.out.println("注册驱动失败!");e1.printStackTrace();return;}String url = DATABASE_URL + DATABASE_NAME;Connection conn = null;try {//2.创建并获取数据库连接conn = DriverManager.getConnection(url, DATABASE_USERNAME, DATABASE_PASSWORD);//3.设置statement对象Statement stmt = conn.createStatement();System.out.println("创建Statement成功!");//4.通过statement执行SQL语句并获取结果ResultSet rs = stmt.executeQuery("select id,username from user order by id desc limit 0, 3");while (rs.next()) {//5.对结果集进行解析处理System.out.println(rs.getInt(1) + "," + rs.getString(2));}//6.释放资源。顺序:ResultSet→Statement→Connectionrs.close();stmt.close();} catch (SQLException e) {e.printStackTrace();} finally {try {if (null != conn) {conn.close();}} catch (SQLException e) {e.printStackTrace();}}}
}
具体的逻辑在注释中写的比较清楚了,就不多加赘述了。
运行后结果如下:
5,John
4,Peter
3,Jack
这里有一个小tip:使用Statement无法防止SQL注入攻击。对SQL注入攻击如果感兴趣的话可以走传送门:
sql注入_百度百科baike.baidu.com
2.使用PreparedStatement进行数据访问
PreparedStatement是继承了Statement的接口。它与Statement的最大不同之处是,PreparedStatement会对SQL语句先做预编译,以防止SQL注入。
//An object that represents a precompiled SQL statement.
public interface PreparedStatement extends Statement {
}
来看看使用PreparedStatement进行数据访问的代码示例,与使用Statement的代码非常相似,小有不同:
import java.sql.*;public class MysqlTest {private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/";private static final String DATABASE_NAME = "test";private static final String DATABASE_USERNAME = "root";private static final String DATABASE_PASSWORD = "root";public static void main(String[] args) {try {//1.注册数据库驱动DriverManager.registerDriver(new com.mysql.jdbc.Driver());//Class.forName("com.mysql.jdbc.Driver");System.out.println("注册驱动成功!");} catch (Exception e1) {System.out.println("注册驱动失败!");e1.printStackTrace();return;}String url = DATABASE_URL + DATABASE_NAME;Connection conn = null;try {//2.创建并获取数据库连接conn = DriverManager.getConnection(url, DATABASE_USERNAME, DATABASE_PASSWORD);//3.设置preparedStatement对象PreparedStatement stmt = conn.prepareStatement("select id,username from user order by id desc limit ?,?");System.out.println("创建PreparedStatement成功!");//4.为preparedStatement绑定参数stmt.setInt(1, 0);stmt.setInt(2, 3);//4.通过preparedStatement执行SQL语句并获取结果ResultSet rs = stmt.executeQuery();while (rs.next()) {//5.对结果集进行解析处理System.out.println(rs.getInt(1) + "," + rs.getString(2));}//6.释放资源。顺序:ResultSet→preparedStatement→Connectionrs.close();stmt.close();} catch (SQLException e) {e.printStackTrace();} finally {try {if (null != conn) {conn.close();}} catch (SQLException e) {e.printStackTrace();}}}
}
这里运行结果和使用Statement的相同:
5,John
4,Peter
3,Jack
四、传统JDBC存在的问题
通过我们实际的JDBC代码实践,可以体会到以下几点:
1.频繁创建释放连接,系统开销大
2.SQL语句硬编码在Java代码中,不易维护
3.结果集解析复杂
4.……
所以这才引入了我们的ORM框架:
孑辞:STEP5.1 初识MyBatiszhuanlan.zhihu.com