SpringBoot+MySQL+Jpa实现对数据库的增删改查和分页详解

时间:2021-05-20

一、 使用Springboot+Jpa实现对mysql数据库的增删改查和分页功能

JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

使用Springboot和jpa对数据库进行操作时,能够大大减少我们的工作量,在jpa中,已经在底层封装好了增删查的功能和sql语句,可以使我们进行快速开发

二、项目过程和配置文件

1、applaction.properties文件配置

#数据源配置spring.datasource.type=com.alibaba.druid.pool.DruidDataSourcespring.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/Shanghaispring.datasource.username=rootspring.datasource.password=rootspring.datasource.initialSize=20spring.datasource.minIdle=50spring.datasource.maxActive=500#上下文配置server.port=8888server.servlet.context-path=/kude#配置jpa#帮我们自动生成表结构spring.jpa.properties.hibernate.hbm2ddl.auto=updatespring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialectspring.jpa.show-sql= truespring.jpa.properties.hibernate.enable_lazy_load_no_trans=true

2、pom.xml文件配置

<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>kudesoft</artifactId><version>0.0.1-SNAPSHOT</version><name>kudesoft</name><description>Demo project for Spring Boot</description><properties> <java.version>1.8</java.version></properties><dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- druid数据库连接池--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version> </dependency> <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter 实现分页功能的插件--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.10</version> </dependency></dependencies><build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins></build>

3、项目结构

4、实体类Student

package com.example.kudesoft.entity;import javax.persistence.*;/** * Student实体类 * @Entity 表示该类是一个实体类 * @Table(name = "student") 表示该类对应数据库中的student表 * @Id 表明该属性是一个主键 * @GeneratedValue(strategy = GenerationType.IDENTITY) 表示该主键自增 */@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<Student,Integer> { //根据id查 Student findStudentById(Integer id); //根据名字查询 @Query(name = "findStudentBySname",nativeQuery = true, value = "select * from student where sname=:sname") List<Student> 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<Student> findAll(); //根据id查询单个 Student findStudentById(Integer id); //根据name查询 List<Student> findStudentByName(String sname); //登录 Student findStudentByNameAndPassword(String sname,String spassword); //添加一个 Student save(Student student); //删除一个 void deleteStudentById(Integer id); //修改 Student update(Student student); //分页 Page<Student> 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 实现*/@Servicepublic class StudentServiceImpl implements StudentService { @Autowired private StudentDAO studentDAO; /** * 查询所有 * @return */ @Override public List<Student> findAll() { return studentDAO.findAll(); } /** * 根据id查询 * @param id * @return */ @Override public Student findStudentById(Integer id) { return studentDAO.findStudentById(id); } /** * 根据名字查询 * @param sname * @return */ @Override public List<Student> findStudentByName(String sname) { return studentDAO.findStudentBySname(sname); } /** * * 查询name和password进行登录 * @param sname * @param spassword * @return */ @Override public Student findStudentByNameAndPassword(String sname, String spassword) { return studentDAO.findStudentBySnameAndSpassword(sname,spassword); } /** * 添加信息 * @param student * @return */ @Override public Student save(Student student) { return studentDAO.save(student); } /** * 根据id来删除 * @param id */ @Override public void deleteStudentById(Integer id) { studentDAO.deleteById(id); } /** * 修改 * @param student * @return */ @Override public Student update(Student student) { return studentDAO.save(student); } /** * 分页操作 * @param page * @param pageSize * @return */ @Override public Page<Student> findAll(int page, int pageSize) { Pageable pageable = PageRequest.of(page,pageSize); return (Page<Student>) 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;/** *控制层 * @Autowired 用于类中的属性注入 * @RestController注解底层包括了@ResponseBody和@Controller两个注解 * @ResponseBody 将数据以json格式返回 * @RequestMapping("/XXXX") 请求路径 * @GetMapping("/xxxx") Get请求 * @PostMapping("/XXX") Post请求 */@RestController@RequestMapping("/student")public class StudentController { @Autowired private StudentService studentService; /** * 查询所有 * @return */ @GetMapping("/findAll") public List<Student> findAll(){ return studentService.findAll(); } /** * 根据id查询 * @param id * @return */ @GetMapping("/findById") public Student fingById(Integer id){ return studentService.findStudentById(id); } /** * 根据名字查询 * @param name * @return */ @GetMapping("/findByName") public List<Student> findByName(String name){ return studentService.findStudentByName(name); } /** * 登录功能 * @param sname * @param spassword * @return */ @PostMapping("/login") public Student login(String sname,String spassword){ return studentService.findStudentByNameAndPassword(sname,spassword); } /** * 添加信息 * @param student * @return */ @PostMapping("/add") public Student save(Student student){ return studentService.save(student); } /** * 删除信息 * @param id * 使用 RESTful规范 */ @GetMapping("/delete/{id}") public String deleteById(@PathVariable Integer id){ studentService.deleteStudentById(id); return "<h2>删除成功</h2>"; } /** * 更新信息 * @param student * @return */ @PostMapping("/update") public Student update(Student student){ return studentService.update(student); }/***分页操作**/ @GetMapping("/query") public Page<Student> 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实现对数据库的增删改查和分页如果想了解更多相关内容请查看下面的相关链接

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章