Druid与JdbcTemplate基本使用
JdbcTemplate简介
大白话就是简化数据库crud使用的。
概述
JdbcTemplate是Spring框架提供的一个核心模块,位于spring-jdbc包中。它简化了传统JDBC编程的复杂性,为数据访问提供了更高级的抽象和便利方法。JdbcTemplate通过封装JDBC API的底层细节,让开发者能够更专注于SQL查询和业务逻辑,而不用处理繁琐的资源管理。
主要特性
- 自动资源管理:自动处理Connection、Statement和ResultSet的获取和释放
- 异常转换:将JDBC的SQLException转换为Spring的数据访问异常体系
- 回调机制:提供ResultSetExtractor、RowMapper等回调接口
- 简化操作:提供query、update、execute等便捷方法
- 参数处理:支持命名参数和位置参数绑定
与传统JDBC对比
特性 | 传统JDBC | JdbcTemplate |
---|---|---|
资源管理 | 手动 | 自动 |
异常处理 | 需要捕获SQLException | 统一异常体系 |
代码量 | 冗长 | 简洁 |
可读性 | 较低 | 较高 |
事务管理 | 复杂 | 与Spring事务集成 |
基本使用示例
java
// 配置数据源
DataSource dataSource = new DriverManagerDataSource(
"jdbc:mysql://localhost:3306/test", "user", "password");
// 创建JdbcTemplate实例
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
// 执行查询
List<User> users = jdbcTemplate.query(
"SELECT * FROM users WHERE age > ?",
new Object[]{18},
(rs, rowNum) -> new User(
rs.getLong("id"),
rs.getString("name"),
rs.getInt("age")
)
);
// 执行更新
int rowsAffected = jdbcTemplate.update(
"UPDATE users SET name = ? WHERE id = ?",
"New Name", 1L
);
适用场景
- 中小型项目的数据访问层
- 需要快速开发的场景
- 对ORM框架有性能顾虑的项目
- 需要直接控制SQL的场合
优势与局限
优势:
- 轻量级,无额外学习成本
- 性能接近原生JDBC
- 与Spring生态无缝集成
- 灵活控制SQL语句
局限:
- 需要手动编写SQL
- 对象关系映射功能有限
- 不适合复杂领域模型
DruidDataSource简介
DruidDataSource是阿里巴巴开源的高性能数据库连接池实现,是Druid连接池的核心组件。作为Java应用中常用的数据库连接管理工具,它在性能、功能和监控方面都有显著优势。
核心特性
-
高性能设计
- 采用双重检测锁机制优化连接获取过程
- 内置LRU算法优化连接缓存
- 支持并行化连接创建
-
丰富的监控功能
- 实时统计SQL执行情况
- 提供连接池使用率监控
- 支持慢SQL记录与分析
- 内置WallFilter防止SQL注入
-
企业级功能
- 支持分布式事务
- 提供多种连接有效性检测机制
- 可配置的连接泄露检测
- 完善的异常处理机制
典型应用场景
-
高并发Web应用
- 电商系统大促期间
- 社交平台热点事件期间
- 金融交易系统
-
微服务架构
- Spring Cloud应用
- Dubbo服务提供者
- 分布式事务场景
-
数据密集型应用
- 报表生成系统
- 数据分析平台
- 批量数据处理任务
配置示例
java
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/test");
dataSource.setUsername("root");
dataSource.setPassword("123456");
dataSource.setInitialSize(5); // 初始化连接数
dataSource.setMaxActive(20); // 最大连接数
dataSource.setMinIdle(5); // 最小空闲连接数
dataSource.setMaxWait(60000); // 获取连接最大等待时间
dataSource.setTimeBetweenEvictionRunsMillis(60000); // 检测间隔
dataSource.setMinEvictableIdleTimeMillis(300000); // 最小空闲时间
优势对比
特性 | Druid | HikariCP | Tomcat JDBC |
---|---|---|---|
性能 | 高 | 极高 | 中等 |
监控 | 完善 | 基础 | 基础 |
功能 | 丰富 | 基础 | 基础 |
SQL防护 | 支持 | 不支持 | 不支持 |
扩展性 | 强 | 一般 | 一般 |
DruidDataSource特别适合需要详细监控SQL执行情况或对数据库安全性要求较高的企业级应用场景。
JdbcTemplate与DruidDataSource结合使用Demo
java
@Test
public void testJdbcTemplate() {
/**
* JdbcTemplate 简化数据库的crud操作,不提供连接池
* DruidDataSource 负责连接池的创建和数据库驱动的注册等等。
*/
// // 0. 创建连接池对象
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/test");
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");//驱动
dataSource.setUsername("root");
dataSource.setPassword("123456");
// 1. 实例化对象
JdbcTemplate jdbcTemplate = new JdbcTemplate();
// ¥¥¥ 核心
jdbcTemplate.setDataSource(dataSource); // 设置连接池
// 2. 调用方法
jdbcTemplate.update("sql语句", "参数1", "参数2", "..."); // 可执行 DDL,DML。DCL 等非查询语句
jdbcTemplate.queryForObject("sql语句", "参数1", "参数2", "...", 返回值类型.class); // 查询单行单列数据
jdbcTemplate.query(); // DQL查询集合
}
涉及依赖
xml
<!-- 数据库和连接池-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>6.0.6</version>
</dependency>