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
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 实现
*/
@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
猜你喜欢
- 今天在刷leetcode的时候,对于179题返回最大数,用python2中的sorted(cmp)会很方便,但是在python3中这一参数被
- 2020.2.20 更新日志:本文的初衷是因为安装anaconda的时候你并不知道会包含哪个版本的python,因此我制作了下表如果你使用的
- 监控中,通常要使用图片更直观的看出集群的运行状况。以下是一个简单的demo,通过rrdtool生成动态的图片。Python3, tornad
- 1、先看最简单的场景,生产者生产消息,消费者接收消息,下面是生产者的简单代码。#!/usr/bin/env python# -*- codi
- 1,概念及原理:膨胀(Dilating) (或)(1)将图像 A 与任意形状的内核 (B),通常为正方形或圆形,进行卷积。(2)内核 B 有
- 使用python的json模块序列化时间或者其他不支持的类型时会抛异常,例如下面的代码:# -*- coding: cp936 -*-fro
- 当由where子句指定的搜索条件指向另一张表时,就需要使用子查询或嵌套查询。1 子查询子查询是一个嵌套在select、insert、upda
- 前言我们上一篇博客,给大家展现了一个动态的爱心。今天,我们给大家画一个圣诞树,我们一起来看看效果吧。效果展示我们先来看看最终的效果看看我们画
- 背景在校园里认证上网很麻烦需要web输入账号密码有时还会忘记web地址此时就需要一个人或者程序帮我们实现,这时我想到用python制作这个程
- 最近做某项目的数据库分析,要实现对海量数据的导入问题,就是最多把200万条数据一次导入sqlserver中,如果使用普通的insert语句进
- 最近一直在整理统计图表的绘制方法,发现Python中除了经典Seaborn库外,还有一些优秀的可交互的第三方库也能实现一些常见的统计图表绘制
- 经过一段时间的开发与测试,终于发布了Lms框架的第一个正式版本(1.0.0版本),并给出了lms框架的样例项目lms.samples。本文通
- 一、array_map() 1、array_map() 函数将用户自定义函数作用到数组中的每
- 给输入框加个动态背景图<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transi
- 介绍在使用matplotlib的过程中,发现不能像matlab一样同时开几个窗口进行比较,于是查询得知了交互模式,但是放在脚本里运行的适合却
- 类中定义的方法大致可以分为两类:绑定方法和非绑定方法。其中绑定方法又可以分为绑定到对象的方法和绑定到类的方法。一、绑定方法1 对象的绑定方法
- 一、图的定义图是一种比树更复杂的一种数据结构,在图结构中,结点之间的关系是任意的,任意两个元素之间都可能相关,因此,它的应用极广。图中的数据
- 一、场景描述这里有以四张发票为例(辰哥网上搜的),将发票图片放到pic文件夹下。随便打开一张发票提取目标:金额、名称、纳税人识别号、开票人。
- 场景:按照github文档上启动一个flask的app,默认是用5000端口,如果5000端口被占用,启动失败。样例代码:from flas
- 索引 经常要查询的语句,则给它建一个索引 表连接 select T_Oders as o join T_Customers as C on