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>
相关推荐
WhyWhatHow5 分钟前
JEnv:新一代Java环境管理器,让多版本Java管理变得简单高效
java·后端
保加利亚的风17 分钟前
【Java】使用FreeMarker来实现Word自定义导出
java·word
SteveCode.21 分钟前
SpringBoot 2.x 升 3.x 避坑指南:企业级项目的实战问题与解决方案
java·spring boot
Yang-Never31 分钟前
Kotlin -> object声明和object表达式
android·java·开发语言·kotlin·android studio
风萧萧199932 分钟前
Java 实现poi方式读取word文件内容
java·开发语言·word
喵手42 分钟前
如何实现一个简单的基于Spring Boot的用户权限管理系统?
java·spring boot·后端
C4程序员1 小时前
北京JAVA基础面试30天打卡01
java·开发语言·面试
Aczone281 小时前
数据结构(三)双向链表
java·数据结构·链表
菜菜的后端私房菜1 小时前
Dubbo2到Dubbo3服务发现机制的优化
java·后端·dubbo
33255_40857_280592 小时前
RocketMQ实战指南:Java开发者的分布式消息中间件全解析
java·rocketmq