Java提供了多种方式连接数据库并读取数据。最常见的方式是使用JDBC(Java Database Connectivity)。下面是通过JDBC连接数据库并读取数据的基本方法。
1. 使用JDBC连接数据库并读取数据
连接数据库的步骤通常包括以下几步:
加载数据库驱动程序
获取数据库连接
创建SQL语句
执行SQL查询
处理查询结果
关闭连接
示例代码:
javaCopy Codeimport java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
public class JdbcReadExample {
public static void main(String[] args) {
// 数据库连接信息
String url = "jdbc:mysql://localhost:3306/mydatabase";
String user = "root";
String password = "password";
// SQL查询语句
String sql = "SELECT * FROM users";
try {
// 1. 加载数据库驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 获取数据库连接
Connection conn = DriverManager.getConnection(url, user, password);
// 3. 创建Statement对象
Statement stmt = conn.createStatement();
// 4. 执行SQL查询
ResultSet rs = stmt.executeQuery(sql);
// 5. 处理查询结果
while (rs.next()) {
// 获取每行的用户名并打印
System.out.println(rs.getString("username"));
}
// 6. 关闭连接和资源
rs.close();
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
步骤解释:
加载驱动:Class.forName("com.mysql.cj.jdbc.Driver");加载数据库驱动程序,通常在JDBC中需要指定驱动来连接不同类型的数据库。
获取连接:DriverManager.getConnection(url, user, password);使用DriverManager类来获取数据库连接。
创建Statement:Connection.createStatement()方法用于创建执行SQL查询的Statement对象。
执行查询:Statement.executeQuery(sql)用于执行SELECT查询并返回ResultSet对象。
处理结果:通过ResultSet获取查询结果。rs.getString("columnName")方法获取结果集中特定列的数据。
关闭资源:最后,使用close()方法关闭数据库连接和其他资源,避免资源泄漏。
2. 使用PreparedStatement执行查询
虽然上面的代码适用于简单的查询,推荐使用PreparedStatement来避免SQL注入问题并提高性能。PreparedStatement可以有效地防止SQL注入攻击。
示例代码:
javaCopy Codeimport java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class JdbcPreparedStatementExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydatabase";
String user = "root";
String password = "password";
String sql = "SELECT * FROM users WHERE username = ?";
try {
// 1. 加载数据库驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 获取数据库连接
Connection conn = DriverManager.getConnection(url, user, password);
// 3. 创建PreparedStatement对象
PreparedStatement stmt = conn.prepareStatement(sql);
// 4. 设置参数
stmt.setString(1, "john_doe");
// 5. 执行查询
ResultSet rs = stmt.executeQuery();
// 6. 处理查询结果
while (rs.next()) {
System.out.println(rs.getString("username"));
}
// 7. 关闭连接和资源
rs.close();
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
说明:
使用PreparedStatement可以设置查询条件的参数(在SQL语句中用?表示),通过stmt.setString(1, "john_doe");设置参数值。
PreparedStatement不仅防止了SQL注入,还可以提高多次执行类似查询时的性能,因为数据库可以复用已编译的查询计划。
3. 使用数据库连接池(HikariCP)
当涉及高并发或复杂应用时,使用数据库连接池(如HikariCP)是一个好选择。连接池管理连接的创建、复用和关闭,从而提升性能。
示例代码:
javaCopy Codeimport com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class HikariCPExample {
public static void main(String[] args) {
// 配置HikariCP连接池
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/mydatabase");
config.setUsername("root");
config.setPassword("password");
// 创建连接池
HikariDataSource dataSource = new HikariDataSource(config);
String sql = "SELECT * FROM users WHERE username = ?";
try (Connection conn = dataSource.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql)) {
// 设置查询条件
stmt.setString(1, "john_doe");
// 执行查询
ResultSet rs = stmt.executeQuery();
// 处理查询结果
while (rs.next()) {
System.out.println(rs.getString("username"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭连接池
dataSource.close();
}
}
}
JDBC:适用于简单、轻量的数据库连接和查询。
PreparedStatement:适用于防止SQL注入并提高执行效率。
连接池:用于高并发应用,管理数据库连接的复用和性能优化。