@[TOC]
JDBC(Java Database Connectivity)是Java的一种数据库访问标准,它提供了一套API,使得我们可以通过Java程序来访问和操作各种关系型数据库。
下面我们详细介绍JDBC编程,包括JDBC的概念、JDBC的常用API以及示例代码。
JDBC的概念
JDBC是Java的一种数据库访问标准,它提供了一套API,使用这些API可以让Java程序连接各种关系型数据库,并且进行数据的增、删、改、查等操作。
JDBC的架构分为两部分:JDBC API和JDBC Driver。JDBC API定义了Java程序与数据库之间的接口规范;JDBC Driver则负责将Java程序中的JDBC API调用转换成特定数据库的协议,实现与特定数据库的通信。
在JDBC编程中,开发者需要关注以下几个核心概念:
- Connection(连接对象):表示与数据库的连接。
- Statement(语句对象):表示执行SQL语句的对象。
- ResultSet(结果集对象):表示查询结果集的对象。
- PreparedStatement(预编译语句对象):表示一个预编译的SQL语句对象,可以有效地防止SQL注入攻击。
- CallableStatement(存储过程对象):表示调用存储过程的对象。
JDBC的常用API
在使用JDBC之前,需要先加载相应的数据库驱动程序。可以通过Class.forName()方法实现。
Class.forName("com.mysql.jdbc.Driver");
使用DriverManager.getConnection()方法建立与数据库的连接。
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, user, password);
通过Connection对象创建Statement对象。
Statement stmt = conn.createStatement();
通过Statement对象执行SQL语句。
String sql = "SELECT * FROM users";
ResultSet rs = stmt.executeQuery(sql); // 查询操作
对于查询操作,可以通过ResultSet对象获取查询结果集中的数据。
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println("id=" + id + ", name=" + name + ", age=" + age);
}
在使用完JDBC资源后,需要及时关闭它们,以释放内存和资源。
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
JDBC示例代码
下面是一个使用JDBC进行简单查询的示例代码。
import java.sql.*;
public class JdbcDemo {
public static void main(String[] args) {
try {
// 加载MySQL驱动程序
Class.forName("com.mysql.jdbc.Driver");
// 建立与MySQL的连接
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, user, password);
// 创建Statement对象
Statement stmt = conn.createStatement();
// 执行查询操作
String sql = "SELECT * FROM users WHERE age > 18";
ResultSet rs = stmt.executeQuery(sql);
// 处理查询结果
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println("id=" + id + ", name=" + name + ", age=" + age);
}
// 关闭资源
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException
e) {
e.printStackTrace();
}
}
}
上面的代码使用了JDBC连接到MySQL数据库,并执行了一个查询操作,将年龄大于18岁的用户信息打印出来。在代码中使用了try-catch语句块捕获了异常,并在finally块中关闭了资源。
需要注意的是,在实际开发中,建议使用连接池来管理数据库连接,以提高性能和可靠性。常用的连接池有Apache Commons DBCP和C3P0等。
下面再来介绍一些JDBC的高级特性。
PreparedStatement
使用PreparedStatement可以有效地防止SQL注入攻击,并提升SQL语句执行效率。它是Statement的一个子类,用于预编译SQL语句,然后在执行时只需要传递参数即可。
下面是一个使用PreparedStatement执行插入操作的示例代码。
import java.sql.*;
import org.apache.commons.dbcp2.BasicDataSource;
public class JdbcDemo {
public static void main(String[] args) {
BasicDataSource dataSource = new BasicDataSource();
// 设置数据库连接信息
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/test");
dataSource.setUsername("root");
dataSource.setPassword("123456");
try {
// 从连接池中获取连接
Connection conn = dataSource.getConnection();
// 创建PreparedStatement对象
String sql = "INSERT INTO users(name, age) VALUES (?, ?)";
PreparedStatement stmt = conn.prepareStatement(sql);
// 设置参数值
stmt.setString(1, "Tom");
stmt.setInt(2, 25);
// 执行插入操作
int count = stmt.executeUpdate();
System.out.println(count + " rows affected.");
// 关闭资源
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
在上面的代码中,使用了PreparedStatement的setXXX()方法设置参数值,然后通过executeUpdate()方法执行插入操作。
CallableStatement
使用CallableStatement可以调用存储过程,它是PreparedStatement的另一个子类。
下面是一个使用CallableStatement调用存储过程的示例代码。
import java.sql.*;
import org.apache.commons.dbcp2.BasicDataSource;
public class JdbcDemo {
public static void main(String[] args) {
BasicDataSource dataSource = new BasicDataSource();
// 设置数据库连接信息
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/test");
dataSource.setUsername("root");
dataSource.setPassword("123456");
try {
// 从连接池中获取连接
Connection conn = dataSource.getConnection();
// 创建CallableStatement对象
String sql = "{CALL get_user(?, ?)}";
CallableStatement stmt = conn.prepareCall(sql);
// 设置参数值
stmt.setInt(1, 1);
// 注册输出参数类型
stmt.registerOutParameter(2, Types.VARCHAR);
// 执行存储过程
stmt.execute();
// 获取输出参数值
String name = stmt.getString(2);
System.out.println("User name: " + name);
// 关闭资源
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
在上面的代码中,使用了CallableStatement的registerOutParameter()方法注册输出参数类型,并使用getString()方法获取输出参数值。
总结一下,JDBC是Java的一种数据库访问标准,它提供了一套API,使用这些API可以让Java程序连接各种关系型数据库,并且进行数据的增、删、改、查等操作。JDBC的核心概念包括Connection、Statement、ResultSet、PreparedStatement和CallableStatement等。在实际开发中,建议使用连接池来管理数据库连接,常用的连接池有Apache Commons DBCP和C3P0等。