最近一直在研究Spring Boot,今天为你们介绍下Spring Data JPA在Spring Boot中的应用,若有错误,欢迎你们指正。spring
先解释下什么是JPAsql
JPA就是一个基于O/R映射的标准规范(即实体类和数据库中的表的一种对映)数据库
Spring Data JPA是Spring Data 中的一个子项目,除了它还有Spring Data MongoDB等等(恰好最近项目中使用到了,下次能够作个介绍)app
在Spring Boot中使用Spring Data JPA很是方便,只须要三步,maven
1.在maven中添加spring-boot-stater-data-jpa.以下图:spring-boot
2.在application.properties属性文件中定义好Datasuorce,以下图:spa
3.建立与数据库中的表对映的实体类和数据访问层(JpaRepository)code
一,定义数据库访问层blog
使用Spring Data JPA创建数据库十分简单,只须要定义一个继承了JpaRepository的接口,以下:继承
public interface PersonRepository extends JpaRepository<Person, Integer> {}
继承了JpaRepository就至关于有了下面的数据访问操做方法,
@NoRepositoryBean public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID> { List<T> findAll(); List<T> findAll(Sort var1); List<T> findAll(Iterable<ID> var1); <S extends T> List<S> save(Iterable<S> var1); void flush(); <S extends T> S saveAndFlush(S var1); void deleteInBatch(Iterable<T> var1); void deleteAllInBatch(); T getOne(ID var1); }
二.JPA的查询方法
在JPA中有三种方式能够进行数据的查询(1,方法命名查询 2,@NamedQuery查询 3,@Query查询),
假设有一张表叫PERSON,字段:ID(INT),NAME(VARCHAR),AGE(INT),ADDRESS(VARCHAR).
实体类:id(integer),name(String),age(integer),address(String)
先来介绍第一种:方法命名查询
1. Spring Data JPA支持经过定义在Repository接口的方法来定义查询,方法名字是根据实体类的属性名来肯定的,示例以下:
public interface PersonRepository extends Repository<Person, Integer> { /* * 经过地址进行查询,参数为address, * 至关于JPQL:select p from Person p where p.address=?1 * */ List<Person> findByAddress(String address); /* * 经过地址和名字进行查询,参数为name,address * 至关于JPQL:select p from Person p where p.name=?1 and address=?2 * */ Person findByNameAndAddress(String name,String address); }
从代码能够看出,使用findBy,And这样的关键字,其中的findBy能够用find,getBy,query,read来进行代替。
而And就至关于sql语句中的and。
2.用关键字限制结果数量,用top和first来实现,示例以下:
/* *查询符合条件的前十条记录 */ List<Person> findFirst10ByName(String name)
/* *查询符合条件的前30条记录 */ List<Person> findTop30ByName(String name);
第二种:@NamedQuery查询
Spring Data JPA 支持@NameQuery来定义查询方法,即一个名称映射一个查询语句(要在实体类上写,不是接口里写),示例以下:
@Entity @NamedQuery(name="Person.findByName", query="select p from Person p where p.name=?1") public class Person{ }
这样子就从新定义了findByName这个方法了。
若是要将多个方法都进行从新定义,可使用@NameQueries标签,示例以下:
@Entity @NamedQueries({ @NamedQuery(name="Person.findByName", query="select p from Person p where p.name=?1"), @NamedQuery(name = "Person.withNameAndAddressNamedQuery", query = "select p from Person p where p.name=?1 and address=?2") }) public class Person{ }
这个时候,接口里定义的findByName方法就是上面的方法了,再也不是方法命名查询的方法了。
第三种:@Query查询
Spring Data JPA 支持@Query来定义查询方法,使用方法是将@Query写在接口的方法上面,示例以下:
public interface PersonRepository extends Repository<Person, Integer> { @Query("select p from Person p where p.name=?1 and p.address=?2") Person withNameAndAddressQuery(String name,String address); }
这里的参数是根据索引号来进行查询的。
固然咱们也是能够根据名称来进行匹配,而后进行查询的,示例以下:
public interface PersonRepository extends Repository<Person, Integer> {
@Query("select p from Person p where p.name= :name and p.address= :address")
Person withNameAndAddressQuery(@Param("name")String name,@Param("address")String address);
}
讲完查询,咱们再来看看更新是如何写的。
Spring Data JPA支持使用@Modifying和@Query注解组合来进行更新查询,示例以下:
public interface PersonRepository extends Repository<Person, Integer> { @Modifying @Transcational @Query("update Person p set p.name=?1 ") int setName(String name); }
int表示的是更新语句所影响的行数。
下篇正在努力编写中,再深刻探讨下JPA的其它一些功能。