深入实践Spring Boot2.1.3 实体持久化

    xiaoxiao2024-05-15  117

    2.1.3 实体持久化

    通过上面三个实体的定义,实现了使用Java的普通对象(POJO)与数据库表建立映射关系(ORM),接下来使用JPA来实现持久化。

    用户实体使用JPA进行持久化的例子如代码清单2-5所示。它是一个接口,并继承于JPA资源库JpaRepository接口,使用注解@Repository将这个接口也定义为一个资源库,使它能被其他程序引用,并为其他程序提供存取数据库的功能。

    使用相同的方法,可以定义部门实体和角色实体的资源库接口。接口同样继承于JpaRepository接口,只要注意使用的参数是各自的实体对象即可。

    代码清单2-5 用户实体持久化

    @Repository

    public interface UserRepository extends JpaRepository<User, Long> {

    }

    这样就实现存取数据库的功能了。现在可以对数据库进行增删查改、进行分页查询和指定排序的字段等操作。

    或许你还有疑问,我们定义的实体资源库接口并没有声明一个方法,也没有对接口有任何实现的代码,甚至连一条SQL查询语句都没有写,这怎么可能?

    是的,使用JPA就是可以这么简单。我们来看看JpaRe-pository的继承关系,你也许会明白一些。如图2-2所示,JpaRepository继承于PagingAndSortingRepository,它提供了分页和排序功能,PagingAndSortingRepository继承于Crud-Repository,它提供了简单的增删查改功能。

    因为定义的接口继承于JpaRepository,所以它传递性地继承上面所有这些接口,并拥有这些接口的所有方法,这样就不难理解为何它包含那么多功能了。这些接口提供的一些方法如下:

    <S extends T> S save(S var1);

    T findOne(ID var1);

    long count();

    void delete(ID var1);

    void delete(T var1);

    void deleteAll();

    Page<T> findAll(Pageable var1);

    List<T> findAll();

    List<T> findAll(Sort var1);

    List<T> findAll(Iterable<ID> var1);

    void deleteAllInBatch();

    T getOne(ID var1);

    ......

    JPA还提供了一些自定义声明方法的规则,例如,在接口中使用关键字f?indBy、readBy、getBy作为方法名的前缀,拼接实体类中的属性字段(首个字母大写),并可选择拼接一些SQL查询关键字来组合成一个查询方法。例如,对于用户实体,下列查询关键字可以这样使用:

    And,例如f?indByIdAndName(Long id,String name);

    Or,例如f?indByIdOrName(Long id,String name);

    Between,例如f?indByCreatedateBetween(Date start,Date end);

    LessThan,例如f?indByCreatedateLessThan(Date start);

    GreaterThan,例如f?indByCreatedateGreaterThan(Date start);

    IsNull,例如f?indByNameIsNull();

    IsNotNull,例如f?indByNameIsNotNull();

    NotNull,与IsNotNull等价;

    Like,例如f?indByNameLike(String name);

    NotLike,例如f?indByNameNotLike(String name);

    OrderBy,例如f?indByNameOrderByIdAsc(String name);

    Not,例如f?indByNameNot(String name);

    In,例如f?indByNameIn(Collection<String>nameList);

    NotIn,例如f?indByNameNotIn(Collection<String>nameList)。

    又如下列对用户实体类自定义的方法声明,它们都是符合JPA规则的,这些方法也不用实现,JPA将会代理实现这些方法。

    User findByNameLike(String name);

    User readByName(String name);

    List<User> getByCreatedateLessThan(Date star);

    最新回复(0)