JDBC(Java Database Connectivity)是Java连接数据库的标准API,它提供了一个通用的接口,使得Java程序可以和任何数据库连接,并执行诸如查询、插入和更新等操作。JDBC是Java访问数据库的门票,也是Java应用程序中不可或缺的一部分。
一、快速入门
下面是在Java程序中使用JDBC的一个简单示例:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JDBCDemo { public static void main(String[] args) throws SQLException { // 1. 加载 JDBC 驱动程序 Class.forName("com.mysql.jdbc.Driver"); // 2. 创建数据库连接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "username", "password"); // 3. 创建 Statement 对象 Statement stmt = conn.createStatement(); // 4. 执行 SQL 查询 ResultSet rs = stmt.executeQuery("SELECT * FROM users"); // 5. 处理结果集 while (rs.next()) { System.out.println(rs.getString("name")); } // 6. 释放资源 rs.close(); stmt.close(); conn.close(); } }
上面的代码用JDBC连接到本地MySQL数据库,查询了一个users表的所有记录,并将每条记录的名字(name)打印到控制台。这段代码展示了JDBC连接数据库并执行SQL查询的基本步骤:
1. 加载JDBC驱动程序。
2. 创建数据库连接。
3. 创建Statement对象。
4. 执行SQL查询。
5. 处理结果集。
6. 释放资源。
二、获得连接
在JDBC中,使用Connection
接口来表示数据库连接。连接到数据库需要用到以下三个参数:
url
:表示数据库的URL,形如jdbc:database://host:port/database_name
username
:表示数据库登录的用户名。password
:表示数据库登录的密码。
连接数据库的一种常见方式是使用DriverManager
类,具体示例如下:
Connection conn = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "username", "password"); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); }
三、执行SQL语句
执行SQL语句需要用到Statement
或PreparedStatement
对象。
Statement
可以执行任何类型的SQL语句,但是可能存在SQL注入的问题。代码示例如下:
Statement stmt = null; ResultSet rs = null; try { stmt = conn.createStatement(); rs = stmt.executeQuery("SELECT * FROM users WHERE id = " + id); while (rs.next()) { System.out.println(rs.getString("name")); } } catch (SQLException e) { e.printStackTrace(); } finally { if (rs != null) { rs.close(); } if (stmt != null) { stmt.close(); } }
PreparedStatement
支持预编译的SQL语句,避免了SQL注入问题。代码示例如下:
PreparedStatement stmt = null; ResultSet rs = null; try { stmt = conn.prepareStatement("SELECT * FROM users WHERE id = ?"); stmt.setInt(1, id); rs = stmt.executeQuery(); while (rs.next()) { System.out.println(rs.getString("name")); } } catch (SQLException e) { e.printStackTrace(); } finally { if (rs != null) { rs.close(); } if (stmt != null) { stmt.close(); } }
四、事务处理
JDBC支持事务处理,可以使用Connection
接口的commit
、rollback
和setAutoCommit
方法完成事务处理。
代码示例如下:
conn.setAutoCommit(false); // 关闭自动提交 try { // 执行多条SQL语句 stmt1.execute(); stmt2.execute(); // 提交事务 conn.commit(); } catch (Exception e) { // 回滚事务 conn.rollback(); } finally { conn.setAutoCommit(true); // 恢复自动提交 }
五、连接池
使用JDBC连接数据库时,每次都需要创建连接对象、执行SQL语句和释放资源,这样会消耗大量的时间和资源,而且对于高并发的应用来说,可能会导致连接过多,从而导致数据库的性能下降。
连接池技术的出现就是为了解决这些问题。连接池会维护一些预先创建好的连接,并在需要时分配这些连接。通过连接池可以有效地避免连接过多和频繁创建连接对象的开销,提升应用性能。
常见的Java连接池有C3P0、Druid和HikariCP等。
以HikariCP举例,代码示例如下:
import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; public class ConnectionPoolDemo { private static HikariConfig config = new HikariConfig(); private static HikariDataSource ds; static { config.setJdbcUrl("jdbc:mysql://localhost:3306/test"); config.setUsername("username"); config.setPassword("password"); config.addDataSourceProperty("cachePrepStmts", "true"); config.addDataSourceProperty("prepStmtCacheSize", "250"); config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); ds = new HikariDataSource(config); } public static Connection getConnection() throws SQLException { return ds.getConnection(); } }
六、总结
JDBC是Java访问数据库的重要手段,也是Java应用程序中不可或缺的一部分。本文主要介绍了如何连接数据库、执行SQL语句、进行事务处理和使用连接池。在实际应用中,根据业务需求选择合适的方法和工具来优化数据库访问,提升应用性能。