一、什么是JDBC?
Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。
![b3ba3d9a842447cc98af043e7698bf22.png](https://i-blog.csdnimg.cn/blog_migrate/7d6932a55443bc1d8337a72e52fb4de2.jpeg)
二、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,里面的结构和数据如下图所示:
![1a38bdaf47d7835aae6cacf5d16a2247.png](https://i-blog.csdnimg.cn/blog_migrate/d3efb8e27e9f3a6902111dc0b9c5ae29.png)
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→Connection
rs.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![ef4e33ed34b4c559a19080c8b86015d0.png](https://i-blog.csdnimg.cn/blog_migrate/19ca1bc7d63a0f561e66db10ca18c5b8.png)
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→Connection
rs.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![43b1d3f4545a28c1232ee39cfea25fca.png](https://i-blog.csdnimg.cn/blog_migrate/29c26fd22e08935b108414b12bdc47f7.png)