继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

7.2. 数据库连接与操作

移动安全星球
关注TA
已关注
手记 150
粉丝 2
获赞 17

1. 使用数据库连接池

数据库连接池可以提高应用程序的性能,因为建立数据库连接是一个耗时的操作。许多开源和商业的连接池实现可供选择,如HikariCP、Apache DBCP和C3P0等。以下是一个简单示例,演示如何使用HikariCP连接池:

首先,在项目中添加HikariCP依赖:

Maven:

<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>4.0.3</version>
</dependency>

Gradle:

implementation 'com.zaxxer:HikariCP:4.0.3'

接下来,配置并使用HikariCP连接池:

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import java.sql.Connection;
import java.sql.SQLException;

public class JdbcConnectionPoolExample {
    private static HikariDataSource dataSource;

    static {
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true");
        config.setUsername("root");
        config.setPassword("mypassword");
        config.setMaximumPoolSize(10);
        config.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource = new HikariDataSource(config);
    }

    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }

    public static void main(String[] args) {
        try (Connection connection = getConnection()) {
            System.out.println("Connected to database!");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

2. 执行批处理

批处理可以将多个SQL语句组合成一个批次,一次性发送给数据库服务器执行。这样可以减少网络往返次数,提高性能。以下是一个简单示例,演示如何使用批处理插入数据:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class JdbcBatchProcessingExample {
    public static void main(String[] args) {
        try {
            // 加载数据库驱动并连接到数据库
            Class.forName("com.mysql.cj.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true";
            String username = "root";
            String password = "mypassword";
            Connection connection = DriverManager.getConnection(url, username, password);

            // 使用PreparedStatement创建批处理
            String sql = "INSERT INTO users (name, age) VALUES (?, ?)";
            PreparedStatement preparedStatement = connection.prepareStatement(sql);

            // 添加批处理参数
            preparedStatement.setString(1, "User 1");
            preparedStatement.setInt(2, 20);
            preparedStatement.addBatch();

            preparedStatement.setString(1, "User 2");
            preparedStatement.setInt(2, 25);
            preparedStatement.addBatch();

            preparedStatement.setString(1, "User 3");
            preparedStatement.setInt(2, 30);
            preparedStatement.addBatch();

            // 执行批处理
            int[] rowsAffected = preparedStatement.executeBatch();
            System.out.println("Rows affected: " + Arrays.toString(rowsAffected));

            // 关闭资源
            preparedStatement.close();
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3. 获取数据库元数据

数据库元数据提供了有关数据库的详细信息,如支持的SQL特性、数据库版本和表结构等。可以通过Connection对象的getMetaData()方法获取。以下是一个简单示例,演示如何获取数据库元数据:

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;

public class JdbcDatabaseMetaDataExample {
    public static void main(String[] args) {
        try {
            // 加载数据库驱动并连接到数据库
            Class.forName("com.mysql.cj.jdbc.Driver");
            String url= "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true";
            String username = "root";
            String password = "mypassword";
            Connection connection = DriverManager.getConnection(url, username, password);

            // 获取数据库元数据
            DatabaseMetaData metaData = connection.getMetaData();

            // 输出数据库信息
            System.out.println("Database Product Name: " + metaData.getDatabaseProductName());
            System.out.println("Database Product Version: " + metaData.getDatabaseProductVersion());
            System.out.println("Driver Name: " + metaData.getDriverName());
            System.out.println("Driver Version: " + metaData.getDriverVersion());

            // 关闭资源
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4. 使用存储过程

存储过程是一组预编译的SQL语句,存储在数据库中,可以提高应用程序性能。以下是一个简单示例,演示如何调用MySQL存储过程:

假设我们有一个名为get_user_count的存储过程,可以获取users表中的记录数:

DELIMITER //
CREATE PROCEDURE get_user_count(OUT count INT)
BEGIN
  SELECT COUNT(*) INTO count FROM users;
END //
DELIMITER ;

以下是如何使用Java调用此存储过程:

import java.sql.*;

public class JdbcStoredProcedureExample {
    public static void main(String[] args) {
        try {
            // 加载数据库驱动并连接到数据库
            Class.forName("com.mysql.cj.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true";
            String username = "root";
            String password = "mypassword";
            Connection connection = DriverManager.getConnection(url, username, password);

            // 调用存储过程
            CallableStatement callableStatement = connection.prepareCall("{CALL get_user_count(?)}");
            callableStatement.registerOutParameter(1, Types.INTEGER);
            callableStatement.execute();

            // 获取存储过程返回的结果
            int userCount = callableStatement.getInt(1);
            System.out.println("User count: " + userCount);

            // 关闭资源
            callableStatement.close();
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

5. 使用RowSet

RowSet是一个可滚动、可更新的Java对象,它包含了与数据库表相对应的数据。以下是一个简单示例,演示如何使用JdbcRowSet

首先,添加javax.sql.rowset依赖:

Maven:

<dependency>
    <groupId>javax.sql</groupId>
    <artifactId>rowset</artifactId>
    <version>1.2</version>
</dependency>

Gradle:

implementation 'javax.sql:rowset:1.2'

然后,使用JdbcRowSet

import javax.sql.rowset.JdbcRowSet;
import javax.sql.rowset.RowSetProvider;
import java.sql.ResultSetMetaData;

public class JdbcRowSetExample {
    public static void main(String[] args) {
        try {
            // 创建JdbcRowSet
            JdbcRowSet rowSet = RowSetProvider.newFactory().createJdbcRowSet();
            rowSet.setUrl("jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true");
            rowSet.setUsername("root");
            rowSet.setPassword("mypassword");

            // 执行查询
            rowSet.setCommand("SELECT * FROM users");
            rowSet.execute();

            // 处理查询结果
            ResultSetMetaData metaData = rowSet.getMetaData();
            int columnCount = metaData.getColumnCount();

            while (rowSet.next()) {
                for (int i = 1; i <= columnCount; i++) {
                    System.out.print(metaData.getColumnName(i) + ": " + rowSet.getObject(i) + " ");
                }
                System.out.println();
            }

            // 关闭资源
            rowSet.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这些示例应该可以帮助你更好地理解Java数据库编程的各个方面。在实际项目中,你可能需要根据具体需求进行调整和优化。希望这些信息能为你在Java数据库编程方面提供更多帮助。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP