JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
使用Springboot和jpa对数据库进行操作时,能够大大减少我们的工作量,在jpa中,已经在底层封装好了增删查的功能和sql语句,可以使我们进行快速开发
二、项目过程和配置文件 1、applaction.properties文件配置#数据源配置 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver #注意 test是你要连接的数据库的名字 见下图 spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=root spring.datasource.initialSize=20 spring.datasource.minIdle=50 spring.datasource.maxActive=500 #上下文配置 server.port=8888 server.servlet.context-path=/kude #配置jpa #帮我们自动生成表结构 spring.jpa.properties.hibernate.hbm2ddl.auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect spring.jpa.show-sql= true spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true2、pom.xml文件配置
3、项目结构 4、实体类Studentorg.springframework.boot spring-boot-starter-parent2.1.4.RELEASE com.example kudesoft0.0.1-SNAPSHOT kudesoft Demo project for Spring Boot 1.8 org.springframework.boot spring-boot-starter-data-jpaorg.springframework.boot spring-boot-starter-thymeleaforg.springframework.boot spring-boot-starter-weborg.springframework.boot spring-boot-devtoolsruntime mysql mysql-connector-javaruntime org.springframework.boot spring-boot-starter-testtest com.alibaba druid1.1.10 com.github.pagehelper pagehelper-spring-boot-starter1.2.10 org.springframework.boot spring-boot-maven-plugin
package com.example.kudesoft.entity;
import javax.persistence.*;
@Entity
@Table(name = "student")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String sname;
private String spassword;
public Student() {
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", sname='" + sname + ''' +
", spassword='" + spassword + ''' +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getSpassword() {
return spassword;
}
public void setSpassword(String spassword) {
this.spassword = spassword;
}
}
5、DAO层
package com.example.kudesoft.dao; import com.example.kudesoft.entity.Student; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import java.util.List; public interface StudentDAO extends JpaRepository{ //根据id查 Student findStudentById(Integer id); //根据名字查询 @Query(name = "findStudentBySname",nativeQuery = true, value = "select * from student where sname=:sname") List findStudentBySname(@Param("sname") String sname); //登录功能 Student findStudentBySnameAndSpassword(@Param("sname") String sname,@Param("spassword") String spassword); }
在jpa中封装有查询功能、添加功能、删除功能,但是没有修改功能以及一些特定的查询功能,所以在编程过程中,我们需要根据需求来增加一些功能函数。如果要是根据id来进行查询或其他操作时,数据库中的主键id 一定要设为id,不要设置为sid、uid等其他的主键名。
6、Service层
package com.example.kudesoft.service;
import com.example.kudesoft.entity.Student;
import org.springframework.data.domain.Page;
import java.util.List;
public interface StudentService {
//查询所有
List findAll();
//根据id查询单个
Student findStudentById(Integer id);
//根据name查询
List findStudentByName(String sname);
//登录
Student findStudentByNameAndPassword(String sname,String spassword);
//添加一个
Student save(Student student);
//删除一个
void deleteStudentById(Integer id);
//修改
Student update(Student student);
//分页
Page findAll(int page, int pageSize);
}
在编写分页功能时,一定要注意Page所在的包是import org.springframework.data.domain.Page,不是其他的包,如果包导错了,就会出现错误。
7、ServiceImpl
package com.example.kudesoft.service;
import com.example.kudesoft.dao.StudentDAO;
import com.example.kudesoft.entity.Student;
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.stereotype.Service;
import java.util.List;
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
private StudentDAO studentDAO;
@Override
public List findAll() {
return studentDAO.findAll();
}
@Override
public Student findStudentById(Integer id) {
return studentDAO.findStudentById(id);
}
@Override
public List findStudentByName(String sname) {
return studentDAO.findStudentBySname(sname);
}
@Override
public Student findStudentByNameAndPassword(String sname, String spassword) {
return studentDAO.findStudentBySnameAndSpassword(sname,spassword);
}
@Override
public Student save(Student student) {
return studentDAO.save(student);
}
@Override
public void deleteStudentById(Integer id) {
studentDAO.deleteById(id);
}
@Override
public Student update(Student student) {
return studentDAO.save(student);
}
@Override
public Page findAll(int page, int pageSize) {
Pageable pageable = PageRequest.of(page,pageSize);
return (Page) studentDAO.findAll(pageable);
}
}
在进行分页操作的时候,由于Jpa中封装有很多的findAll()函数,所以一定要看清楚要用哪一个findAll()函数,如上代码片:查询所有的studentDAO.findAll()和分页的studentDAO.findAll()函数一样,但是内部参数不一样,所以就会产生不一样的结果。
8、Controller层
package com.example.kudesoft.controller;
import com.example.kudesoft.entity.Student;
import com.example.kudesoft.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
@RestController
@RequestMapping("/student")
public class StudentController {
@Autowired
private StudentService studentService;
@GetMapping("/findAll")
public List findAll(){
return studentService.findAll();
}
@GetMapping("/findById")
public Student fingById(Integer id){
return studentService.findStudentById(id);
}
@GetMapping("/findByName")
public List findByName(String name){
return studentService.findStudentByName(name);
}
@PostMapping("/login")
public Student login(String sname,String spassword){
return studentService.findStudentByNameAndPassword(sname,spassword);
}
@PostMapping("/add")
public Student save(Student student){
return studentService.save(student);
}
@GetMapping("/delete/{id}")
public String deleteById(@PathVariable Integer id){
studentService.deleteStudentById(id);
return "删除成功";
}
@PostMapping("/update")
public Student update(Student student){
return studentService.update(student);
}
@GetMapping("/query")
public Page findByPage(Integer page, HttpServletResponse httpServletResponse){
httpServletResponse.setHeader("Access-Control-Allow-Origin","*");
if (page==null || page<=0){
page = 0;
}else {
page = page-1;
}
return studentService.findAll(page,5);
}
}
在controller层中,我们对于各个功能的实现一定要明白使用Get方式还是Post方式进行操作,否则就会出现服务器内部错误等等。
三、注意在项目的各个功能实现过程中,由于其中含有很多的同名方法和jar包,所以我们在编程过程中一定要注意用对jar包,不要因为导错jar包而给我们增加工作量
本文介绍了SpringBoot+MySQL+Jpa实现对数据库的增删改查和分页如果想了解更多相关内容请查看下面的相关链接



