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