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