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>
相关推荐
lang2015092818 小时前
打造专属Spring Boot Starter
java·spring boot·后端
曹牧19 小时前
C#:数组不能使用Const修饰符
java·数据结构·算法
YA33319 小时前
java设计模式六、装饰器模式
java·设计模式·装饰器模式
回忆是昨天里的海20 小时前
k8s集群-节点间通信之安装kube-flannel插件
java·docker·kubernetes
信仰_27399324320 小时前
Mybatis-Spring重要组件介绍
java·spring·mybatis
盖世英雄酱5813620 小时前
java深度调试【第二章通过堆栈分析性能瓶颈】
java·后端
星月昭铭20 小时前
Spring MVC 接口匹配性能优化:.do后缀引发的性能瓶颈分析
spring·性能优化·tomcat
没有bug.的程序员20 小时前
AOP 原理深剖:动态代理与 CGLIB 字节码增强
java·spring·aop·动态代理·cglib
2401_8370885020 小时前
ResponseEntity - Spring框架的“标准回复模板“
java·前端·spring
lang2015092821 小时前
Spring Boot RSocket:高性能异步通信实战
java·spring boot·后端