Spring Data Commons基础知识点(一)

628 阅读3分钟

「这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战

Spring Data Commons

使用关系型&非关系型数据访问技术时,都使用基于Spring的统一标准,该标准包含CRUD(创建、获取、更新、删除)、查询、排序、分页。

一个重要概念:Spring Data Repository抽象

使用Spring Data Repository可以极大的减少数据访问层的代码

Spring Data Repository抽象的根接口是Repository接口

@Indexed

public interface Repository<T, ID> {

}

@NoRepositoryBean

public interface CrudRepository<T, ID> extends Repository<T, ID> {

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

<S extends T> Iterable<S> saveAll(Iterable<S> entities);

Optional<T> findById(ID id);

boolean existsById(ID id);

Iterable<T> findAll();

Iterable<T> findAllById(Iterable<ID> ids);

long count();

void deleteById(ID id);

void delete(T entity);

void deleteAll(Iterable<? extends T> entities);

void deleteAll();

}


@NoRepositoryBean

public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {

Iterable<T> findAll(Sort sort);

Page<T> findAll(Pageable pageable);

}

1.Spring Data JPA

JPA即Java Persistence API。JPA是一个基于O/R映射的标准规范。所谓规范,只定义标准规则(如注解、接口),不提供实现。

Spring Data JPA是Spring Data的一个子项目,它通过提供基于JPA的Repository极大地减少了JPA作为数据访问方案的代码量。

1.定义数据访问层

使用Spring Data JPA建立数据访问层只需定义一个继承JpaRepository的借口即可,默认有了JpaRepository数据操作访问方法。

public interface UserRepository extends JpaRepository<User, Long> {

}

2.配置使用Spring Data JPA

Spring环境中,使用Spring Data JPA可通过@EnableJpaRepositories注解来开启Spring Data JPA的支持,@EnableJpaRepositories接受的value参数用来扫描数据访问层所在包下的数据访问的接口定义。

3.定义查询方法

根据属性名查询

定义在Repository接口中的方法名来定义查询,方法名是根据实体类的属性名来确定的。

User[name,password,address,phone]

public interface UserRepository extends JpaRepository<User, Long> {

List<User> findByName(String name);

List<User> findByNameLike(String name);

List<User> findByNameAndAddress(String name, String address);

}

查询关键字

image.png

限制结果数量,用top和first关键字实现

public interface UserRepository extends JpaRepository<User, Long> {

List findFirst10ByName(String name);

List findTop30ByName(String name);

}


使用JPA的NamedQuery查询

即一个名称映射一个查询语句

@Entity

@NamedQuery(name = "Person.findByName", query = "select p from Person p where p.name=?1")

public class Person {

}

public interface UserRepository extends JpaRepository<User, Long> {

List findByName(String name);

}

使用Query查询

1)使用参数索引

public interface UserRepository extends JpaRepository<User, Long> {

@Query("select p from Person p where p.address=?1")

List<User> findByAddress(String address);

}

2)使用命名参数

public interface UserRepository extends JpaRepository<User, Long> {

@Query("select p from Person p where p.address= :address")

List<User> findByAddress(@Param("address") String address);

}

3)更新查询

使用@Modifying和@Query组合更新查询

public interface UserRepository extends JpaRepository<User, Long> {

@Modifying

@Transactional

@Query("update Person p set p.name=?1")

int setName(String name); *//**返回值**int**表示更新语句影响的行数*

}

String基础

String不可变类,任何对String的改变都会引发新的String对象生成。

StringBuffer可变类,任何对它所指的字符串的改变都不会产生新的对象。

先说一下集合的故事,HashTable是线程安全的,很多方法都是synchronized方法,而HashMap不是线程安全的,但其在单线程程序中的性能比HashTable要高。StringBuffer和StringBuilder类的区别也是如此,他们的原理和操作基本相同,区别在于StringBuffer支持并发操作,线性安全的,适合多线程中使用。StringBuilder不支持并发操作,线性不安全的,不适合多线程中使用。新引入的StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高。

单线程:

StringBuffer StringBuilder(性能高)

多线程

StringBuffer(线性安全)

StringBuilder(非线程安全)