zl程序教程

您现在的位置是:首页 >  其他

当前栏目

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

2023-03-14 10:14:31 时间

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);