spring data jpa
文章目录
Spring Data JPA是什么?
它是 Spring 基于 ORM 框架、Jpa 规范的基础上封装的一套 Jpa 应用框架,可使开发者用极简的代码即可实现对数据的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展!学习并使用 Spring Data Jpa 可以极大提高开发效率!
导入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
配置文件yal内容:
server:
port: 8080
servlet:
context-path: /
spring:
datasource:
url: jdbc:mysql://localhost:3306/jpatest?serverTimezone=UTC
username: root
password: 123456
jpa:
database: MySQL
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect #mysql数据库固定配置
show-sql: true #控制台打印sql
hibernate:
ddl-auto: update #update代表数据库没有表的话,会先创建表,有表的话就不创建了。
主要看Spring Data JPA提供的编程接口
- Repository:最顶层的接口,是一个空接口,目的是为了统一所有的Repository的类型,且能让组件扫描的时候自动识别。
- CrudRepository:Repository的子接口,提供了CRUD(增删改产)的功能。
- PagingAndSortingRepository:CrudRepository的子接口,添加分页排序的功能。
- JpaRepository:PagingAndSortingRepository的子接口,增加批量操作等功能
- JpaSpecificationExecutor:用来做复杂查询的接口
Repository提供了两种查询方式:
Repository接口是Spring Data JPA 中提供的所有接口的顶层接口
- 基于方法名称命名规则查询
- 基于@Query注解查询
1.实体类中用到的注解:
@Query
value:数据库操作语句
nativeQuery:是否是原生查询,默认false,即默认使用jpql查询
@Modifying:声明当前是一个更新操作,需要修改数据库数据。
只能用于void或int/Integer的返回类型
因为需要修改数据库数据,未防止修改失败造成未知后果,需要搭配事务管理来是使用
@Transactional:添加事务管理支持
一般需要设置rollbackFor或者noRollbackFor,来表示什么情况下进行事务回滚
@Rollback:是否可以回滚,默认true
配置实体类和表的映射关系,需要用到@Entity ,@Table(“name=''tableName”)
属性与字段的映射:主键的配置 @Id 声明主键, @GenerateValue()声明主键增长方式 @Column声明表中字段信息,@SequenceGenerator当实体类属性名和数据库列名不一致时必须要使用此注解,@Transient表示当前属性无需映射到数据库中,@Temproal主要针对 Date 类型的属性使用,可以通过该注解指定时间的精度
*一对多与多对一。
save()保存或更新:
save()方法默认jpa提供得save方法当不提供id时就是执行insert操作
save()默认jpa提供的save方法当提供id时就是执行update操作
@Entity
@Getter
@Setter
@Table(name = "t_springboot_book")
public class Book {
@Id
@GeneratedValue
private Integer bid;
@Column(length = 100)
private String bname;
@Column
private Float price;
}
通过SQL语句查询
(前面没有写nativeQuery是因为我们所写的语句需要变成可以查询的sql语句,这里我们写的本身就是sql语句所以要开启nativeQuery)
public interface UsersDao extends Repository<Users,Integer> {
//SQL
//nativeQuery:默认的是 false.表示不开启 sql 查询。是否对 value 中的语句 做转义。
@Query(value = "select * from t_users where username like ?",nativeQuery = true)
List<Users> selByLikeNameSQL(String username);
@Query(value = "select * from t_users where userage > ?",nativeQuery = true)
List<Users> selByAgeSQL(Integer userage);
@Query(value = "select * from t_users where username = ? and userage <=?",nativeQuery = true)
List<Users> selNameAndAgeSQL(String username,Integer userage);
}
@Query注解完成修改(一定要写@Modifying)
public interface UsersDao extends Repository<Users,Integer> {
//修改
@Query("update Users set userage = ? where userid = ?")
@Modifying //代表这是更新
void updUserageById(Integer userage,Integer userid);
}
2.方法命名规则查询
spring data jpa制定了一些约定,如果按照这些约定来定义方法名,则会自动解析出sql语句。
findBy + 属性名 + 查询方式 + (And|Or) + 属性名 + 查询方式…
查询方式 方法命名 | sql | where字句 |
---|---|---|
And | findByNameAndPwd | where name= ? and pwd =? |
Or | findByNameOrSex | where name= ? or sex=? |
Is,Equals | findById,findByIdEquals | where id= ? |
Between | findByIdBetween | where id between ? and ? |
LessThan | findByIdLessThan | where id < ? |
LessThanEquals | findByIdLessThanEquals | where id <= ? |
GreaterThan | findByIdGreaterThan | where id > ? |
GreaterThanEquals | findByIdGreaterThanEquals | where id > = ? |
After | findByIdAfter | where id > ? |
Before | findByIdBefore | where id < ? |
IsNull | findByNameIsNull | where name is null |
isNotNull,NotNull | findByNameNotNull | where name is not null |
Like | findByNameLike | where name like ? |
NotLike | findByNameNotLike | where name not like ? |
StartingWith | findByNameStartingWith | where name like ‘?%’ |
EndingWith | findByNameEndingWith | where name like ‘%?’ |
Containing | findByNameContaining | where name like ‘%?%’ |
OrderBy | findByIdOrderByXDesc | where id=? order by x desc |
Not | findByNameNot | where name <> ? |
In | findByIdIn(Collection<?> c) | where id in (?) |
NotIn | findByIdNotIn(Collection<?> c) | where id not in (?) |
True | findByAaaTue | where aaa = true |
False | findByAaaFalse | where aaa = false |
IgnoreCase | findByNameIgnoreCase | where UPPER(name)=UPPER(?) |
public interface UsersDao extends Repository<Users,Integer> {
//findBy关键字 Username属性名称 Is查询条件
List<Users> findByUsernameIs(String username);
}
JPA基本CRUD语句:sql执行都是通过enetiyManger实现的
@Test
public void testJpa(){
//1.加载配置文件,创建工厂对象
// EntityManagerFactory factory = Persistence.createEntityManagerFactory("myPersistence");
EntityManager entityManager = JpaUtils.getEntityManager();
//2.通过工厂获取实体类管理器
// EntityManager entityManager = factory.createEntityManager();
//3.获取事务对象,开启事务
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();//开启事务
//完成增删改查操作
Customer customer=new Customer();
customer.setCustAddress("利川市龙潭村");
customer.setCustIndustry("吉利工厂");
//保存
entityManager.persist(customer);
//提交事务
transaction.commit();
//释放资源
entityManager.close();;
//factory.close();
}
@Test
public void findJpa(){
EntityManager entityManager = JpaUtils.getEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
Customer customer = entityManager.find(Customer.class, 1L);
System.out.println(customer);
entityManager.close();
}
@Test
public void findJpa1(){
EntityManager entityManager = JpaUtils.getEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
Customer customer = entityManager.getReference(Customer.class, 1L);
System.out.println(customer);
entityManager.close();
}
@Test
public void removeJpa(){
EntityManager entityManager = JpaUtils.getEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
Customer customer = entityManager.getReference(Customer.class, 1L);
entityManager.remove(customer);
System.out.println(customer);
transaction.commit();
entityManager.close();
}
@Test
public void updateJpa(){
EntityManager entityManager = JpaUtils.getEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
Customer customer = entityManager.getReference(Customer.class, 2L);
customer.setCustIndustry("法拉利工厂");
entityManager.merge(customer);
System.out.println(customer);
transaction.commit();
entityManager.close();
}
CrudRepository接口
public interface UsersDao extends CrudRepository<Users,Integer> {
}
PagingAndSortingRepository接口
分页主要用到Pageable对象,实例化该对象时需要指定两个参数:
page:当前查询的页数,从0开始(即,你要查的是哪一页)
size:每页的结果数
public interface UsersDao extends PagingAndSortingRepository<Users,Integer> {
}
JpaRepository接口
public interface UsersDao extends JpaRepository<Users,Integer> {
}
JpaSpecificationExecutor接口
完成多条件查询,并且支持分页与排序
/**
* JpaSpecificationExecutor不能单独使用
*/
public interface UsersDao extends JpaRepository<Users,Integer>, JpaSpecificationExecutor<Users> {
}
复杂查询
基于Specification接口的复杂查询
jpaTestDao.findAll(new Specification<JpaTest>() {
//实现该接口
@Override
public Predicate toPredicate(Root<JpaTest> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
//构造查询条件和查询方式
return null;
}
})