第二章 JDBC v1.0
第一部分 JDBC基本操作
一、JDBC操作步骤
1.操作步骤
- 引入数据库驱动的jar包
- 通过
Class.forName("驱动全类名")注册驱动 - 通过
Connection con = DriverManager.getConnection(url, user, psw)创建数据库连接对象 - 创建SQL执行游标对象
Statement stmt = con.createStatement() - 执行SQL语句,返回结果集
ResultSet,如ResultSet rs = stmt.executeQuery(sql); - 循环遍历结果集
- 关闭连接(先开后关,后开先关)
2.示例
import java.sql.*;
public class JdbcLoginRegistrationExample {
public static void main(String[] args) {
Connection connection = null;
Statement statement = null;
try {
// 1. 加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 2. 连接数据库
String url = "jdbc:mysql://localhost:3306/mydb";
String username = "username";
String password = "password";
connection = DriverManager.getConnection(url, username, password);
// 3. 创建Statement对象
statement = connection.createStatement();
// 登录操作
String loginQuery = "SELECT * FROM users WHERE username='admin' AND password='admin123'";
ResultSet loginResult = statement.executeQuery(loginQuery);
if (loginResult.next()) {
System.out.println("Login successful!");
} else {
System.out.println("Login failed!");
}
// 注册操作
String registrationQuery = "INSERT INTO users (username, password) VALUES ('user1', 'password123')";
int rowsInserted = statement.executeUpdate(registrationQuery);
if (rowsInserted > 0) {
System.out.println("Registration successful!");
} else {
System.out.println("Registration failed!");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 4. 关闭连接和释放资源
try {
if (statement != null) statement.close();
if (connection != null) connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}二、连接数据库
以MySQL数据库为例
1.注册驱动
注册MySQL数据库驱动:Class.forName("com.mysql.jdbc.Driver");
2.创建数据库连接对象
MySQL5数据库URL:jdbc:mysql://host:port/database
MySQL8数据库URL:jdbc:mysql://host:port/database?useSSL=true&characterEncoding=utf8
创建数据库连接对象:Connection connection = DriverManager.getConnection(URL, USER, PASS);
使用完关闭数据库连接对象:connection.close();
host = "127.0.0.1";
database = "database";
USER = "username";
PASS = "password";
port = 3306;
URL = "jdbc:mysql://" + host + ":" + port + "/" + database + "?useSSL=false&characterEncoding=utf8";
try {
Class.forName(JdbcConf.JDBC_DRIVER);
SqlOperation.conn = DriverManager.getConnection(URL, USER, PASS);
} catch (ClassNotFoundException classNotFoundException) {
System.err.println("找不到JDBC驱动");
} catch (SQLException sqlException) {
System.err.println("JDBC连接失败");
}三、数据库操作
1.执行游标对象
创建执行游标对象:Statement statement = connection.createStatement();
使用完关闭执行游标对象:statement.close();
2.查询操作
String sql = "sql语句"; // 书写sql语句
Statement statement = connection.createStatement(); // 创建执行游标对象
ResultSet resultSet = statement.executeQuery(sql); // 获得结果集
while (resultSet.next()) { // 解析查询结果集
String name = resultSet.getString("name");
String email = resultSet.getString("email");
System.out.println("Name: " + name + ", Email: " + email);
}3.更新(增删改)操作
String sql = "sql语句"; // 书写sql语句
Statement statement = connection.createStatement(); // 创建执行游标对象
int influenceNumber = statement.executeUpdate(sql); // 执行并获得影响行数四、预编译SQL
使用预编译SQL可以防止SQL注入,同时在多次执行同一条语句时提高执行效率
1.创建预编译游标对象
创建预编译游标对象:PreparedStatement preparedStatement = connection.prepareStatement(sql);
使用完关闭预编译游标对象:preparedStatement.close();
2.查询操作
String sql = "sql语句 ? and ?"; // 书写sql语句,使用?作为占位符
PreparedStatement preparedStatement = connection.prepareStatement(sql); // 创建预编译游标对象
preparedStatement.setObject(1, obj1); //设置第一个参数
preparedStatement.setObject(2, obj2); //设置第二个参数
ResultSet resultSet = preparedStatement.executeQuery(); // 获得结果集
while (resultSet.next()) { // 解析查询结果集
String name = resultSet.getString("name");
String email = resultSet.getString("email");
System.out.println("Name: " + name + ", Email: " + email);
}3.更新(增删改)操作
String sql = "sql语句 ? and ?"; // 书写sql语句,使用?作为占位符
PreparedStatement preparedStatement = connection.prepareStatement(sql); // 创建预编译游标对象
preparedStatement.setObject(1, obj1); //设置第一个参数
preparedStatement.setObject(2, obj2); //设置第二个参数
int influenceNumber = preparedStatement.executeUpdate(); // 执行并获得影响行数五、事务操作
1.事务开启/关闭
JDBC 默认开启自动提交;开启手动事务需要关闭自动提交
关闭事务自动提交(开启事务):connection.setAutoCommit(false);
开启事务自动提交(关闭事务):connection.setAutoCommit(true);
2.提交/回滚事务
事务结束,提交事务:connection.commit();
发生异常,回滚事务:connection.rollback();
第二部分 JDBC连接池
一、常用数据库连接池
1.Durid
Alibaba开源
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.16</version>
</dependency>2.Hikari
Spring默认
二、使用示例
以Durid为例,引入依赖不再详述
1.创建数据源
Properties properties = new Properties(); //可以提前配置直接
properties.put("url", DB_URL);
properties.put("username", USER);
properties.put("password", PASS);
properties.put("driverClassName", "com.mysql.cj.jdbc.Driver");
//创建连接池对象
DataSource DATA_SOURCE = DruidDataSourceFactory.createDataSource(properties);2.获取连接
try (Connection connection = DATA_SOURCE.getConnection()) {
PreparedStatement ps = connection.prepareStatement(sql);
//相关操作
}