目录
PagingAndSortingRepository 接口访问数据
所有示例的启动类和配置文件都是一样的
启动类
/**
* Hello world!
*
*/
@SpringBootApplication
public class App
{
public static void main( String[] args )
{
SpringApplication.run(App.class, args);
System.out.println( "Hello World!" );
}
}
pom.xml配置文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.chin</groupId>
<artifactId>01_springboot_JPA</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>01_springboot_JPA</name>
<url>http://maven.apache.org</url>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
数据库的配置文件
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/数据库的名字
spring.datasource.username=数据库的用户名
spring.datasource.password=数据库的密码
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.max-active=20
spring.datasource.max-idle=8
spring.datasource.min-idle=8
spring.datasource.initial-size=10
#JPA
spring.jpa.database=MySQL
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
下面的每个示例都按照
实体类 业务接口类 业务类 控制类的顺序展现。。。。。。
以及 测试用例
CrudRepository 接口访问数据
实体类
@Entity
@Table(name="tb_user")
public class User implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String username;
private String loginname;
private char sex;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getLoginname() {
return loginname;
}
public void setLoginname(String loginname) {
this.loginname = loginname;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
定义数据访问层接口
import org.springframework.data.repository.CrudRepository;
import com.chin._springboot_JPA.bean.User;
public interface UserRepository extends CrudRepository<User, Integer>{
}
业务层
注意service的注释
import java.util.Optional;
import javax.annotation.Resource;
import javax.transaction.Transactional;
import org.springframework.stereotype.Service;
import com.chin._springboot_JPA.bean.User;
import com.chin._springboot_JPA.repository.UserRepository;
@Service
public class UserService {
@Resource
private UserRepository userRepository;
@Transactional
public User save(User user){
return userRepository.save(user);
}
@Transactional
public void delete(int id){
userRepository.deleteById(id);
}
public Iterable<User> getAll(){
return userRepository.findAll();
}
public User getById(Integer id){
Optional<User> op = userRepository.findById(id);
return op.get();
}
@Transactional
public void update(User user){
user.setUsername("牛魔王");
user.setLoginname("孙悟空");
}
}
定义控制类
@RestController
@RequestMapping("/user")
public class UserController {
@Resource
private UserService userService;
@RequestMapping("/save")
public String save(){
User user = new User();
user.setLoginname("小白兔");
user.setUsername("小胖胖");
user.setSex('女');
user.setAge(6);
userService.save(user);
return "保存数据成功";
}
@RequestMapping("/update")
public String update(){
User user = userService.getById(1);
userService.update(user);
return "修改数据成功";
}
@RequestMapping("/delete")
public String delete(){
userService.delete(1);
return "删除数据成功";
}
@RequestMapping("/getAll")
public Iterable<User> getAll(){
return userService.getAll();
}
}
测试用例
新规用户,修改用户,抽出用户,删除用户
- http://localhost:8080/user/save
- http://localhost:8080/user/update
- http://localhost:8080/user/getAll
- http://localhost:8080/user/delete
PagingAndSortingRepository 接口访问数据
实体类
@Entity
@Table(name="tb_article")
public class Article implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String title;
private String supplier;
private Double price;
private String locality;
private Date putawayDate;
private int storage;
private String image;
private String description;
private Date createDate;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getSupplier() {
return supplier;
}
public void setSupplier(String supplier) {
this.supplier = supplier;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public String getLocality() {
return locality;
}
public void setLocality(String locality) {
this.locality = locality;
}
public Date getPutawayDate() {
return putawayDate;
}
public void setPutawayDate(Date putawayDate) {
this.putawayDate = putawayDate;
}
public int getStorage() {
return storage;
}
public void setStorage(int storage) {
this.storage = storage;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
}
定义数据访问层接口
import org.springframework.data.repository.PagingAndSortingRepository;
import com.chin._springboot_JPA.bean.Article;
public interface ArticleRepository extends PagingAndSortingRepository<Article, Integer>{
}
定义业务类
import javax.annotation.Resource;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import com.chin._springboot_JPA.bean.Article;
import com.chin._springboot_JPA.repository.ArticleRepository;
@Service
public class ArticleService {
@Resource
private ArticleRepository articleRepository;
public Iterable<Article> findAllSort(Sort sort){
return articleRepository.findAll(sort);
}
public Page<Article> findAllSort(Pageable page){
return articleRepository.findAll(page);
}
}
定义控制类
@RestController
@RequestMapping("/article")
public class ArticleController {
@Resource
private ArticleService articleService;
@RequestMapping("/sort")
public Iterable<Article> sort(){
Sort sort = new Sort(Sort.Direction.DESC,"id");
Iterable<Article> articles = articleService.findAllSort(sort);
return articles;
}
@RequestMapping("/pager")
public List<Article> sortPagerArticle(int pageIndex){
Sort sort = new Sort(Sort.Direction.DESC,"id");
Pageable page = PageRequest.of(pageIndex - 1, 2 , sort);
Page<Article> articleps = articleService.findAllSort(page);
System.out.println("总页数 :" + articleps.getTotalPages());
System.out.println("总记录数 :" + articleps.getTotalElements());
System.out.println("当前页数 :" + articleps.getNumber() + 1);
System.out.println("当页记录数:" + articleps.getNumberOfElements());
List<Article> articles = articleps.getContent();
System.out.println(articles);
return articles;
}
}
测试用例
排序功能 分页功能
简单条件查询
实体类
@Entity
@Table(name="tb_student")
public class Student implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
private String address;
private int age;
private char sex;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
}
定义数据访问层接口
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import com.chin._springboot_JPA.bean.Student;
public interface StudentRepository extends JpaRepository<Student, Integer>{
/**
* select s from Student s where s.name = ?
*
* @param name
* @return
*/
Student findByName(String name);
/**
* select s from Student s where s.name = ? and s.address =?
*
* @param name
* @param address
* @return
*/
List<Student> findByNameAndAddress(String name,String address);
/**
* select s from Student s where s.name like ?
*
* @param name
* @return
*/
List<Student> findByNameLike(String name);
}
定义业务类
@Service
public class StudentService {
@Resource
private StudentRepository studentRepository;
@Transactional
public void saveAll(List<Student> students){
studentRepository.saveAll(students);
}
public Student getStudentByName(String name){
return studentRepository.findByName(name);
}
public List<Student> getStudentByNameAndAddress(String name,String address){
return studentRepository.findByNameAndAddress(name, address);
}
public List<Student> getStudentByNameLike(String name){
return studentRepository.findByNameLike("%"+name+"%");
}
}
定义控制类
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
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.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.chin._springboot_JPA.bean.Student;
import com.chin._springboot_JPA.service.StudentService;
@RestController
@RequestMapping("/student")
public class StudentController {
@Resource
private StudentService studentService;
@RequestMapping("/save")
public String save(){
Student swk = new Student();
swk.setAddress("水帘洞");
swk.setAge(18);
swk.setSex('男');
swk.setName("孙悟空");
Student hlw = new Student();
hlw.setAddress("爷爷家");
hlw.setAge(5);
hlw.setName("葫芦娃");
hlw.setSex('男');
Student hxz = new Student();
hxz.setAddress("日本");
hxz.setAge(12);
hxz.setName("花仙子");
hxz.setSex('女');
List<Student> stds = new ArrayList<Student>();
stds.add(swk);
stds.add(hlw);
stds.add(hxz);
studentService.saveAll(stds);
return "保存成功";
}
@RequestMapping("/name")
public Student getByName(String name){
return studentService.getStudentByName(name);
}
@RequestMapping("/nameAndAddress")
public List<Student> getByName(String name,String address){
return studentService.getStudentByNameAndAddress(name, address);
}
@RequestMapping("/nameLike")
public List<Student> getByNameLike(String name){
return studentService.getStudentByNameLike(name);
}
}
测试用例
http://localhost:8080/student/save
http://localhost:8080/student/name?name=孙悟空
http://localhost:8080/student/nameAndAddress?name=孙悟空&address=花果山
http://localhost:8080/student/nameLike?name=孙
关联查询和@Query查询
实体类
@Entity
@Table(name="tb_clazz")
public class Clazz implements Serializable{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int code;
private String name;
@OneToMany(fetch=FetchType.LAZY,targetEntity=Student.class,mappedBy="clazz")
private Set<Student> students = new HashSet<>();
public Clazz() {
}
public Clazz(String name) {
super();
this.name = name;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
}
@Entity
@Table(name="tb_student")
public class Student implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
private String address;
private int age;
private char sex;
@ManyToOne(fetch=FetchType.LAZY,targetEntity=Clazz.class)
@JoinColumn(name="clazzId",referencedColumnName="code")
private Clazz clazz;
public Student(){};
public Student(int id, String name, String address, int age, char sex, Clazz clazz) {
super();
this.id = id;
this.name = name;
this.address = address;
this.age = age;
this.sex = sex;
this.clazz = clazz;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public Clazz getClazz() {
return clazz;
}
public void setClazz(Clazz clazz) {
this.clazz = clazz;
}
}
定义数据访问层接口
import org.springframework.data.jpa.repository.JpaRepository;
import com.chin._springboot_JPA.bean.Clazz;
public interface ClazzRepository extends JpaRepository<Clazz, Integer> {
}
import java.util.List;
import java.util.Map;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import com.chin._springboot_JPA.bean.Student;
public interface StudentRepository extends JpaRepository<Student, Integer>{
/**
* select s from Student s where s.clazz.name = ?
*
* @param clazzName
* @return
*/
List<Student> findByClazz_name(String clazzName);
/**
* select s from Student s where s.clazz.name = ?
*
* @param clazzName
* @return
*/
@Query("select s from Student s where s.clazz.name = ?1")
List<Student> findStdsByClazzName(String clazzName);
/**
* select new Map(s.name as name,s.sex as sex) from Student s where s.clazz.name = ?1
*
* @param clazzName
* @return
*/
@Query("select new Map(s.name as name,s.sex as sex) from Student s where s.clazz.name = ?1")
List<Map<String,Object>> findNameAndSexByClazzName(String clazzName);
@Query("select s.name from Student s "+"where s.clazz.name = :clazzName and s.sex = :sex")
List<String> findNameByClazzNameAndSex(@Param("clazzName")String clazzName , @Param("sex")char sex);
@Query("select c.name from Clazz c inner join c.students s where s.name = ?1")
String findClazzNameByStuName(String stuName);
@Modifying
@Query("delete from Student s where s.name = ?1")
int deleteStuByStuName(String stuName);
}
定义业务类
@Service
public class SchoolService {
@Resource
private StudentRepository studentRepository;
@Resource
private ClazzRepository clazzRepository;
@Transactional
public void saveClazzAll(List<Clazz> clazzs){
clazzRepository.saveAll(clazzs);
}
@Transactional
public void saveAll(List<Student> students){
studentRepository.saveAll(students);
}
public List<Map<String,Object>> getStdsByClazzName(String clazzName){
List<Student> students =
studentRepository.findByClazz_name(clazzName);
// List<Student> students = studentRepository.findStdsByClazzName(clazzName);
List<Map<String,Object>> results = new ArrayList<Map<String,Object>>();
for(Student std:students){
Map<String,Object> stu = new HashMap<>();
stu.put("name", std.getName());
stu.put("age", std.getAge());
stu.put("sex", std.getSex());
results.add(stu);
}
return results;
}
public List<Map<String,Object>> findNameAndSexByClazzName(String clazzName){
return studentRepository.findNameAndSexByClazzName(clazzName);
}
public List<String> findNameByClazzNameAndSex(String clazzName,char sex){
return studentRepository.findNameByClazzNameAndSex(clazzName, sex);
}
public String findClazzNameByStuName(String stuName){
return studentRepository.findClazzNameByStuName(stuName);
}
@Transactional
public int deleteStudentByStuName(String stuName){
return studentRepository.deleteStuByStuName(stuName);
}
}
定义控制类
@RestController
@RequestMapping("/student")
public class SchoolController {
@Resource
private SchoolService schoolService;
@RequestMapping("/save")
public String save(){
Clazz clazz1 = new Clazz("班级1");
Clazz clazz2 = new Clazz("班级2");
List<Clazz> clazzs = new ArrayList<Clazz>();
clazzs.add(clazz1);
clazzs.add(clazz2);
schoolService.saveClazzAll(clazzs);
Student swk = new Student();
swk.setAddress("水帘洞");
swk.setAge(18);
swk.setSex('男');
swk.setName("孙悟空");
swk.setClazz(clazz2);
Student hlw = new Student();
hlw.setAddress("爷爷家");
hlw.setAge(5);
hlw.setName("葫芦娃");
hlw.setSex('男');
hlw.setClazz(clazz1);
Student hxz = new Student();
hxz.setAddress("日本");
hxz.setAge(12);
hxz.setName("花仙子");
hxz.setSex('女');
hxz.setClazz(clazz2);
List<Student> stds = new ArrayList<Student>();
stds.add(swk);
stds.add(hlw);
stds.add(hxz);
schoolService.saveAll(stds);
return "保存成功";
}
@RequestMapping("/getClazzStus")
public List<Map<String,Object>> getClazzStus(String clazzName){
return schoolService.getStdsByClazzName(clazzName);
}
@RequestMapping("/findNameAndSexByClazzName")
public List<Map<String,Object>> findNameAndSexByClazzName(String clazzName){
return schoolService.findNameAndSexByClazzName(clazzName);
}
@RequestMapping("/findNameByClazzNameAndSex")
public List<String> findNameByClazzNameAndSex(String clazzName,Character sex){
return schoolService.findNameByClazzNameAndSex(clazzName,sex);
}
@RequestMapping("/findClazzNameByStuName")
public String findClazzNameByStuName(String stuName){
return schoolService.findClazzNameByStuName(stuName);
}
@RequestMapping("/deleteStuByStuName")
public String deleteStuByStuName(String stuName){
return "删除的数据是:"+schoolService.deleteStudentByStuName(stuName);
}
}
测试用例
http://localhost:8080/student/save
http://localhost:8080/student/getClazzStus?clazzName=班级1
http://localhost:8080/student/findNameAndSexByClazzName?clazzName=班级1
http://localhost:8080/student/findNameByClazzNameAndSex?clazzName=班级1&sex=女
http://localhost:8080/student/findClazzNameByStuName?stuName=孙悟空
http://localhost:8080/student/deleteStuByStuName?stuName=孙悟空
@NameQuery查询
实体类
@Entity
@Table(name="tb_clazz05")
public class Clazz implements Serializable{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int code;
private String name;
@OneToMany(fetch=FetchType.LAZY,targetEntity=Student.class,mappedBy="clazz")
private Set<Student> students = new HashSet<>();
public Clazz() {
}
public Clazz(String name) {
super();
this.name = name;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
}
@Entity
@Table(name="tb_student5")
@NamedQuery(name="Student.findStudentsByClazzName",query="select s from Student s where s.clazz.name = ?1")
public class Student implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
private String address;
private int age;
private char sex;
@ManyToOne(fetch=FetchType.LAZY,targetEntity=Clazz.class)
@JoinColumn(name="clazzId",referencedColumnName="code")
private Clazz clazz;
public Student(){};
public Student(int id, String name, String address, int age, char sex, Clazz clazz) {
super();
this.id = id;
this.name = name;
this.address = address;
this.age = age;
this.sex = sex;
this.clazz = clazz;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public Clazz getClazz() {
return clazz;
}
public void setClazz(Clazz clazz) {
this.clazz = clazz;
}
}
定义数据访问层接口
import org.springframework.data.jpa.repository.JpaRepository;
import com.chin._springboot_JPA.bean.Clazz;
public interface ClazzRepository extends JpaRepository<Clazz, Integer> {
}
import java.util.List;
import java.util.Map;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import com.chin._springboot_JPA.bean.Student;
public interface StudentRepository extends JpaRepository<Student, Integer>{
/**
* select s from Student s where s.clazz.name = ?
*
* @param clazzName
* @return
*/
List<Student> findStdsByClazzName(String clazzName);
}
定义业务类
@Service
public class SchoolService {
@Resource
private StudentRepository studentRepository;
@Resource
private ClazzRepository clazzRepository;
@Transactional
public void saveClazzAll(List<Clazz> clazzs){
clazzRepository.saveAll(clazzs);
}
@Transactional
public void saveAll(List<Student> students){
studentRepository.saveAll(students);
}
public List<Map<String,Object>> getStdsByClazzName(String clazzName){
List<Student> students =
studentRepository.findStdsByClazzName(clazzName);
List<Map<String,Object>> results = new ArrayList<Map<String,Object>>();
for(Student std:students){
Map<String,Object> stu = new HashMap<>();
stu.put("name", std.getName());
stu.put("age", std.getAge());
stu.put("sex", std.getSex());
results.add(stu);
}
return results;
}
}
定义控制类
@RestController
@RequestMapping("/student")
public class SchoolController {
@Resource
private SchoolService schoolService;
@RequestMapping("/save")
public String save(){
Clazz clazz1 = new Clazz("班级1");
Clazz clazz2 = new Clazz("班级2");
List<Clazz> clazzs = new ArrayList<Clazz>();
clazzs.add(clazz1);
clazzs.add(clazz2);
schoolService.saveClazzAll(clazzs);
Student swk = new Student();
swk.setAddress("水帘洞");
swk.setAge(18);
swk.setSex('男');
swk.setName("孙悟空");
swk.setClazz(clazz2);
Student hlw = new Student();
hlw.setAddress("爷爷家");
hlw.setAge(5);
hlw.setName("葫芦娃");
hlw.setSex('男');
hlw.setClazz(clazz1);
Student hxz = new Student();
hxz.setAddress("日本");
hxz.setAge(12);
hxz.setName("花仙子");
hxz.setSex('女');
hxz.setClazz(clazz2);
List<Student> stds = new ArrayList<Student>();
stds.add(swk);
stds.add(hlw);
stds.add(hxz);
schoolService.saveAll(stds);
return "保存成功";
}
@RequestMapping("/getClazzStus")
public List<Map<String,Object>> getClazzStus(String clazzName){
return schoolService.getStdsByClazzName(clazzName);
}
}
测试用例
http://localhost:8080/student/save
http://localhost:8080/student/getClazzStus
Specification查询
实体类
@Entity
@Table(name="tb_clazz05")
public class Clazz implements Serializable{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int code;
private String name;
@OneToMany(fetch=FetchType.LAZY,targetEntity=Student.class,mappedBy="clazz")
private Set<Student> students = new HashSet<>();
public Clazz() {
}
public Clazz(String name) {
super();
this.name = name;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
}
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
@Entity
@Table(name="tb_student5")
@NamedQuery(name="Student.findStudentsByClazzName",query="select s from Student s where s.clazz.name = ?1")
public class Student implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
private String address;
private int age;
private char sex;
@ManyToOne(fetch=FetchType.LAZY,targetEntity=Clazz.class)
@JoinColumn(name="clazzId",referencedColumnName="code")
private Clazz clazz;
public Student(){};
public Student(int id, String name, String address, int age, char sex, Clazz clazz) {
super();
this.id = id;
this.name = name;
this.address = address;
this.age = age;
this.sex = sex;
this.clazz = clazz;
}
public Student(String name, String address, int age, char sex, Clazz clazz) {
super();
// this.id = id;
this.name = name;
this.address = address;
this.age = age;
this.sex = sex;
this.clazz = clazz;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public Clazz getClazz() {
return clazz;
}
public void setClazz(Clazz clazz) {
this.clazz = clazz;
}
}
定义数据访问层接口
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import com.chin._springboot_JPA.bean.Clazz;
public interface ClazzRepository extends JpaRepository<Clazz, Integer> ,JpaSpecificationExecutor<Clazz>{
}
import java.util.List;
import java.util.Map;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import com.chin._springboot_JPA.bean.Student;
public interface StudentRepository extends JpaRepository<Student, Integer>,JpaSpecificationExecutor<Student>{
/**
* select s from Student s where s.clazz.name = ?
*
* @param clazzName
* @return
*/
List<Student> findStdsByClazzName(String clazzName);
}
定义业务类
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.JoinType;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import com.chin._springboot_JPA.bean.Clazz;
import com.chin._springboot_JPA.bean.Student;
import com.chin._springboot_JPA.repository.ClazzRepository;
import com.chin._springboot_JPA.repository.StudentRepository;
@Service
public class SchoolService {
@Resource
private StudentRepository studentRepository;
@Resource
private ClazzRepository clazzRepository;
@Transactional
public void saveClazzAll(List<Clazz> clazzs){
clazzRepository.saveAll(clazzs);
}
@Transactional
public void saveAll(List<Student> students){
studentRepository.saveAll(students);
}
@SuppressWarnings("serial")
public List<Map<String,Object>> getStdsBySex(char sex){
List<Student> students =
studentRepository.findAll(new Specification<Student>() {
@Override
public Predicate toPredicate(Root<Student> arg0, CriteriaQuery<?> arg1, CriteriaBuilder arg2) {
// arg0.get("sex") 获取这个字段名
// arg2.equal 表示执行equal查询
// 相当于 select s from Student s where s.sex = ?
Predicate p1 = arg2.equal(arg0.get("sex"),sex);
return p1;
}
});
List<Map<String,Object>> results = new ArrayList<Map<String,Object>>();
for(Student std:students){
Map<String,Object> stu = new HashMap<>();
stu.put("name", std.getName());
stu.put("age", std.getAge());
stu.put("sex", std.getSex());
results.add(stu);
}
return results;
}
// new Specification<T>() {
//
@Override
public Predicate toPredicate(Root<Student> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> predicates = new ArrayList<Predicate>();
return query.where(predicates.toArray(new Predicate[predicates.size()])).getRestriction();
}
//
// };)
@SuppressWarnings("serial")
public List<Map<String,Object>> getStdsByDynamic(Student student){
List<Student> students = studentRepository.findAll(new Specification<Student>() {
@Override
public Predicate toPredicate(Root<Student> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> predicates = new ArrayList<Predicate>();
if(student!=null){
if(!StringUtils.isEmpty(student.getName())){
predicates.add(cb.like(root.<String> get("name"), "%" + student.getName() +"%"));
}
if(!StringUtils.isEmpty(student.getAddress())){
predicates.add(cb.like(root.<String> get("address"), "%" + student.getAddress() +"%"));
}
if(student.getSex()!='\0'){
// predicates.add(cb.like(root.<String> get("sex"), "%" + student.getSex() +"%"));
predicates.add(cb.equal(root.<String> get("sex"), student.getSex()));
}
if(student.getClazz()!=null
&&!StringUtils.isEmpty(student.getClazz().getName())){
root.join("clazz",JoinType.INNER);
Path<String> clazzName = root.get("clazz").get("name");
predicates.add(cb.equal(clazzName, student.getClazz().getName()));
}
}
return query.where(predicates.toArray(new Predicate[predicates.size()])).getRestriction();
}
});
List<Map<String,Object>> results = new ArrayList<Map<String,Object>>();
for(Student std1:students){
Map<String,Object> stu = new HashMap<>();
stu.put("name", std1.getName());
stu.put("age", std1.getAge());
stu.put("sex", std1.getSex());
results.add(stu);
}
return results;
}
@SuppressWarnings("serial")
public Page<Student> getStusByPage(String clazzName,int pageIndex,int pageSize){
Sort sort = new Sort(Sort.Direction.DESC,"id");
Page<Student> pages = studentRepository.findAll(new Specification<Student>() {
@Override
public Predicate toPredicate(Root<Student> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
root.join("clazz",JoinType.INNER);
Path<String> clazzNameT = root.get("clazz").get("name");
Predicate p1 = cb.equal(clazzNameT, clazzName);
return p1;
}
},PageRequest.of(pageIndex-1, pageSize,sort));
return pages;
}
}
定义控制类
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.chin._springboot_JPA.bean.Clazz;
import com.chin._springboot_JPA.bean.Student;
import com.chin._springboot_JPA.service.SchoolService;
import com.chin._springboot_JPA.vo.PageData;
@RestController
@RequestMapping("/student")
public class SchoolController {
@Resource
private SchoolService schoolService;
@RequestMapping("/save")
public String save(){
Clazz clazz1 = new Clazz("班级1");
Clazz clazz2 = new Clazz("班级2");
List<Clazz> clazzs = new ArrayList<Clazz>();
clazzs.add(clazz1);
clazzs.add(clazz2);
schoolService.saveClazzAll(clazzs);
Student swk = new Student();
swk.setAddress("水帘洞");
swk.setAge(18);
swk.setSex('男');
swk.setName("孙悟空");
swk.setClazz(clazz2);
Student hlw = new Student();
hlw.setAddress("爷爷家");
hlw.setAge(5);
hlw.setName("葫芦娃");
hlw.setSex('男');
hlw.setClazz(clazz1);
Student hxz = new Student();
hxz.setAddress("日本");
hxz.setAge(12);
hxz.setName("花仙子");
hxz.setSex('女');
hxz.setClazz(clazz2);
// String name, String address, int age, char sex, Clazz clazz
Student zx = new Student("紫霞仙子","盘丝洞",16,'女',clazz1);
Student zzb = new Student("至尊宝","紧箍咒",20,'男',clazz2);
Student tsgz = new Student("铁扇公主","火焰山",36,'女',clazz1);
List<Student> stds = new ArrayList<Student>();
stds.add(swk);
stds.add(hlw);
stds.add(hxz);
stds.add(zx);
stds.add(zzb);
stds.add(tsgz);
schoolService.saveAll(stds);
return "保存成功";
}
@RequestMapping("/getStusBySex")
public List<Map<String,Object>> getStusBySex(char sex){
return schoolService.getStdsBySex(sex);
}
@RequestMapping("/getStusByDynamic")
public List<Map<String,Object>> getStusByDynamic(Student student){
return schoolService.getStdsByDynamic(student);
}
@RequestMapping("/getStusByPage")
public PageData getStusByPage(String clazzName,int pageIndex,int pageSize){
Page<Student> page = schoolService.getStusByPage(clazzName, pageIndex, pageSize);
List<Student> students = page.getContent();
List<Map<String,Object>> stuDatas = new ArrayList<>();
for(Student std:students){
Map<String,Object> stuMap = new HashMap<>();
stuMap.put("id", std.getId());
stuMap.put("name", std.getName());
stuMap.put("age", std.getAge());
stuMap.put("sex", std.getSex());
stuMap.put("address", std.getAddress());
stuMap.put("clazzName", clazzName);
stuDatas.add(stuMap);
}
PageData data = new PageData();
data.setStuDatas(stuDatas);
data.setPageIndex(page.getNumber() + 1);
data.setPageSize(page.getTotalPages());
data.setPageNum(page.getSize());
data.setTotalCount(page.getTotalElements());
return data;
}
}
测试用例
上传 班级和学生的信息
根据性别筛选学生
动态,任意检索条件,检索学生
http://localhost:8080/student/save
http://localhost:8080/student/getStusBySex?sex=女
http://localhost:8080/student/getStusByDynamic?clazz.name=紫霞仙子&sex=女
http://localhost:8080/student/getStusByPage?clazzName=班级1&pageIndex=2&pageSize=3
据说 JPA 还有 dsl 的什么东东
有个什么 factory 之类的东西 ,好像可以生产SQL 什么的~
晚安!!!~~~