JPA 插件
lcgyl-jpa-plugin 提供 JPA/Hibernate ORM 集成,支持实体映射、审计字段、分页查询等功能。
特性
- ✅ JPA 2.2 / Hibernate 6.x 支持
- ✅ 实体基类(BaseEntity)
- ✅ 审计字段自动填充
- ✅ Repository 基类
- ✅ Service 基类
- ✅ 分页查询
快速开始
1. 添加依赖
gradle
dependencies {
implementation project(':plugins:data-access:lcgyl-jpa-plugin')
runtimeOnly 'org.postgresql:postgresql' // 或其他数据库驱动
}2. 配置数据源
yaml
lcgyl:
jpa:
datasource:
url: jdbc:postgresql://localhost:5432/mydb
username: postgres
password: postgres
hibernate:
ddl-auto: update
show-sql: true3. 定义实体
java
import com.lcgyl.data.jpa.entity.BaseEntity;
import jakarta.persistence.*;
@Entity
@Table(name = "users")
public class User extends BaseEntity<Long> {
@Column(nullable = false, length = 50)
private String name;
@Column(unique = true)
private String email;
// getters/setters
}4. 创建 Repository
java
import com.lcgyl.data.jpa.repository.BaseRepository;
import java.util.Optional;
public interface UserRepository extends BaseRepository<User, Long> {
Optional<User> findByEmail(String email);
List<User> findByNameContaining(String name);
}5. 创建 Service
java
import com.lcgyl.data.jpa.service.BaseService;
import org.springframework.stereotype.Service;
@Service
public class UserService extends BaseService<User, Long> {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
protected BaseRepository<User, Long> getRepository() {
return userRepository;
}
public User findByEmail(String email) {
return userRepository.findByEmail(email).orElse(null);
}
}实体基类
BaseEntity
提供通用的实体字段和审计功能:
java
@MappedSuperclass
public abstract class BaseEntity<ID> {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private ID id;
@Column(name = "created_at")
private LocalDateTime createdAt;
@Column(name = "updated_at")
private LocalDateTime updatedAt;
@PrePersist
protected void onCreate() {
createdAt = LocalDateTime.now();
updatedAt = LocalDateTime.now();
}
@PreUpdate
protected void onUpdate() {
updatedAt = LocalDateTime.now();
}
}Service 基类
BaseService 提供常用的 CRUD 操作:
java
// 保存
User user = userService.save(new User("张三"));
// 根据 ID 查询
User user = userService.findById(1L);
// 查询所有
List<User> users = userService.findAll();
// 分页查询
Page<User> page = userService.findAll(PageRequest.of(0, 10));
// 删除
userService.deleteById(1L);
// 批量保存
userService.saveAll(List.of(user1, user2, user3));分页查询
java
// 创建分页请求
Pageable pageable = PageRequest.of(0, 10, Sort.by("createdAt").descending());
// 分页查询
Page<User> page = userRepository.findAll(pageable);
// 获取结果
List<User> content = page.getContent();
long total = page.getTotalElements();
int totalPages = page.getTotalPages();自定义查询
java
public interface UserRepository extends BaseRepository<User, Long> {
// 方法名查询
List<User> findByStatus(String status);
// JPQL 查询
@Query("SELECT u FROM User u WHERE u.email LIKE %:keyword%")
List<User> searchByEmail(@Param("keyword") String keyword);
// 原生 SQL
@Query(value = "SELECT * FROM users WHERE created_at > :date", nativeQuery = true)
List<User> findRecentUsers(@Param("date") LocalDateTime date);
}事务管理
java
@Service
@Transactional
public class UserService extends BaseService<User, Long> {
@Transactional(readOnly = true)
public User findByEmail(String email) {
return userRepository.findByEmail(email).orElse(null);
}
@Transactional(rollbackFor = Exception.class)
public void transfer(Long fromId, Long toId, BigDecimal amount) {
// 事务操作
}
}下一步
- JDBC 插件 - 基础 JDBC 操作
- MyBatis 插件 - MyBatis-Plus ORM
- 事务管理 - 事务管理详解