安徽省和城乡建设厅网站,汽车软件开发流程,快速生成html模板,wordpress站群远程管理软件一、Jpa的介绍 JPA #xff0c;是一套Sun公司Java官方制定的ORM 规范。 ORM#xff0c;即 对象关系映射 #xff08;Object Relational Mapping#xff09;#xff0c;是一种程序技术#xff0c;用于 在关系数据库和业务实体对象之间做映射 。ORM 框架的存在#xff0c;… 一、Jpa的介绍 JPA 是一套Sun公司Java官方制定的ORM 规范。 ORM即 对象关系映射 Object Relational Mapping是一种程序技术用于 在关系数据库和业务实体对象之间做映射 。ORM 框架的存在让开发者可以更关注业务层面的编程而不需要过多关注数据库层面的操作。 其作用是在操作数据库之前先把数据表与实体类关联起来然后通过实体类的对象操作增删改查数据库表。 二、JPA实现流程
2.1 ORM 映射 首先是 ORM 映射通过注解或 XML 描述对象和表直接的映射关系。 Entity
Table(name user)
public class User {Id// 该字段对应数据库中的列为主键GeneratedValue(strategy GenerationType.IDENTITY) // 主键自增长Column(name id)private Long id;Column(name name)private String name;Column(name age)private Integer age;Column(name sex)private String sex;
} 2.2 继承CrudRepository或者JpaRepository 新建接口通过继承 CrudRepository 实现 CRUD 操作 Repository
public interface UserDao extends CrudRepositoryUser,Long {
} 2.3 添加服务层 Service
public class UserService {Autowiredprivate UserDao userDao;public void add(User user) {userDao.save(user);}
} 2.4 EnableJpaRepositories 如果你的 Repository 接口位于与启动类不同的包中或者你希望配置不同的数据源这种情况下就需要使用 EnableJpaRepositories 注解来明确地指定需要扫描的包。 2.5 JpaRepository与CrudRepository的差异及不同的使用场景 JpaRepository 和 CrudRepository 是 Spring Data JPA 框架提供的两个接口它们都提供了一套用于在数据库中执行 CRUD创建、读取、更新、删除操作的方法。下面是它们之间的差异及不同的使用场景 CrudRepository CrudRepository 是 Spring Data 提供的基础接口定义了一组基本的 CRUD 操作方法例如 save、findById、findAll、delete 等。CrudRepository 接口中的方法是非类型化的返回类型为 Iterable需要手动进行类型转换。CrudRepository 适用于简单的 CRUD 操作不涉及复杂的查询和操作。 JpaRepository JpaRepository 是继承自 CrudRepository 接口的一个子接口提供了更丰富和强大的查询功能例如通过方法名自动生成查询、使用Query 注解执行自定义 SQL 查询等。JpaRepository 接口中的方法返回类型为具体的实体类无需进行手动类型转换。JpaRepository 适用于需要进行复杂查询和定制化操作的场景能够更方便地实现各种复杂的数据操作需求。分页和排序JpaRepository 提供了一些方法如 findAll(Pageable pageable) 和 findAll(Sort sort)用于支持结果的分页和排序。刷新持久性上下文JpaRepository 提供了 flush() 和 saveAndFlush(T entity) 方法用于刷新持久性上下文即使未提交的变更立即同步到数据库。批量操作JpaRepository 提供了 deleteInBatch(IterableT entities) 和 deleteAllInBatch() 方法可以进行批量的删除操作。 使用场景 当只需要进行简单的 CRUD 操作时例如基本的增删改查可以使用 CrudRepository。当需要进行复杂的查询或操作时例如需要使用动态查询、分页查询、自定义查询等功能时应该使用 JpaRepository。 -如果应用中有复杂的业务逻辑、需求并且需要更灵活地操作数据库那么建议选择JpaRepository。 总的来说JpaRepository提供了CrudRepository所有的功能另外还提供了更多的查询方法以及对实体的操作功能。因此如果有需要进行更复杂的数据库操作或查询时推荐使用JpaRepository。 三、JPA的审计功能 EntityListeners(AuditingEntityListener.class) 是 JPA 的注解它用于定义在持久化过程中应用于实体类的回调方法类也就是说它将指定的类配置为实体监听器。 AuditingEntityListener 是 Spring Data JPA 提供的一个实体监听器专门用于审计即追踪和记录实体的创建、修改等行为。 一个典型的使用场景是你想要追踪并自动填充实体的创建时间和最后修改时间。这可以通过 Spring Data JPA 的审计功能来实现。示例代码如下 3.1 新增一个 AbstractAuditable 的抽象类 MappedSuperclass
EntityListeners(AuditingEntityListener.class)
public abstract class AbstractAuditable {IdColumn(name id, nullable false)GeneratedValue(strategy GenerationType.IDENTITY)private Integer id;CreatedDateColumn(name create_time, nullable true)private Date createTime;CreatedByColumn(name create_user_id, nullable true)private Integer createUserId;LastModifiedByColumn(name last_modified_user_id, nullable true)private Integer lastModifiedUserId;LastModifiedDateColumn(name last_modified_time, nullable true)private Date lastModifiedTime;
......
} CreatedDate 和 LastModifiedDate 是审计注解分别表示创建时间和最后修改时间。当你保存或更新User实体的时候 createdTime 和 lastModifiedTime 会自动被填充。
3.2 实现 AuditorAware 接口实现 getCurrentAuditor 方法
CreatedBy 和 LastModifiedBy 注解负责跟踪数据记录的创建者和最后一次修改者。这两个注解通常用于持久化域对象以实现审计审核功能。然而Spring Data本身无法自动获取到当前的用户ID。它依赖于AuditorAware接口来设定用户身份。你必须提供AuditorAware的实现类告诉Spring Data应该用什么作为当前用户或当前操作者。
举例来说你如果在使用Spring Security这种安全框架你可以从SecurityContext获取到当前用户信息并通过AuditorAware返回给Spring Data。代码示例如下
public class SpringSecurityAuditorAware implements AuditorAwareUser {Overridepublic OptionalUser getCurrentAuditor() {return Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication()).filter(Authentication::isAuthenticated).map(Authentication::getPrincipal).map(User.class::cast);}
}在这个例子中我们从SecurityContextHolder中获取了当前的Authentication对象确保了它是已认证的然后得到了principal在许多情况下principal通常就是你的User对象或者是包含User对象信息的对象最后将这个principal转换成了User对象并包装在Optional中返回。这样每次需要自动填充CreatedBy和LastModifiedBy字段时Spring Data就可以知道当前用户是谁了。
3.3 需要 Auditing 的实体继承 AbstractAuditable
Entity
Table(name user)
public class User extends AbstractAuditable{Id// 该字段对应数据库中的列为主键GeneratedValue(strategy GenerationType.IDENTITY) // 主键自增长Column(name id)private Long id;Column(name name)private String name;Column(name age)private Integer age;Column(name sex)private String sex;
}
3.4 审计配置
要启用 Spring Data JPA 的审计功能你还需要在某个配置类中添加 EnableJpaAuditing 注解。
要是实现了AuditorAware接口则同样需要配置。
EnableJpaAuditing
Configuration
public class JpaConfig {Beanpublic AuditorAwareInteger auditorProvider() {return new SpringSecurityAuditorAware ();}
}
四、JPA与MybatisPlus对比
JPA和MybatisPlus都是Java持久化框架但有一些不同之处下面是它们的优缺点及不同的使用场景 JPA 优点 对象关系映射ORM方便通过注解或XML配置的方式可以轻松地实现实体类和数据表的映射关系。提供了强大的查询语言JPQL可以灵活地进行查询操作。支持事务管理和持久性上下文能够帮助开发者管理实体对象的生命周期和事务。缺点 性能相对较低对于复杂的查询性能不如MybatisPlus。需要深入了解JPA规范和实现学习成本较高。不够灵活有时候需要绕过JPA规范使用原生SQL。 MybatisPlus 优点 灵活性高可以通过SQL语句自定义查询和更新操作满足复杂业务需求。性能优秀对于复杂的查询操作能够更好地优化和提升性能。配置简单可以通过注解或XML配置文件快速实现功能。缺点 没有JPA那种ORM的便利性需要手动编写SQL语句。由于灵活性较高开发者需要深入了解SQL语法和数据库不易上手。不提供自动实现的事务管理和持久性上下文需要手动处理事务。 不同的使用场景
如果项目中对数据库操作较为简单大部分操作可以通过简单的CRUD操作实现可以考虑使用JPA确实能够减少很多繁琐的代码。如果项目中需要进行复杂的查询操作或者对性能要求较高可以考虑使用MybatisPlus它提供了更多的灵活性和优化性能的功能。