JDBC
1. 概述
什么是JDBC?
JDBC(Java Database Connectivity)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Java平台对关系数据库进行访问的标准API。
JDBC是Java访问数据库的标准API,它由一组用Java语言编写的类和接口组成。通过JDBC,Java应用程序可以与任何符合JDBC规范的数据库进行交互,从而实现数据的访问和操作。
JDBC的主要功能包括:
- 连接数据库:JDBC提供了连接数据库的方法,可以通过JDBC驱动程序与数据库建立连接。
- 执行SQL语句:JDBC提供了执行SQL语句的方法,可以执行查询、插入、更新和删除等操作。
- 处理结果集:JDBC提供了处理查询结果的方法,可以将查询结果存储在ResultSet对象中,并对其进行遍历和处理。
- 管理事务:JDBC提供了管理事务的方法,可以提交或回滚事务。
- 处理异常:JDBC提供了处理数据库访问异常的方法,可以捕获和处理数据库访问错误。
- 连接池:JDBC提供了连接池的功能,可以管理数据库连接,提高数据库访问的性能。
- 数据类型转换:JDBC提供了数据类型转换的方法,可以将Java数据类型转换为数据库数据类型,反之亦然。
2. 相关对象及作用
JDBC中常用的对象有:
- DriverManager:用于管理数据库连接的类,可以创建数据库连接。
- Connection:表示与数据库的连接,可以执行SQL语句和事务操作。
- Statement:用于执行SQL语句的对象,可以执行查询、插入、更新和删除等操作。
- PreparedStatement:继承自Statement,用于执行预编译的SQL语句,可以提高执行效率。
- ResultSet:用于存储查询结果的对象,可以通过遍历ResultSet对象来获取查询结果。
java
// 注册驱动
// jdk 6 之后可以不写注册驱动
// Class.forName("com.mysql.cj.jdbc.Driver");
// DriverManager.registerDriver(new Driver());
String url = "jdbc:mysql://localhost:3306/spring-tx";
String username = "root";
String password = "123456";
// 获取连接
Connection connection = DriverManager.getConnection(url, username, password);
// 获取执行sql的对象
// Statement statement = connection.createStatement();
PreparedStatement preparedStatement = connection.prepareStatement("select * from t_user where id = ?");
String sql = "select * from t_user";
// 执行sql
// ResultSet resultSet = statement.executeQuery(sql);
preparedStatement.setInt(1, 1);
ResultSet resultSet = preparedStatement.executeQuery(sql);
while (resultSet.next()) {
String name = resultSet.getString("name");
Integer blance = resultSet.getInt("blance");
System.out.println(name + " " + blance);
}
// statement.close();
preparedStatement.close();
connection.close();// 注册驱动
// jdk 6 之后可以不写注册驱动
// Class.forName("com.mysql.cj.jdbc.Driver");
// DriverManager.registerDriver(new Driver());
String url = "jdbc:mysql://localhost:3306/spring-tx";
String username = "root";
String password = "123456";
// 获取连接
Connection connection = DriverManager.getConnection(url, username, password);
// 获取执行sql的对象
// Statement statement = connection.createStatement();
PreparedStatement preparedStatement = connection.prepareStatement("select * from t_user where id = ?");
String sql = "select * from t_user";
// 执行sql
// ResultSet resultSet = statement.executeQuery(sql);
preparedStatement.setInt(1, 1);
ResultSet resultSet = preparedStatement.executeQuery(sql);
while (resultSet.next()) {
String name = resultSet.getString("name");
Integer blance = resultSet.getInt("blance");
System.out.println(name + " " + blance);
}
// statement.close();
preparedStatement.close();
connection.close();3. 连接池
连接池是一种用于管理数据库连接的技术,可以提高数据库访问的性能和可靠性。连接池通过预先创建一定数量的数据库连接,并在需要时将这些连接分配给应用程序,从而避免了频繁地创建和销毁数据库连接的开销。
连接池的主要作用包括:
- 提高数据库访问的性能:连接池可以预先创建一定数量的数据库连接,并在需要时将这些连接分配给应用程序,从而避免了频繁地创建和销毁数据库连接的开销,提高了数据库访问的性能。
- 提高数据库访问的可靠性:连接池可以管理数据库连接,确保数据库连接的可用性和稳定性,避免了数据库连接的异常和错误,提高了数据库访问的可靠性。
- 资源共享:连接池可以共享数据库连接,避免了重复创建和销毁数据库连接的开销,提高了资源的利用率。
- 负载均衡:连接池可以分配数据库连接给多个应用程序,实现了负载均衡,提高了系统的并发处理能力。
- 连接管理:连接池可以管理数据库连接,包括连接的创建、销毁、分配和回收等操作,提高了数据库连接的管理效率。
- 连接监控:连接池可以监控数据库连接的状态,包括连接的数量、使用情况等,为数据库连接的优化和调整提供了依据。
1.常见连接池库
- DBCP:Apache Commons DBCP是一个开源的数据库连接池实现,支持多种数据库和JDBC驱动程序。
- C3P0:C3P0是一个开源的数据库连接池实现,支持多种数据库和JDBC驱动程序。
- Tomcat JDBC Pool:Tomcat JDBC Pool是Tomcat服务器自带的数据库连接池实现,支持多种数据库和JDBC驱动程序。
- HikariCP:HikariCP是一个高性能的数据库连接池实现,支持多种数据库和JDBC驱动程序。
- Druid:Druid是一个开源的数据库连接池实现,支持多种数据库和JDBC驱动程序,具有丰富的功能和性能优化。
Druid
Druid是一个开源的数据库连接池实现,支持多种数据库和JDBC驱动程序,具有丰富的功能和性能优化。Druid具有以下特点:
- 高性能:Druid具有高性能的数据库连接池实现,可以支持高并发和高负载的数据库访问。
- 功能丰富:Druid具有丰富的功能和性能优化,包括连接池管理、连接监控、SQL解析和优化、数据库连接池的配置等。
- 易于使用:Druid具有易于使用的API和配置文件,可以快速地集成到应用程序中。
- 稳定性:Druid具有稳定的数据库连接池实现,可以确保数据库连接的可用性和稳定性。
- 安全性:Druid具有丰富的安全功能和性能优化,包括SQL注入防护、数据库连接池的加密和认证等。
- 扩展性:Druid具有良好的扩展性,可以支持多种数据库和JDBC驱动程序,并且可以自定义连接池的实现。
例子:
java
public class DruidDemo {
public static void main(String[] args) throws SQLException {
// 创建Druid连接池
// DruidDataSource dataSource = new DruidDataSource();
// dataSource.setUrl("jdbc:mysql://localhost:3306/test");
// dataSource.setUsername("root");
// dataSource.setPassword("123456");
// 1. 加载配置文件
Properties properties = new Properties();
// 2. 加载配置文件
InputStream in = DruidTests.class.getResourceAsStream("jdbc.properties");
properties.load(in);
// 3. 获取数据库连接池对象
DruidDataSource dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
// 从连接池获取连接
Connection connection = dataSource.getConnection();
// 创建PreparedStatement
String sql = "SELECT * FROM user WHERE id = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
// 设置参数
preparedStatement.setInt(1, 1);
// 执行查询
ResultSet resultSet = preparedStatement.executeQuery();
// 处理结果集
while (resultSet.next()) {
String name = resultSet.getString("name");
Integer age = resultSet.getInt("age");
System.out.println(name + " " + age);
}
// 关闭连接
resultSet.close();
preparedStatement.close();
connection.close();
}
}public class DruidDemo {
public static void main(String[] args) throws SQLException {
// 创建Druid连接池
// DruidDataSource dataSource = new DruidDataSource();
// dataSource.setUrl("jdbc:mysql://localhost:3306/test");
// dataSource.setUsername("root");
// dataSource.setPassword("123456");
// 1. 加载配置文件
Properties properties = new Properties();
// 2. 加载配置文件
InputStream in = DruidTests.class.getResourceAsStream("jdbc.properties");
properties.load(in);
// 3. 获取数据库连接池对象
DruidDataSource dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
// 从连接池获取连接
Connection connection = dataSource.getConnection();
// 创建PreparedStatement
String sql = "SELECT * FROM user WHERE id = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
// 设置参数
preparedStatement.setInt(1, 1);
// 执行查询
ResultSet resultSet = preparedStatement.executeQuery();
// 处理结果集
while (resultSet.next()) {
String name = resultSet.getString("name");
Integer age = resultSet.getInt("age");
System.out.println(name + " " + age);
}
// 关闭连接
resultSet.close();
preparedStatement.close();
connection.close();
}
}4. 事务
事务是数据库操作的基本单位,它是一组逻辑上相关的一组操作,这些操作要么全部成功,要么全部失败。事务具有原子性、一致性、隔离性和持久性(ACID)的特性。
在Java中,可以使用JDBC来操作数据库事务。以下是一个使用JDBC操作数据库事务的示例:
java
public class TransactionDemo {
public static void main(String[] args) throws SQLException {
// 获取数据库连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123456");
// 开启事务
connection.setAutoCommit(false);
// 执行SQL语句
try {
String sql1 = "UPDATE user SET name = 'Tom' WHERE id = 1";
String sql2 = "UPDATE user SET age = 20 WHERE id = 1";
Statement statement = connection.createStatement();
statement.executeUpdate(sql1);
statement.executeUpdate(sql2);
// 提交事务
connection.commit();
} catch (SQLException e) {
// 发生异常,回滚事务
connection.rollback();
e.printStackTrace();
}
// 关闭连接
statement.close();
connection.close();
}
}public class TransactionDemo {
public static void main(String[] args) throws SQLException {
// 获取数据库连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123456");
// 开启事务
connection.setAutoCommit(false);
// 执行SQL语句
try {
String sql1 = "UPDATE user SET name = 'Tom' WHERE id = 1";
String sql2 = "UPDATE user SET age = 20 WHERE id = 1";
Statement statement = connection.createStatement();
statement.executeUpdate(sql1);
statement.executeUpdate(sql2);
// 提交事务
connection.commit();
} catch (SQLException e) {
// 发生异常,回滚事务
connection.rollback();
e.printStackTrace();
}
// 关闭连接
statement.close();
connection.close();
}
}