Skip to content

第二章 JDBC v1.0 ​

第一部分 JDBC基本操作 ​

一、JDBC操作步骤 ​

1.操作步骤 ​

  1. 引入数据库驱动的jar包
  2. 通过Class.forName("驱动全类名")注册驱动
  3. 通过Connection con = DriverManager.getConnection(url, user, psw)创建数据库连接对象
  4. 创建SQL执行游标对象Statement stmt = con.createStatement()
  5. 执行SQL语句,返回结果集ResultSet,如ResultSet rs = stmt.executeQuery(sql);
  6. 循环遍历结果集
  7. 关闭连接(先开后关,后开先关)

2.示例 ​

java
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();

java
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.查询操作 ​

java
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.更新(增删改)操作 ​

java
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.查询操作 ​

java
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.更新(增删改)操作 ​

java
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开源

xml
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.2.16</version>
</dependency>

2.Hikari ​

Spring默认

二、使用示例 ​

以Durid为例,引入依赖不再详述

1.创建数据源 ​

java
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.获取连接 ​

java
try (Connection connection = DATA_SOURCE.getConnection()) {
    PreparedStatement ps = connection.prepareStatement(sql);
    //相关操作
}