SpringBoot+MySQL+Jpa實現(xiàn)對數(shù)據(jù)庫的增刪改查和分頁詳解
一、 使用Springboot+Jpa實現(xiàn)對mysql數(shù)據(jù)庫的增刪改查和分頁功能
JPA是Java Persistence API的簡稱,中文名Java持久層API,是JDK 5.0注解或XML描述對象-關(guān)系表的映射關(guān)系,并將運(yùn)行期的實體對象持久化到數(shù)據(jù)庫中。
使用Springboot和jpa對數(shù)據(jù)庫進(jìn)行操作時,能夠大大減少我們的工作量,在jpa中,已經(jīng)在底層封裝好了增刪查的功能和sql語句,可以使我們進(jìn)行快速開發(fā)
二、項目過程和配置文件
1、applaction.properties文件配置
#數(shù)據(jù)源配置 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver #注意 test是你要連接的數(shù)據(jù)庫的名字 見下圖 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 #幫我們自動生成表結(jié)構(gòu) 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數(shù)據(jù)庫連接池-->
<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 實現(xiàn)分頁功能的插件-->
<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、項目結(jié)構(gòu)

4、實體類Student
package com.example.kudesoft.entity;
import javax.persistence.*;
/**
* Student實體類
* @Entity 表示該類是一個實體類
* @Table(name = "student") 表示該類對應(yīng)數(shù)據(jù)庫中的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> {
//根據(jù)id查
Student findStudentById(Integer id);
//根據(jù)名字查詢
@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中封裝有查詢功能、添加功能、刪除功能,但是沒有修改功能以及一些特定的查詢功能,所以在編程過程中,我們需要根據(jù)需求來增加一些功能函數(shù)。如果要是根據(jù)id來進(jìn)行查詢或其他操作時,數(shù)據(jù)庫中的主鍵id 一定要設(shè)為id,不要設(shè)置為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();
//根據(jù)id查詢單個
Student findStudentById(Integer id);
//根據(jù)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,不是其他的包,如果包導(dǎo)錯了,就會出現(xiàn)錯誤。
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 實現(xiàn)
*/
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
private StudentDAO studentDAO;
/**
* 查詢所有
* @return
*/
@Override
public List<Student> findAll() {
return studentDAO.findAll();
}
/**
* 根據(jù)id查詢
* @param id
* @return
*/
@Override
public Student findStudentById(Integer id) {
return studentDAO.findStudentById(id);
}
/**
* 根據(jù)名字查詢
* @param sname
* @return
*/
@Override
public List<Student> findStudentByName(String sname) {
return studentDAO.findStudentBySname(sname);
}
/**
*
* 查詢name和password進(jìn)行登錄
* @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);
}
/**
* 根據(jù)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);
}
}
在進(jìn)行分頁操作的時候,由于Jpa中封裝有很多的findAll()函數(shù),所以一定要看清楚要用哪一個findAll()函數(shù),如上代碼片:查詢所有的studentDAO.findAll()和分頁的studentDAO.findAll()函數(shù)一樣,但是內(nèi)部參數(shù)不一樣,所以就會產(chǎn)生不一樣的結(jié)果。
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 將數(shù)據(jù)以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();
}
/**
* 根據(jù)id查詢
* @param id
* @return
*/
@GetMapping("/findById")
public Student fingById(Integer id){
return studentService.findStudentById(id);
}
/**
* 根據(jù)名字查詢
* @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規(guī)范
*/
@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層中,我們對于各個功能的實現(xiàn)一定要明白使用Get方式還是Post方式進(jìn)行操作,否則就會出現(xiàn)服務(wù)器內(nèi)部錯誤等等。
三、注意
在項目的各個功能實現(xiàn)過程中,由于其中含有很多的同名方法和jar包,所以我們在編程過程中一定要注意用對jar包,不要因為導(dǎo)錯jar包而給我們增加工作量
本文介紹了SpringBoot+MySQL+Jpa實現(xiàn)對數(shù)據(jù)庫的增刪改查和分頁如果想了解更多相關(guān)內(nèi)容請查看下面的相關(guān)鏈接
相關(guān)文章
Java實現(xiàn)入?yún)?shù)據(jù)批量數(shù)據(jù)校驗詳解
在業(yè)務(wù)處理中一般入?yún)⑹菃螚l數(shù)據(jù),這樣數(shù)據(jù)校驗比較容易,但是這種方法對于集合數(shù)據(jù)的校驗不適用,下面我們就來看看如何對入?yún)?shù)據(jù)進(jìn)行批量數(shù)據(jù)校驗吧2024-02-02
Java中的CyclicBarrier循環(huán)柵欄詳解
這篇文章主要介紹了Java中的CyclicBarrier循環(huán)柵欄詳解,CyclicBarrier循環(huán)柵欄是用來進(jìn)行線程協(xié)作,等待線程滿足某個計數(shù),構(gòu)造時設(shè)置計數(shù)個數(shù),每個線程執(zhí)行到某個需要“同步”的時刻調(diào)用 await()方法進(jìn)行等待,當(dāng)?shù)却木€程數(shù)滿足計數(shù)個數(shù)時,繼續(xù)執(zhí)行,需要的朋友可以參考下2023-12-12
Java常見基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)
這篇文章主要介紹了Java常見數(shù)據(jù)結(jié)構(gòu)面試題,帶有答案及解釋,希望對廣大的程序愛好者有所幫助,同時祝大家有一個好成績,需要的朋友可以參考下,希望可以幫助到你2021-07-07
解決遇到Cannot resolve ch.qos.logback:logback-classic:
當(dāng)使用Maven配置項目依賴時,可能會遇到無法解析特定版本的錯誤,例如,logback-classic版本1.2.3可能無法在配置的倉庫中找到,解決方法包括檢查倉庫是否包含所需版本,或更新到其他可用版本,可通過Maven官網(wǎng)搜索并找到適用的版本,替換依賴配置中的版本信息2024-09-09

