Spring Boot整合Spring Data JPA


前言

本文要记录的大概内容:

Spring Data JPA( Java Persistence API, Java 持久化API )是Spring提供的一套简化 JPA开发的框架,本文主要介绍如何使用Spring Boot整合Spring Data JPA,如何使用SpringBoot与Spring Data JPA开发某公司资产管理系统的资产类型管理模块,该模块主要包括显示资产类型、新增资产类型、修改资产类型、删除资产类型、查询资产类型等功能。


以下是本篇文章正文内容:

一、什么是JPA?

  1. JPA是Java Persistence API的简称,是 Java持久化API,是一套Sun公司Java官方制定的ORM 方案,是一种规范或标准
  2. JPA定义了独特的JPQL(Java Persistence Query Language),JPQL是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表
  3. 能够支持批量更新和修改、JOINGROUP BYHAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询
  4. JPA可以通过注解或者XML描述对象-关系表之间的映射关系,并将实体对象持久化到数据库中

二、JPA提供的功能

1.ORM映射元数据

JPA支持XML和注解两种元数据的形式,元数据用来描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中

如@Entity、 @Table 、@Column、@Transient 等注解。

2.JPA 的API

用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来

如entityManager.merge (Tt)

3.JPQL查询语言

通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合

如from Student s where s.name=?

4.JPA与ORM框架的关系

JPA仅仅定义了一些接口,而接口是需要实现才能工作的。所以底层需要某种实现,而Hibernate就是实现了JPA接口的ORM框架。也就是说:JPA是一套ORM规范,Hibernate实现了JPA规范。
如下图所示:
在这里插入图片描述

三、Spring Data JPA

Spring Data JPA是Spring提供的一套简化JPA开发的框架,按照约定好的方法命名规则写Dao层接口,就可以在不写接口实现的情况下,实现对数据库的访问和操作。同时提供了很多除了CRUD之外的功能,如分页、排序、复杂查询等等。

1.Spring Data JPA、JPA与ORM框架关系

如下图所示:
在这里插入图片描述

2.Spring Data JPA中主要有五个接口

(1) Repository接口

用户定义的Dao接口继承Repository接口后,即可根据方法命名规则或@Query查询对数据库进行操作
代码如下:

@org.springframework.stereotype.Repository
public interface UserRepository  extends Repository<User, Integer> {
   }
Repository接口中提供了根据方法名查询方式

方法的名称要遵循 findBy + 属性名(首字母大写) + 查询条件(首字母大写 Is Equals)的格式,如下:

findByNameLike(String name)
findByName(String name)
findByNameAndAge(String name, Integer age)
findByNameOrAddress(String name)

Repository接口中提供了基于@Query注解的查询和更新
 /**
   * SQL nativeQuery的值是true 执行的时候不用再转化
   * @param name
   * @return
   */
 @Query(value = "SELECT * FROM table_user WHERE name = ?1", nativeQuery = true)
      List<User> findByUsernameSQL(String name);
Repository接口中提供了基于HQL查询
/**
         * 基于HQL
         * @param name
         * @param id
         * @return
         */
    @Query("Update User set name = ?1 WHERE id = ?2")
    @Modifying
    int updateNameAndId(String name, Integer id);

(2)CrudRepository接口

@NoRepositoryBean 
public interface CrudRepository<T, ID extendsSerializable> extends Repository<T, ID>{ 
<S extends T> S save(S entity);//保存 
<S extends T> Iterable<S> save(Iterable<S> entities);//批量保存  
T findOne(ID id);//根据id 查询一个对象。返回对象本身,当对象不存在时,返回null  
Iterable<T> findAll();//查询所有的对象 
Iterable<T> findAll(Iterable<ID> ids);//根据id列表查询所有的对象  
boolean exists(ID id);//根据id 判断对象是否存在
long count();//计算对象的总个数 
void delete(ID id);//根据id 删除 
void delete(T entity);//删除一个对象
void delete(Iterable<? extendsT> entities);//批量删除,集合对象(后台执行时,一条一条删除)
           void deleteAll();//删除所有(后台执行时,一条一条删除)
    }

(3)PagingAndSortingRepository接口

@NoRepositoryBean 
public interface PagingAndSortingRepository<T,ID extends Serializable>
       extends CrudRepository<T, ID> { 
                     Iterable<T> findAll(Sort sort);// 仅排序 
                     Page<T>findAll(Pageable pageable);// 分页和排序 
      } 

(4)JpaRepository接口


public interface JpaRepository<T, ID extends Serializable>
        extends PagingAndSortingRepository<T, ID>,QueryByExampleExecutor<T> {  
      List<T>findAll(); //查询所有对象,返回List
      List<T>findAll(Sort sort); //查询所有对象,并排序,返回List
      List<T>findAll(Iterable<ID> ids); //根据id列表查询所有的对象,返回List
      void flush(); //强制缓存与数据库同步
            <S extends T> List<S> save(Iterable<S> entities); //批量保存,并返回对
 List<S extends T> S saveAndFlush(S entity);//保存并强制同步数据
 void deleteInBatch(Iterable<T> entities);//批量删除集合对象(后台执行时,生成一条语句执行,用多个or条件)
 void deleteAllInBatch();//删除所有(执行一条语句,如:delete from user)
     T getOne(ID id); //根据id 查询一个对象,返回对象的引用(区别于findOne)。当对象不存时,返回引用不是null,但各个属性值是null
    <S extends T> List<S> findAll(Example<S> example); //根据实例查询
    <S extends T> List<S> findAll(Example<S> example, Sort sort);//根据实例查询并排序。
}

(5)JpaSpecificationExecutor接口

在这里插入图片描述

四、JPA实例

使用Spring Data JPA实现资产类型管理模块

具体开发步骤如下:

在这里插入图片描述

  • 创建Spring Boot项目,引入JPA依赖
<dependency>
   <groupId>org.springframework.boot</groupId>  
   <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>        
   <scope>runtime</scope></dependency>
  • 实体类
@Entity(name="sys_asset_type")
@Data
public class SysAssetType implements Serializable {    
        @Id    
        @GeneratedValue(strategy = GenerationType.IDENTITY)    
        private Long id;    
        private Long pid;    
        private String name;   

        @Column(name="create_time",nullable = false)    
        private Long createTime;    
        private Long createBy;   
        private Long updateTime;   
        private Long updateBy;    
       @Column(name="super_id",nullable = false)    
        private Long superId;    private Integer delFlag;
} 
  • Dao接口
public interface SysAssetTypeDao extends JpaRepository<SysAssetType,Integer> {  
         //根据id查询资产类型   
        List<SysAssetType> getSysAssetTypeByIdEquals(Integer id);   
          //根据资产名称查询资产类型   
        List<SysAssetType> getSysAssetTypeByNameStartingWith(String  name);    
         //查询所有资产类型   
       @Query("select s from sys_asset_type s")    
        List<SysAssetType> getAllSysAssetType();   
        //根据上一级id查询所有资产类型    
       List<SysAssetType> getAllSysAssetTypeBySuperId(Integer super_id);
} 
  • Service接口
public interface SysAssetTypeService {    
            //添加资产类型    
           public void saveSysAssetType(SysAssetType sysAssetType);   
           //根据id查询资产类型   
           public List<SysAssetType> getSysAssetTypeByIdEquals(Integer id);    
           //根据资产名称查询资产类型   
           public List<SysAssetType> getSysAssetTypeByNameStartingWith(String name);   
            //查询所有资产类型   
           public List<SysAssetType> getAllSysAssetType();    
            //根据上一级id查询所有资产类型    
           public List<SysAssetType> getAllSysAssetTypeBySupserId(Integer super_id);
} 
  • 实现类
@Service
public class SysAssetTypeServiceImpl  implements  SysAssetTypeService{   
      @Autowired    
      SysAssetTypeDao sysAssetTypeDao;             
      //添加资产类型    
     public void saveSysAssetType(SysAssetType sysAssetType) {        
                 sysAssetTypeDao.save(sysAssetType);    
     }    
     //根据id查询资产类型    
     public List<SysAssetType> getSysAssetTypeByIdEquals(Integer id) {       
                return  sysAssetTypeDao.getSysAssetTypeByIdEquals(id);  
     }
     //根据资产名称查询资产类型    
     public List<SysAssetType> getSysAssetTypeByNameStartingWith(String name) {      
                return sysAssetTypeDao.getSysAssetTypeByNameStartingWith(name);   
     }     
     //查询所有资产类型   
     public List<SysAssetType> getAllSysAssetType() {        
               return sysAssetTypeDao.getAllSysAssetType();   
    }
}
  • 控制类
@RestController
public class SysAssetTypeController {  
  @Autowired    
SysAssetTypeService sysAssetTypeService;       
 //添加资产类型@GetMapping("/save")    
public void saveSysAssetType() {       
     SysAssetType sysAssetType=new SysAssetType();         
     sysAssetType.setPid(2l);      
     sysAssetType.setName("打印机");       
     long createTime=(new Date()).getTime();
     System.out.println("createTime="+createTime); 
     sysAssetType.setCreateTime(createTime);    
     sysAssetType.setCreateBy(null);     
     sysAssetType.setUpdateTime(null);   
     sysAssetType.setUpdateBy(null);      
     sysAssetType.setSuperId(2l);       
     sysAssetType.setDelFlag(0);   
     System.out.println(sysAssetType.getSuperId());   
     sysAssetTypeService.saveSysAssetType(sysAssetType);
      System.out.println(sysAssetType);   
 }

//查询所有资产类型    
@GetMapping("/getAll")   
 public void getAllSysAssetType() {       
  List<SysAssetType> sysAssetTypeList=                                        
               sysAssetTypeService.getAllSysAssetType();           
          System.out.println(sysAssetTypeList);   
 }   

 //根据上一级id查询所有资产类型    
@GetMapping("/getAllBySuperId/")    
public void getAllSysAssetType(
                              @PathVariable  Integer superId) {       
        List<SysAssetType> sysAssetTypeList= 
        sysAssetTypeService.getAllSysAssetType();            
        System.out.println(sysAssetTypeList);  
  }
} 
  • 实现结果
    在这里插入图片描述
    在这里插入图片描述

总结

以上就是本文的内容,本文仅仅简单介绍了Spring Data JPA的使用,而Spring Data JPA用来操作实体对象,执行CRUD操作,使框架在后台替代用户完成所有的事情,使开发者从烦琐的JDBC和SQL代码中解脱出来。

参考教材《Spring Boot 项目开发教程》(慕课版)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Boot可以轻松地集成JPA,使得开发者可以更加便捷地进行数据库操作。 以下是Spring Boot整合JPA的步骤: 1. 在pom.xml文件中添加JPA依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> ``` 2. 配置数据源和JPA属性: 在application.properties文件中添加以下配置: ``` spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=root spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect spring.jpa.hibernate.ddl-auto=update ``` 这里配置了MySQL数据库连接信息和JPA属性,其中hibernate.dialect指定了MySQL数据库的方言,hibernate.ddl-auto指定了Hibernate自动建表的策略。 3. 创建实体类: 创建一个实体类,用于映射数据库表: ``` @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name") private String name; @Column(name = "age") private Integer age; // getters and setters } ``` 4. 创建Repository: 创建一个Repository接口,用于操作数据库: ``` @Repository public interface UserRepository extends JpaRepository<User, Long> { List<User> findByName(String name); } ``` 这里使用了Spring Data JPA提供的JpaRepository接口,简化了对数据库的操作。其中findByName方法是根据name字段查询用户信息。 5. 使用Repository: 在Service或Controller中注入UserRepository,即可使用JPA操作数据库: ``` @Service public class UserService { @Autowired private UserRepository userRepository; public List<User> findByName(String name) { return userRepository.findByName(name); } } ``` 这里使用了@Autowired注解,将UserRepository注入到UserService中,然后调用UserRepository的findByName方法查询用户信息。 以上就是Spring Boot整合JPA的基本步骤,开发者可以根据自己的需求对代码进行适当调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值