惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MyScale Blog
MyScale Blog
J
Java Code Geeks
Vercel News
Vercel News
A
About on SuperTechFans
G
Google Developers Blog
C
Check Point Blog
腾讯CDC
N
Netflix TechBlog - Medium
博客园 - 司徒正美
S
SegmentFault 最新的问题
D
DataBreaches.Net
博客园_首页
美团技术团队
Stack Overflow Blog
Stack Overflow Blog
博客园 - 聂微东
量子位
雷峰网
雷峰网
IT之家
IT之家
小众软件
小众软件
Blog — PlanetScale
Blog — PlanetScale
博客园 - 三生石上(FineUI控件)
H
Help Net Security
宝玉的分享
宝玉的分享
博客园 - 叶小钗

博客园 - 许仙儿

折痕 反·弱·无:道德经第四十章的因果链条与哲学闭环 从大括号圣战到人机掰手腕:AI时代,程序员的“累”换了个赛道 Git 文件忽略备忘录:`assume-unchanged` 完全指南 用go写一个微服务gPRC为主RESTful为辅 三号车间张三喜 为什么湖广不太吃鲤鱼 为什么夏天副高会导致伏旱,而冬天的西伯利亚高原又会带来寒流 普通RESTful和MCP调用对比 2026年放假安排 红楼梦龄官病死前和贾蔷同居的情节 古代的时辰,几更天与现在的时间对应关系是什么? 西游记结局评职称 生成一张图,苹果logo是透明冰块,安卓小机器人撒尿到苹果logo,冲出一个豁口 HL7v3和RIM是什么,和传统HL7,FHIR有什么关系 owl(Web Ontology Language)简介 关系型数据库 vs Elasticsearch 早上看到木蜂在抓取掉落到地上的国槐花,还一边打滚。它是否习性懒惰? Java SPI(Service Provider Interface)示例 常见古文中流行度和水平最高的前100首,按朝代分类 API Blueprint​​ 是一种基于 ​​Markdown​​ 的轻量级 API 描述语言 八卦的符号,读音,名称,代表的事务分别是什么 win10下python程序报错OPENSSL_Uplink(00007FFD0AC12FE8,08): no OPENSSL_Applink
Spring Boot 中 JdbcTemplate、MyBatis 和 JPA 共用数据源的...
许仙儿 · 2025-05-07 · via 博客园 - 许仙儿

Spring Boot 中 JdbcTemplate、MyBatis 和 JPA 共用数据源的可行性

是的,在 Spring Boot 项目中,JdbcTemplate、MyBatis 和 JPA 可以安全地共用同一个数据源。这是 Spring 框架设计时就考虑到的常见使用场景。

实现方式

  1. 配置单一数据源:

    # application.yml
    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/mydb
        username: user
        password: pass
        driver-class-name: com.mysql.cj.jdbc.Driver
    
  2. Spring Boot 自动配置:
    • 会自动创建 DataSource bean

    • JPA/Hibernate、JdbcTemplate 和 MyBatis 都会使用这个数据源

共用机制

  1. 事务管理统一:
    • 通过 PlatformTransactionManager 统一管理

    • 所有ORM技术参与同一个事务

  2. 连接池共享:
    • 所有框架使用同一个连接池

    • 避免创建多个连接池浪费资源

实际项目中的混合使用示例

@Service
@Transactional
public class OrderService {
    
    @Autowired
    private OrderRepository jpaRepository; // JPA
    
    @Autowired
    private JdbcTemplate jdbcTemplate;
    
    @Autowired
    private OrderMapper mybatisMapper; // MyBatis
    
    public void processOrder(Order order) {
        // 使用JPA保存
        jpaRepository.save(order);
        
        // 使用JdbcTemplate执行SQL
        jdbcTemplate.update("UPDATE inventory SET stock = stock - ? WHERE product_id = ?", 
                          order.getQuantity(), order.getProductId());
        
        // 使用MyBatis查询
        List<Order> recentOrders = mybatisMapper.findRecentOrders(order.getCustomerId());
    }
}

注意事项

  1. 事务传播:确保理解 @Transactional 的行为,混合使用时保持事务一致性
  2. ORM缓存:JPA的缓存机制不会影响JdbcTemplate和MyBatis的直接操作
  3. 方言配置:如果使用Hibernate,确保其方言配置与数据库匹配
  4. 连接泄露:不同方式获取的连接最终都会由Spring管理释放

这种混合使用方式在实际项目中很常见,可以根据不同场景选择最适合的数据访问方式。