一 .JDBC的作用
JDBC的作用是将Java代码和数据库连接起来,使Java应用程序能够执行SQL语句并获取数据。它允许开发人员通过Java代码访问数据库表、执行SQL操作、处理结果集,还可以实现事务管理、连接池等功能。通常,开发人员需要配置一个JDBC驱动程序,以便Java应用程序能够与数据库进行通信。
二.JDBC四个核心的对象
-
Connection(连接)对象:Connection对象表示与数据库建立连接,用于创建和执行SQL语句,提交和回滚事务等操作。
-
Statement(语句)对象:Statement对象用于执行SQL语句,并返回结果集。它还可以用于执行批处理操作。
-
ResultSet(结果集)对象:ResultSet对象表示数据库查询结果集。结果集包含了查询语句从数据库中返回的所有行,可以通过ResultSet对象来访问这些数据。
-
PreparedStatement(预编译语句)对象:PreparedStatement对象继承了Statement对象的所有方法,并且可以更有效地执行重复的SQL语句,可以使用占位符来避免SQL注入攻击。
三.JDBC的使用步骤
- 导入JDBC驱动程序:通过使用Class.forName方法加载数据库的JDBC驱动程序,使得JDBC可以访问数据库。
- 建立与数据库的连接:使用java.sql包中的DriverManager.getConnection方法,获取与数据库的连接。
- 创建Statement对象:为了向数据库发送SQL语句,需要使用java.sql包中的Statement接口的实现类,如Statement或PreparedStatement创建Statement对象。
- 执行SQL语句:使用Statement对象的executeQuery()或executeUpdate()方法执行SQL语句。
- 处理结果集:对于查询操作需要使用ResultSet对象来处理查询结果,处理方式包括获取ResultSet中的元素数据,或使用JavaBean封装ResultSet结果。
- 释放资源:释放Statement对象和数据库连接,以及ResultSet对象等占用的资源,以保证程序的性能和安全。
- 异常处理:使用try-catch-finally来捕获并处理异常,保证连接及资源的关闭。
具体实现可以参考如下示例:
import java.sql.*;
public class JdbcSample {
public static void main(String[] args) {
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try {
// 1. 导入JDBC驱动程序
Class.forName("com.mysql.jdbc.Driver");
// 2. 建立与数据库的连接
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
// 3. 创建Statement对象
stmt = con.createStatement();
// 4. 执行SQL语句
rs = stmt.executeQuery("SELECT * FROM users");
// 5. 处理结果集
while (rs.next()) {
System.out.println(rs.getString("id") + "\t" + rs.getString("name"));
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
// 6. 释放资源
try {
if (rs != null) rs.close();
if (stmt != null) stmt.close();
if (con != null) con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
四.SQL注入
JDBC SQL注入是指攻击者利用JDBC接口中未进行足够输入验证的漏洞,通过构造恶意的SQL语句,从而获取数据库中的数据或者实施非法操作的攻击行为。攻击者会针对Web应用程序的输入界面或参数化查询等特殊接口进行攻击,通过输入恶意的SQL代码来欺骗应用程序,从而访问或篡改数据库中的数据。
为了避免此类攻击,应用程序需要对输入进行严格的验证和过滤,从而防止恶意的SQL代码被注入到数据库中。同时,也需要使用参数化查询方式来避免SQL注入攻击。在设计数据库时,应该对表和字段进行适当的命名和权限设置,限制用户的操作权限,从而提高数据库的安全性。
推荐使用PreparedStatemen
PreparedStatement ps = con.prepareStatement(sql);
sql语句中的参数可以使用?代替
statement.setInt(索引,值); 索引从1开始的
setXXX XXX代表数据类型
五.工具类
常见的JDBC工具类包括:
-
JDBCUtils:提供了连接数据库、获取PreparedStatement和ResultSet对象、关闭连接等方法。
-
DBUtil:提供了连接数据库、执行查询和更新操作、关闭连接等方法。
-
JdbcTemplate:Spring框架提供的JDBC工具类,封装了JDBC操作,提供了更加方便的API。
import java.sql.*;
public class JdbcUtil {
private static final String URL = "jdbc:mysql://localhost:3306/test"; // 数据库连接地址
private static final String USERNAME = "root"; // 数据库用户名
private static final String PASSWORD = "123456"; // 数据库密码
static {
try {
Class.forName("com.mysql.jdbc.Driver"); // 加载数据库驱动
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
// 获取数据库连接对象
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USERNAME, PASSWORD);
}
// 关闭资源
public static void close(Connection conn, Statement stmt, ResultSet rs) {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (stmt != null) {
stmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}