前言
本文要记录的大概内容:
Spring Data JPA( Java Persistence API, Java 持久化API )是Spring提供的一套简化 JPA开发的框架,本文主要介绍如何使用Spring Boot整合Spring Data JPA,如何使用SpringBoot与Spring Data JPA开发某公司资产管理系统的资产类型管理模块,该模块主要包括显示资产类型、新增资产类型、修改资产类型、删除资产类型、查询资产类型等功能。
以下是本篇文章正文内容:
一、什么是JPA?
- JPA是Java Persistence API的简称,是 Java持久化API,是一套Sun公司Java官方制定的ORM 方案,是一种规范或标准
- JPA定义了独特的JPQL(Java Persistence Query Language),JPQL是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表
- 能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询
- 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接口
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);//根据实例查询并排序。
}
public
(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 项目开发教程》(慕课版)