依赖:
<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);