Spring data jpa 学习记录总结

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) + 属性名 + 查询方式…

查询方式 方法命名sqlwhere字句
AndfindByNameAndPwdwhere name= ? and pwd =?
OrfindByNameOrSexwhere name= ? or sex=?
Is,EqualsfindById,findByIdEqualswhere id= ?
BetweenfindByIdBetweenwhere id between ? and ?
LessThanfindByIdLessThanwhere id < ?
LessThanEqualsfindByIdLessThanEqualswhere id <= ?
GreaterThanfindByIdGreaterThanwhere id > ?
GreaterThanEqualsfindByIdGreaterThanEqualswhere id > = ?
AfterfindByIdAfterwhere id > ?
BeforefindByIdBeforewhere id < ?
IsNullfindByNameIsNullwhere name is null
isNotNull,NotNullfindByNameNotNullwhere name is not null
LikefindByNameLikewhere name like ?
NotLikefindByNameNotLikewhere name not like ?
StartingWithfindByNameStartingWithwhere name like ‘?%’
EndingWithfindByNameEndingWithwhere name like ‘%?’
ContainingfindByNameContainingwhere name like ‘%?%’
OrderByfindByIdOrderByXDescwhere id=? order by x desc
NotfindByNameNotwhere name <> ?
InfindByIdIn(Collection<?> c)where id in (?)
NotInfindByIdNotIn(Collection<?> c)where id not in (?)
TruefindByAaaTuewhere aaa = true
FalsefindByAaaFalsewhere aaa = false
IgnoreCasefindByNameIgnoreCasewhere 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;
            }
        })
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值