乐趣区

关于人工智能:72-数据库连接与操作

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 数据库编程方面提供更多帮忙。
举荐浏览:

https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA

https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g

退出移动版