springData之jpa学习总结(1):基本单表crud用法与分页排序

依赖:

<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>
        <version>5.1.46</version>
    </dependency>

application.properties配置文件:

spring.datasource.url=jdbc:mysql://localhost:3306/gkl1120?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

dao层

package com.gkl1120.repository;


import com.gkl1120.bean.Student;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
import java.util.Map;

public interface StudentRepository extends JpaRepository<Student , String> {
    List<Student> findByName(String name);

    List<Student> findByNameLike(String name);

    List<Student> findByAgeBetween(int startAge, int endAge);

    //hql
    @Query("from t_student where name like ?1 and age <= ?2")
    List<Student> findByZheGe(String name , int age);

    //sql
    @Query(value = "select * from t_student where name like ? and age <= ?" , nativeQuery = true)
    List<Student> findByZheGeSQL(String name , int age);

    //想试试能不能映射没有实体类的表,用map接,不可行,返回空
    //sql
    @Query(value = "select * from student where sname like ? and sage <= ?" , nativeQuery = true)
    List<Map<String , Object>> findByZheGeSQLMap(String name , int age);


    @Query("update t_student set name = ?1 , age = ?2 where id = ?3")
    @Modifying
    void updateByHql(String name , int age ,String id);
}

service层

package com.gkl1120.service;


import com.gkl1120.bean.Student;
import com.gkl1120.response.MyPageResponse;
import org.springframework.data.domain.Pageable;
import java.util.List;
import java.util.Map;

public interface StudentService {
    boolean saveStudent(Student student);
    boolean deleteStudentById(String id);
    boolean updateStudent(Student student);
    Student getStudentById(String id);
    List<Student> getStudentList();

    List<Student> findByName(String name);

    List<Student> findByNameLike(String name);

    List<Student> findByAgeBetween(int startAge , int endAge);

    List<Student> findByZheGe(String name , int age);

    List<Map<String , Object>> findByZheGeSQLMap(String name , int age);

    void updateByHql(String name , int age , String id);

    MyPageResponse findListPage(Pageable pageable);
}
package com.gkl1120.service.impl;

import com.gkl1120.bean.Student;
import com.gkl1120.repository.StudentRepository;
import com.gkl1120.response.MyPageResponse;
import com.gkl1120.service.StudentService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.data.domain.Pageable;

import java.util.Date;
import java.util.List;
import java.util.Map;

@Service
public class StudentServiceImpl implements StudentService {

    @Autowired
    private StudentRepository studentRepository;
    private final Logger logger = LoggerFactory.getLogger(getClass());
    @Override
    public boolean saveStudent(Student student) {
        student.setCreateTime(new Date());
        Student obj = studentRepository.save(student);
        return obj != null ? true : false;
    }

    @Override
    public boolean deleteStudentById(String id) {
        if(studentRepository.existsById(id)) {
            studentRepository.deleteById(id);
            return true;
        }
        return false;
    }

    @Override
    public boolean updateStudent(Student student) {
        if(student.getId() == null) {
            logger.error("未找到该数据,修改失败!");
            return false;
        }
        Student obj = studentRepository.save(student);
        return obj != null ? true : false;
    }

    @Override
    public Student getStudentById(String id) {
        if(id!=null && studentRepository.existsById(id)) {
            return studentRepository.getOne(id);
        }
        return null;
    }

    @Override
    public List<Student> getStudentList() {
        return studentRepository.findAll();
    }

    @Override
    public List<Student> findByName(String name) {
        return studentRepository.findByName(name);
    }

    @Override
    public List<Student> findByNameLike(String name) {
        return studentRepository.findByNameLike("%" + name + "%");
    }

    @Override
    public List<Student> findByAgeBetween(int startAge , int endAge) {
        return studentRepository.findByAgeBetween(startAge , endAge);
    }

    @Override
    public List<Student> findByZheGe(String name, int age) {
        return studentRepository.findByZheGeSQL(name + "%", age);
    }

    @Override
    public List<Map<String, Object>> findByZheGeSQLMap(String name, int age) {
        return studentRepository.findByZheGeSQLMap(name , age);
    }

    @Transactional
    @Override
    public void updateByHql(String name, int age ,String id) {
        studentRepository.updateByHql(name , age ,id);
    }

    @Override
    public MyPageResponse findListPage(Pageable pageable) {
        MyPageResponse myPageResponse =new MyPageResponse();
        Page<Student> studentPage = studentRepository.findAll(pageable);
        myPageResponse.setData(studentPage.getContent());
        myPageResponse.setTotal(studentPage.getTotalElements());
        myPageResponse.setTotalPage(studentPage.getTotalPages());
        return myPageResponse;
    }
}

实体类:

package com.gkl1120.bean;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.annotations.GenericGenerator;
import org.springframework.format.annotation.DateTimeFormat;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import java.util.Date;

@ApiModel
@Data
@Entity(name = "t_student")
@GenericGenerator(name = "jpa-uuid", strategy = "uuid")
//@JsonIgnoreProperties({"hibernateLazyInitializer" , "handler" , "fieldHandler"})
public class Student {
    @Id
    @GeneratedValue(generator = "jpa-uuid")
    @ApiModelProperty(value = "id")
    private String id;
    @ApiModelProperty(value = "姓名")
    private String name;
    @ApiModelProperty(value = "年龄")
    private int age;
    @ApiModelProperty(value = "地址")
    private String address;
    @ApiModelProperty(value = "创建时间")
//    //@DateTimeFormat意义是使前端字符串格式到后台会转成Date类型,@JsonFormat是将把Date类型转成字符串给前端返回
//    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" ,timezone = "GMT+8")
    private Date createTime;
    @ApiModelProperty(value = "修改时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8")
    private Date updateTime;
}
package com.gkl1120.response;

import lombok.Data;

@Data
public class MyPageResponse {
    private long total;
    private Object data;
    private int totalPage;

}
package com.gkl1120.controller;

import com.gkl1120.bean.Student;
import com.gkl1120.response.MyPageResponse;
import com.gkl1120.service.StudentService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

@Api("student接口")
@RestController
@RequestMapping("/student")
public class StudentController {
    @Autowired
    private StudentService studentService;

    @PostMapping("save")
    public boolean save(@RequestBody Student student) {
        return studentService.saveStudent(student);
    }

    @DeleteMapping("delete")
    public boolean delete(String id) {
        return studentService.deleteStudentById(id);
    }

    @GetMapping("getById")
    public Student getById(String id) {
        return studentService.getStudentById(id);
    }


    @PutMapping("update")
    public boolean update(@RequestBody Student student) {
        return studentService.updateStudent(student);
    }


    @GetMapping("getList")
    public List<Student> getList() {
        return studentService.getStudentList();
    }

    @GetMapping("test")
    public Object test(int page , int size) {
        Sort sort = Sort.by(Sort.Direction.ASC , "createTime" , "age");
        Pageable pageable = PageRequest.of(page - 1, size , sort);
//        Pageable pageable = PageRequest.of(page - 1, size , Sort.Direction.DESC , "createTime","id" ,"createTime");
        MyPageResponse myPageResponse = studentService.findListPage(pageable);
        return myPageResponse;
    }
}

总结:在目前最新的springboot版本,jpa的排序与分页对象Pageable与Sort的创建方式不再使new了,而是使用静态方法创建:
排序方法1:

 Sort sort = Sort.by(Sort.Direction.ASC , "createTime" , "age");
 //后面可以接多个字段

排序方法2(利用Order方式,老版本可能是直接new Order(),现在我看Order是直接移到Sort类里面了,更灵活,后面可以跟多个):

 Sort sort = Sort.by(Sort.Order.desc("age") , Sort.Order.asc("createTime"));

分页:

 Pageable pageable = PageRequest.of(page - 1, size);

同时可以带上排序sort

Pageable pageable = PageRequest.of(page - 1, size , Sort);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值