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

作者:我是java小学渣 时间:2024-01-17 16:20:59 

一、 使用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.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=true

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

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、项目结构

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

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 实现
*/

@Service
public 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实现对数据库的增删改查和分页如果想了解更多相关内容请查看下面的相关链接

来源:https://blog.csdn.net/weixin_43683536/article/details/89740687

标签:SpringBoot,MySQL,Jpa
0
投稿

猜你喜欢

  • mysql 5.7以上版本安装配置方法图文教程(mysql 5.7.12\\mysql 5.7.13\\mysql 5.7.14)

    2024-01-17 23:14:46
  • TensorFlow的环境配置与安装方法

    2022-10-29 12:23:19
  • sql字段解析器的实现示例

    2024-01-16 13:36:53
  • 深入JDBC sqlserver连接写法的详解

    2024-01-19 12:47:28
  • Vue组件通信方法案例总结

    2023-07-02 16:51:58
  • windows8.1下Apache+Php+MySQL配置步骤

    2023-06-06 17:59:16
  • 详解python websocket获取实时数据的几种常见链接方式

    2023-09-20 08:22:23
  • 用asp实现读取文件的最后一行的代码

    2011-03-08 10:55:00
  • spring boot 不连接数据库启动的解决

    2024-01-18 06:38:54
  • OpenCV半小时掌握基本操作之傅里叶变换

    2022-03-27 22:25:47
  • 解读ASP.NET 5 & MVC6系列教程(6):Middleware详解

    2023-07-23 22:27:34
  • 在Python中使用gRPC的方法示例

    2021-02-02 16:20:21
  • Ubuntu18.04下安装MySQL(图文教程)

    2024-01-20 12:57:15
  • 带你深入了解数据库设计中的英文术语表

    2008-12-09 14:53:00
  • 深入理解Python异常处理的哲学

    2023-07-27 06:11:28
  • Python FTP文件定时自动下载实现过程解析

    2023-04-30 19:08:51
  • Git在Windows中安装与使用教程

    2023-11-01 08:47:55
  • python multiply()与dot使用示例讲解

    2021-08-14 19:34:52
  • 10款最好的Web开发的 Python 框架

    2023-12-21 11:26:04
  • MySQL实现SQL Server的sp_executesql

    2008-11-20 15:01:00
  • asp之家 网络编程 m.aspxhome.com