「这是我参与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);
}
查询关键字
限制结果数量,用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(非线程安全)