地表最强jdbcutils
一、maven坐标
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.17.1</version> <!-- 使用最新版本 -->
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.6</version> <!-- 使用最新版本 -->
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version> <!-- 这里的版本号可能会有更新,可以根据需要进行修改 -->
</dependency>
二、log4j2.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
三、jdbcutils代码
import com.alibaba.druid.pool.DruidDataSource;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JDBCUtils {
private static DruidDataSource dataSource = null; // 使用Druid数据源
private static ThreadLocal<Connection> connectionThreadLocal = ThreadLocal.withInitial(() -> {
try {
if (dataSource == null) {
initializeDataSource(); // 初始化数据源
}
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException("Failed to get a database connection.", e);
}
});
// 获取日志记录器
private static final Logger logger = LogManager.getLogger(JDBCUtils.class);
// 初始化数据源
private static void initializeDataSource() {
dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/test001");
dataSource.setUsername("root");
dataSource.setPassword("root");
// 配置其他数据源属性
dataSource.setInitialSize(5); // 初始化连接数
dataSource.setMaxActive(20); // 最大活动连接数
// 其他配置...
// 可以添加其他数据源配置
}
// 获取数据库连接
public static Connection getConnection() {
return connectionThreadLocal.get();
}
// 开启事务
public static void beginTransaction() {
Connection connection = getConnection();
try {
connection.setAutoCommit(false); // 设置手动提交
} catch (SQLException e) {
throw new RuntimeException("Failed to begin transaction.", e);
}
}
// 提交事务
public static void commitTransaction() {
Connection connection = getConnection();
try {
connection.commit();
} catch (SQLException e) {
throw new RuntimeException("Failed to commit transaction.", e);
}
}
// 回滚事务
public static void rollbackTransaction() {
Connection connection = getConnection();
try {
connection.rollback();
} catch (SQLException e) {
throw new RuntimeException("Failed to rollback transaction.", e);
}
}
// 关闭连接
public static void closeConnection() {
Connection connection = connectionThreadLocal.get();
if (connection != null) {
try {
connection.close();
connectionThreadLocal.remove();
} catch (SQLException e) {
throw new RuntimeException("Failed to close connection.", e);
}
}
}
public static Object execute(String sql, Object... params) throws SQLException {
Connection connection = getConnection();
PreparedStatement preparedStatement = connection.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
preparedStatement.setObject(i + 1, params[i]);
}
// 根据SQL语句中的关键字来确定操作类型
boolean isSelectQuery = sql.trim().toLowerCase().startsWith("select");
// 记录日志
if (isSelectQuery) {
logger.info("Executing SQL query: {}", sql);
System.out.println("实际执行的sql语句:"+preparedStatement.toString().split("ClientPreparedStatement:")[1]);
return preparedStatement.executeQuery();
} else {
logger.info("Executing SQL update: {}", sql);
int rowsAffected = preparedStatement.executeUpdate();
System.out.println("实际执行的sql语句:"+preparedStatement.toString().split("ClientPreparedStatement:")[1]);
// 如果需要获取生成的主键等信息,可以在这里添加代码
return rowsAffected;
}
}
public static void main(String[] args) {
Connection connection = getConnection();
System.out.println(connection);
}
}
这段代码所涉及的知识点:
- JDBC(Java Database Connectivity):JDBC是Java中用于与关系型数据库进行交互的标准API。在这段代码中,使用了JDBC来执行数据库操作。
- Druid数据源:
DruidDataSource
是阿里巴巴开发的一个高性能数据库连接池。在这段代码中,使用了Druid数据源来管理数据库连接。 - ThreadLocal:
ThreadLocal
是Java中的一个类,用于在多线程环境中为每个线程维护一个独立的变量副本。在这段代码中,使用ThreadLocal
来确保每个线程都有自己的数据库连接,以避免线程之间的混淆。 - 日志记录:代码使用Log4j 2作为日志记录框架,以记录数据库操作的详细信息。日志记录是一种重要的开发和调试工具,可以用于跟踪应用程序的行为。
- 数据库连接管理:代码包括获取数据库连接、开启事务、提交事务、回滚事务以及关闭数据库连接的方法,以确保数据库连接的正确使用和管理。
- 参数化查询:通过使用
PreparedStatement
来执行数据库查询和更新操作,以防止SQL注入攻击。参数化查询是一种防止恶意SQL注入的重要技术。 - 异常处理:代码中使用了异常处理来捕获和处理可能出现的SQL异常,以确保应用程序在出现问题时能够适当地响应。
- 配置信息:代码中包含了数据库连接的配置信息,包括数据库URL、用户名和密码。这些信息通常应该从配置文件中读取,而不是硬编码在代码中。