Druid与JdbcTemplate基本使用

Druid与JdbcTemplate基本使用

JdbcTemplate简介

大白话就是简化数据库crud使用的。

概述

JdbcTemplate是Spring框架提供的一个核心模块,位于spring-jdbc包中。它简化了传统JDBC编程的复杂性,为数据访问提供了更高级的抽象和便利方法。JdbcTemplate通过封装JDBC API的底层细节,让开发者能够更专注于SQL查询和业务逻辑,而不用处理繁琐的资源管理。

主要特性

  1. 自动资源管理:自动处理Connection、Statement和ResultSet的获取和释放
  2. 异常转换:将JDBC的SQLException转换为Spring的数据访问异常体系
  3. 回调机制:提供ResultSetExtractor、RowMapper等回调接口
  4. 简化操作:提供query、update、execute等便捷方法
  5. 参数处理:支持命名参数和位置参数绑定

与传统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
);

适用场景

  1. 中小型项目的数据访问层
  2. 需要快速开发的场景
  3. 对ORM框架有性能顾虑的项目
  4. 需要直接控制SQL的场合

优势与局限

优势

  • 轻量级,无额外学习成本
  • 性能接近原生JDBC
  • 与Spring生态无缝集成
  • 灵活控制SQL语句

局限

  • 需要手动编写SQL
  • 对象关系映射功能有限
  • 不适合复杂领域模型

DruidDataSource简介

DruidDataSource是阿里巴巴开源的高性能数据库连接池实现,是Druid连接池的核心组件。作为Java应用中常用的数据库连接管理工具,它在性能、功能和监控方面都有显著优势。

核心特性

  1. 高性能设计

    • 采用双重检测锁机制优化连接获取过程
    • 内置LRU算法优化连接缓存
    • 支持并行化连接创建
  2. 丰富的监控功能

    • 实时统计SQL执行情况
    • 提供连接池使用率监控
    • 支持慢SQL记录与分析
    • 内置WallFilter防止SQL注入
  3. 企业级功能

    • 支持分布式事务
    • 提供多种连接有效性检测机制
    • 可配置的连接泄露检测
    • 完善的异常处理机制

典型应用场景

  1. 高并发Web应用

    • 电商系统大促期间
    • 社交平台热点事件期间
    • 金融交易系统
  2. 微服务架构

    • Spring Cloud应用
    • Dubbo服务提供者
    • 分布式事务场景
  3. 数据密集型应用

    • 报表生成系统
    • 数据分析平台
    • 批量数据处理任务

配置示例

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>
相关推荐
程序员 Andy1 小时前
项目中为什么使用SpringBoot?
java·spring boot·后端
Moss Huang7 小时前
docker-runc not installed on system
java·docker·容器
麦兜*9 小时前
Spring Boot 集成 Docker 构建与发版完整指南
java·spring boot·后端·spring·docker·系统架构·springcloud
Cisyam^9 小时前
Go环境搭建实战:告别Java环境配置的复杂
java·开发语言·golang
CHENFU_JAVA9 小时前
使用EasyExcel实现Excel单元格保护:自由锁定表头和数据行
java·excel
青云交10 小时前
Java 大视界 -- 基于 Java 的大数据实时流处理在智能电网分布式电源接入与电力系统稳定性维护中的应用(404)
java·大数据·分布式·智能电网·flink 实时流处理·kafka 数据采集·iec 61850 协议
仰望星空@脚踏实地11 小时前
maven scope 详解
java·maven·scope
M_Reus_1111 小时前
Groovy集合常用简洁语法
java·开发语言·windows
带刺的坐椅12 小时前
10分钟带你体验 Solon 的状态机
java·solon·状态机·statemachine