
MyBatis Dynamic SQL
MyBatis 官方推出的动态 SQL 构建框架
Spring Data 是Spring生态中的数据访问抽象层,通过统一编程模型简化关系型与非关系型数据库操作。其核心价值在于:
最新稳定版为2023.x(代号”2023.0.x”),要求JDK 17+(部分模块支持JDK 8+)。
模块 | 存储类型 | 关键特性 | 适用场景 |
---|---|---|---|
Spring Data JPA | 关系型数据库 | 基于Hibernate的Repository抽象 | 传统企业应用 |
Spring Data MongoDB | 文档数据库 | 面向对象查询/GridFS支持 | 内容管理系统 |
Spring Data Redis | 键值存储 | Reactive模板/集群支持 | 高并发缓存 |
Spring Data Elasticsearch | 搜索引擎 | 自动索引管理/聚合查询 | 全文检索 |
Spring Data R2DBC | 响应式SQL | 非阻塞式数据库访问 | 云原生微服务 |
1. 方法名派生查询
public interface UserRepository extends JpaRepository<User, Long> {
// 自动生成:SELECT * FROM users WHERE name LIKE ? AND age > ?
List<User> findByNameContainingAndAgeGreaterThan(String name, int age);
// 排序分页
Page<User> findByStatusOrderByCreateTimeDesc(String status, Pageable pageable);
}
2. 动态查询构建
@Query("SELECT u FROM User u WHERE (:name IS NULL OR u.name = :name)")
List<User> findUsers(@Param("name") Optional<String> name);
// 使用Specification动态组合条件
userRepository.findAll(
where(isActive())
.and(createdAfter(LocalDate.now().minusDays(7)))
);
3. 响应式编程支持
public interface ReactiveUserRepository extends ReactiveCrudRepository<User, String> {
Flux<User> findByDepartment(String dept);
}
// 订阅流式数据
reactiveUserRepository.findAll()
.delayElements(Duration.ofMillis(100))
.subscribe(System.out::println);
1. 多数据源配置
# application.yml
spring:
datasource:
primary:
url: jdbc:mysql://localhost/db1
secondary:
url: jdbc:postgresql://localhost/db2
data:
mongodb:
uri: mongodb://localhost:27017/mydb
2. 审计日志自动填充
@Entity
@EntityListeners(AuditingEntityListener.class)
public class Order {
@CreatedDate
private Instant createTime;
@LastModifiedBy
private String updater;
}
3. 分布式事务整合
@Transactional
@JtaTransactionManager
public void transfer(Account from, Account to, BigDecimal amount) {
accountRepository.updateBalance(from.getId(), amount.negate());
accountRepository.updateBalance(to.getId(), amount);
}
1. 查询优化技巧
// 使用@EntityGraph解决N+1问题
@EntityGraph(attributePaths = {"orders"})
List<User> findAllWithOrders();
// DTO投影减少数据传输
@Query("SELECT new com.example.UserDto(u.id, u.name) FROM User u")
List<UserDto> findUserSummaries();
2. 二级缓存配置
# 启用Hibernate二级缓存
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory
3. 批量处理优化
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
@Modifying
@Query("UPDATE User u SET u.status = :status WHERE u.id IN :ids")
int bulkUpdateStatus(@Param("ids") List<Long> ids, @Param("status") String status);
}
维度 | Spring Data JPA | MyBatis-Plus | JOOQ |
---|---|---|---|
开发效率 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
灵活性 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
学习曲线 | ⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ |
复杂查询支持 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
云原生适配 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ |
1. 云原生部署
FROM eclipse-temurin:17-jre
COPY target/app.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
2. DDD实践示例
// 领域层定义
public interface OrderRepository extends DomainRepository<Order, OrderId> {
List<Order> findPendingOrders();
}
// 应用层调用
orderService.placeOrder(order -> {
orderRepository.save(order);
eventPublisher.publish(new OrderPlacedEvent(order.getId()));
});
3. GraphQL集成
@QueryMapping
public List<User> users(@Argument String nameFilter) {
return userRepository.findByNameContaining(nameFilter);
}
官方渠道:
推荐书籍:
视频教程:
版本系列 | 维护状态 | JDK要求 | 主要特性 |
---|---|---|---|
3.x (2023) | 主动维护 | JDK 17+ | 全模块响应式支持/Java Record集成 |
2.7.x | 安全维护 | JDK 8+ | 传统企业应用支持 |
1.13.x | 停止维护 | JDK 6+ | 遗留系统兼容 |
通过 Spring Initializr 选择对应模块快速创建项目。建议新项目直接采用Spring Data 2023.x + Spring Boot 3.x技术栈。
本站速览导航提供的Spring Data都来源于网络,不保证外部链接的准确性和完整性,同时,对于该外部链接的指向,不由速览导航实际控制,在2025年4月1日 下午7:26收录时,该网页上的内容,都属于合规合法,后期网页的内容如出现违规,可以直接联系网站管理员进行删除,速览导航不承担任何责任。