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

2020-11-02  本文已影响0人  singleZhang2010

JPA和Spirng Data JPA概述

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

如何在SpringBoot中使用Spring Data JPA

  1. 在pom.xml中添加依赖
        <!-- jpa -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
  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<SysAdminUser,Long>, Serializable {
    // 就这么简单?
    // 对,就这么简单,什么都不用写,这是Spring Data JPA 默认帮我们实现了基本的数据库操作
    // 如果需要扩展,可以自定义符合Spring Data JPA规则的查询方法,由框架将其自动解析为SQL
}

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

@NoRepositoryBean
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
//...省略
}

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

@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
    Iterable<T> findAll(Sort var1);

    Page<T> findAll(Pageable var1);
}

查看CrudRepository接口

package org.springframework.data.repository;

import java.util.Optional;

@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {
    <S extends T> S save(S var1);

    <S extends T> Iterable<S> saveAll(Iterable<S> var1);

    Optional<T> findById(ID var1);

    boolean existsById(ID var1);

    Iterable<T> findAll();

    Iterable<T> findAllById(Iterable<ID> var1);

    long count();

    void deleteById(ID var1);

    void delete(T var1);

    void deleteAll(Iterable<? extends T> var1);

    void deleteAll();
}

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

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


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 405780096@qq.com
 * @Date 2020/10/31 0031 上午 9:45
 **/
@Service
public class SysAdminUserService {

    @Autowired
    SysAdminUserRepository sysAdminUserRepository;

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

    /**
     * 查询所有用户
     * */
    public List<SysAdminUser> 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<SysAdminUser> 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 405780096@qq.com
 * @Date 2020/10/31 0031 上午 9:43
 **/
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    SysAdminUserService sysAdminUserService;

    /* 方法注解 */
    @ApiOperation(value = "方法名:用户列表", notes = "获取用户列表")
    @GetMapping("/list")
    public List<SysAdminUser> list(){
        List<SysAdminUser> 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<SysAdminUser> listPageable(@RequestBody PageVo pageVo){
        Page<SysAdminUser> 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查看接口
    接口
    新增用户:/user/add
    新增用户-参数
    新增用户-成功
    查询所有用户:/user/list
    查询所有用户
    分页查询1:/user/listForPage、分页查询2:/user/listForPageable
    输入参数
    输出结果

总结

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

项目地址

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

返回【Spring Boot学习】目录

上一篇 下一篇

猜你喜欢

热点阅读