SpringBoot學習筆記[0],Jpa (MySql版)

目錄

CrudRepository 接口訪問數據

PagingAndSortingRepository 接口訪問數據

簡單條件查詢

關聯查詢和@Query查詢

@NameQuery查詢

Specification查詢


所有示例的啓動類和配置文件都是一樣的

啓動類

/**
 * 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();
	}
}

測試用例

新規用戶,修改用戶,抽出用戶,刪除用戶

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 什麼的~

晚安!!!~~~ 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章