Spring Boot学习:整合并使用Spring Data JPA

JPA和Spirng Data JPA概述

在讲之前,我们需要先知道这几个概念

  • JPA
  • Hibernate
  • Spring Data
  • Spring Data JPA
    JPA
    JPA(Java Persistence API)是Sun官方提出的Java持久化规范,它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据。
    JPA是一种规范和标准,也就是类似于Java中的接口,由Sun公司官方定义,但是并没有指定谁来实现.
    现在几个主要的JPA实现技术有Hibernate、EclipseLink、OpenJPA等
    Hibernate
    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的ORM框架。 Hibernate可以自动生成SQL语句、自动执行,从而使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库.
    实际上,JPA规范制定过程中就是借鉴了Hibernate等这些开源的持久框架,也就是说Hibernate的出现比JPA还要早些。
    在Hibernate中使用的注解就是JPA注解,Hibernate实现了JPA规范。
    Spring Data
    Spring Data是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得数据库的访问变得方便快捷, 并支持map-reduce框架和云计算数据服务。Spring Data本身就是一个开源的框架.
    Spring Data JPA
    上面说过Spring Data是一个开源框架,在这个框架中Spring Data JPA只是这个框架中的一个模块,查看官方文档,我们可以看到Spring Data中还有很多诸如SpringDataRedis、SpringDataMongoDB、SpringDataJDBC等等。
    它可以极大的简化JPA的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作。除了CRUD外,还包括如分页、排序等一些常用的功能。

如何在SpringBoot中使用Spring Data JPA

  1. 在pom.xml中添加依赖
        
        
            org.springframework.boot
            spring-boot-starter-data-jpa
        
  1. yml配置文件中加入jpa配置( 数据库连接的配置跟之前的相同不变)
spring:
  jpa:
    show-sql: true # 默认false,在日志里显示执行的sql语句
    database: mysql
    hibernate.ddl-auto: update #指定为update,每次启动项目检测表结构有变化的时候会新增字段,表不存在时会新建,如果指定create,则每次启动项目都会清空数据并删除表,再新建
    properties.hibernate.dialect: org.hibernate.dialect.MySQL5Dialect
    database-platform: org.hibernate.dialect.MySQL5Dialect
    hibernate:
      naming:
        implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl #指定jpa的自动表生成策略,驼峰自动映射为下划线格式
        #physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
  1. 在model层创建一个实体类SysAdminUser.java
package com.zhlab.demo.model;

import javax.persistence.*;
import java.util.Date;

@Entity // @Entity: 实体类, 必须
@Table(name="sys_admin_user") //指定表名称
public class SysAdminUser {

    @Id // @Id: 指明id列, 必须
    @GeneratedValue(strategy = GenerationType.IDENTITY) // @GeneratedValue: 表明是否自动生成, 必须, strategy也是必写, 指明主键生成策略, 默认是Oracle
    private Long adminUserId;

    @Column(name = "user_name", nullable = false)
    private String userName;

    @Column(name = "password", nullable = false)
    private String password;

    @Column(name = "nick_name", nullable = false)
    private String nickName;

    @Column(name = "dept_id")
    private Long deptId;

    private String phone;

    private String email;

    private String avatar;

    private Boolean status;

    private Boolean deletedFlag;

    private String loginIp;

    private Date loginTime;

    private Date createdAt;

    private Date updatedAt;

    private Date deletedAt;

    private Long createdBy;

    private Long updatedBy;

    private Long deletedBy;

    private String remark;

    // 省略getter、setter
}
  1. 在DAO层创建SysAdminUserRepository.java并继承JpaRepository接口
package com.zhlab.demo.dao;

import com.zhlab.demo.model.SysAdminUser;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.CrudRepository;

import java.io.Serializable;

public interface SysAdminUserRepository extends JpaRepository, Serializable {
    // 就这么简单?
    // 对,就这么简单,什么都不用写,这是Spring Data JPA 默认帮我们实现了基本的数据库操作
    // 如果需要扩展,可以自定义符合Spring Data JPA规则的查询方法,由框架将其自动解析为SQL
}

可以查看JpaRepository接口,它继承了PagingAndSortingRepository接口

@NoRepositoryBean
public interface JpaRepository extends PagingAndSortingRepository, QueryByExampleExecutor {
//...省略
}

继续查看PagingAndSortingRepository接口,它又继承了CrudRepository接口

@NoRepositoryBean
public interface PagingAndSortingRepository extends CrudRepository {
    Iterable findAll(Sort var1);

    Page findAll(Pageable var1);
}

查看CrudRepository接口

package org.springframework.data.repository;

import java.util.Optional;

@NoRepositoryBean
public interface CrudRepository extends Repository {
     S save(S var1);

     Iterable saveAll(Iterable var1);

    Optional findById(ID var1);

    boolean existsById(ID var1);

    Iterable findAll();

    Iterable findAllById(Iterable var1);

    long count();

    void deleteById(ID var1);

    void delete(T var1);

    void deleteAll(Iterable var1);

    void deleteAll();
}

可以看到CrudRepository已经帮我们做了一些基础的CRUD操作,它是顶层CURD接口。

如果有自定义写查询方法的需求,可以参考Spring Data JPA 命名规范


Spring Boot学习:整合并使用Spring Data JPA_第1张图片
Spring Data JPA 命名规范
  1. 在Service层创建一个SysAdminUserService.java
package com.zhlab.demo.service;

import com.zhlab.demo.dao.SysAdminUserRepository;
import com.zhlab.demo.model.SysAdminUser;
import com.zhlab.demo.utils.PageVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @ClassName SysAdminUserService
 * @Description //SysAdminUserService
 * @Author singleZhang
 * @Email [email protected]
 * @Date 2020/10/31 0031 上午 9:45
 **/
@Service
public class SysAdminUserService {

    @Autowired
    SysAdminUserRepository sysAdminUserRepository;

    /**
     * 新增用户
     * */
    public void addUser(SysAdminUser user) {
        sysAdminUserRepository.save(user);
    }

    /**
     * 查询所有用户
     * */
    public List findAll(){
        return sysAdminUserRepository.findAll(Sort.by("adminUserId").descending());
    }

    /**
     * 分页方法1
     * */
    public Object findPage(PageVo pageVo){
        return sysAdminUserRepository.findAll(PageRequest.of(pageVo.getPageNum(),pageVo.getPageSize()));
    }

    /**
     * 分页方法2
     * */
    public Page findPageable(PageVo pageVo){
        Pageable pageable = PageRequest.of(pageVo.getPageNum(), pageVo.getPageSize());

        return sysAdminUserRepository.findAll(pageable);
    }

}

  1. 在接口层创建UserController.java
package com.zhlab.demo.controller;

import com.zhlab.demo.model.SysAdminUser;
import com.zhlab.demo.service.SysAdminUserService;
import com.zhlab.demo.utils.PageVo;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @ClassName UserController
 * @Description //用户接口层
 * @Author singleZhang
 * @Email [email protected]
 * @Date 2020/10/31 0031 上午 9:43
 **/
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    SysAdminUserService sysAdminUserService;

    /* 方法注解 */
    @ApiOperation(value = "方法名:用户列表", notes = "获取用户列表")
    @GetMapping("/list")
    public List list(){
        List list = sysAdminUserService.findAll();
        return list;
    }

    /* 方法注解 */
    @ApiOperation(value = "方法名:用户列表分页", notes = "分页获取用户列表")
    @PostMapping("/listForPage")
    public Object listPage(@RequestBody PageVo pageVo){
        Object list = sysAdminUserService.findPage(pageVo);
        return list;
    }

    /* 方法注解 */
    @ApiOperation(value = "方法名:用户列表分页2", notes = "分页获取用户列表2")
    @PostMapping("/listForPageable")
    public Page listPageable(@RequestBody PageVo pageVo){
        Page list = sysAdminUserService.findPageable(pageVo);
        return list;
    }

    @ApiOperation(value = "方法名:新增用户", notes = "新增用户")
    @PostMapping("/add")
    public void add(@RequestBody SysAdminUser user){
        sysAdminUserService.addUser(user);
    }
}

创建一个分页请求参数类PageVo.java

    private int pageNum;
    private int pageSize;

    public int getPageNum() {
        return pageNum;
    }

    public void setPageNum(int pageNum) {
        this.pageNum = pageNum;
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }
  1. 好了,走完上述的步骤,启动项目就可以调试了
    打开http://localhost:8080/swagger-ui.html查看接口
    Spring Boot学习:整合并使用Spring Data JPA_第2张图片
    接口

    新增用户:/user/add
    Spring Boot学习:整合并使用Spring Data JPA_第3张图片
    新增用户-参数

    Spring Boot学习:整合并使用Spring Data JPA_第4张图片
    新增用户-成功

    查询所有用户:/user/list
    Spring Boot学习:整合并使用Spring Data JPA_第5张图片
    查询所有用户

    分页查询1:/user/listForPage、分页查询2:/user/listForPageable
    Spring Boot学习:整合并使用Spring Data JPA_第6张图片
    输入参数

    Spring Boot学习:整合并使用Spring Data JPA_第7张图片
    输出结果

总结

好了,以上就是对Spring Data JPA的简单应用,今后在项目中它应用地比较广泛,必须掌握这个技能。

项目地址

https://gitee.com/kaixinshow/springboot-note

返回【Spring Boot学习】目录

你可能感兴趣的:(Spring Boot学习:整合并使用Spring Data JPA)