阿里巴巴的开源数据库连接池工具Druid数据源,在实际使用的时候,通常会和Spring或SpringBoot整合一起使用。
但有些时候如果不用使用Spring或SpringBoot,而直接使用Druid的原生API来操作数据库的话,该如何正确使用呢?
下面是一个使用Druid连接池简单操作数据库的工具类,重点关注Druid数据源的创建和复用:
/**
* 数据库操作工具类
*
* @author shiyanjun
* @since 2020/01/05
*/
@Slf4j
public class DbUtil {
private static final String DB_URL = "jdbc:mysql://localhost:3306/authapi"; // 数据库连接URL
private static final String DB_USERNAME = "root"; // 数据库用户名
private static final String DB_PASSWORD = "123456"; // 数据库密码
// Druid数据源,全局唯一(只创建一次)
private static DruidDataSource druidDataSource;
/**
* 执行SQL更新
*
* @param updateSql
* @throws SQLException
*/
public static void insert(String updateSql) throws SQLException {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
connection = getDruidConnection();
statement = connection.createStatement();
int count = statement.executeUpdate(updateSql);
log.info(">>>>>>>>>>>>> 插入数据 {}", count);
} finally {
// 切记!!! 一定要释放资源
closeResource(connection, statement, resultSet);
}
}
/**
* 执行SQL查询
*
* @param querySql
* @return
* @throws Exception
*/
public static List
一个简单的测试类,模拟多线程向数据库表中插入1w条数据:
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* CREATE TABLE `auth_code` (
* `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
* `auth_code` varchar(255) CHARACTER SET utf8mb4 NOT NULL COMMENT '授权码',
* `status` varchar(255) CHARACTER SET utf8mb4 NOT NULL DEFAULT '1' COMMENT '状态',
* `remark` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '备注',
* `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',
* `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改日期',
* PRIMARY KEY (`id`)
* ) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=latin1;
*/
public class AppTest {
private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private static ExecutorService executorService = Executors.newCachedThreadPool();// 线程池
public static void main(String[] args) throws Exception {
String INSERT_SQL = "INSERT INTO `authapi`.`auth_code` " +
"(`auth_code`, `status`, `remark`, `create_date`, `update_time`) VALUES ('%s',%s,'%s','%s','%s')";
// 模拟多线程向数据库插入1万条数据
for (int i = 0; i < 10000; i++) {
Thread.sleep(5);
String code = UUID.randomUUID().toString().replaceAll("-", "");
String dateStr = dateFormat.format(new Date());
String formatSql = String.format(INSERT_SQL, code, i, code, dateStr, dateStr);
executorService.execute(() -> {
try {
DbUtil.insert(formatSql);
} catch (Exception e) {
e.printStackTrace();
}
});
}
}
}