SpringBoot+MySQL+Jpa實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的增刪改查和分頁詳解
一、 使用Springboot+Jpa實(shí)現(xiàn)對(duì)mysql數(shù)據(jù)庫的增刪改查和分頁功能
JPA是Java Persistence API的簡稱,中文名Java持久層API,是JDK 5.0注解或XML描述對(duì)象-關(guān)系表的映射關(guān)系,并將運(yùn)行期的實(shí)體對(duì)象持久化到數(shù)據(jù)庫中。
使用Springboot和jpa對(duì)數(shù)據(jù)庫進(jìn)行操作時(shí),能夠大大減少我們的工作量,在jpa中,已經(jīng)在底層封裝好了增刪查的功能和sql語句,可以使我們進(jìn)行快速開發(fā)
二、項(xiàng)目過程和配置文件
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 #幫我們自動(dòng)生成表結(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 實(shí)現(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、項(xiàng)目結(jié)構(gòu)
4、實(shí)體類Student
package com.example.kudesoft.entity; import javax.persistence.*; /** * Student實(shí)體類 * @Entity 表示該類是一個(gè)實(shí)體類 * @Table(name = "student") 表示該類對(duì)應(yīng)數(shù)據(jù)庫中的student表 * @Id 表明該屬性是一個(gè)主鍵 * @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í),數(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查詢單個(gè) Student findStudentById(Integer id); //根據(jù)name查詢 List<Student> findStudentByName(String sname); //登錄 Student findStudentByNameAndPassword(String sname,String spassword); //添加一個(gè) Student save(Student student); //刪除一個(gè) void deleteStudentById(Integer id); //修改 Student update(Student student); //分頁 Page<Student> findAll(int page, int pageSize); }
在編寫分頁功能時(shí),一定要注意Page所在的包是import org.springframework.data.domain.Page,不是其他的包,如果包導(dǎo)錯(cuò)了,就會(huì)出現(xiàn)錯(cuò)誤。
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 實(shí)現(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)行分頁操作的時(shí)候,由于Jpa中封裝有很多的findAll()函數(shù),所以一定要看清楚要用哪一個(gè)findAll()函數(shù),如上代碼片:查詢所有的studentDAO.findAll()和分頁的studentDAO.findAll()函數(shù)一樣,但是內(nèi)部參數(shù)不一樣,所以就會(huì)產(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兩個(gè)注解 * @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層中,我們對(duì)于各個(gè)功能的實(shí)現(xiàn)一定要明白使用Get方式還是Post方式進(jìn)行操作,否則就會(huì)出現(xiàn)服務(wù)器內(nèi)部錯(cuò)誤等等。
三、注意
在項(xiàng)目的各個(gè)功能實(shí)現(xiàn)過程中,由于其中含有很多的同名方法和jar包,所以我們在編程過程中一定要注意用對(duì)jar包,不要因?yàn)閷?dǎo)錯(cuò)jar包而給我們增加工作量
本文介紹了SpringBoot+MySQL+Jpa實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的增刪改查和分頁如果想了解更多相關(guān)內(nèi)容請查看下面的相關(guān)鏈接
相關(guān)文章
使用Spring的AbstractRoutingDataSource實(shí)現(xiàn)多數(shù)據(jù)源切換示例
這篇文章主要介紹了使用Spring的AbstractRoutingDataSource實(shí)現(xiàn)多數(shù)據(jù)源切換示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02最新IntelliJ IDEA 2021版配置 Tomcat 8.5 的詳細(xì)步驟
idea開發(fā)工具一直是java環(huán)境最好用,很受廣大開發(fā)者喜愛,今天通過本文給大家分享最新IntelliJ IDEA 2021版配置 Tomcat 8.5 的詳細(xì)步驟,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-06-06SpringBoot學(xué)習(xí)系列之MyBatis Plus整合封裝的實(shí)例詳解
MyBatis-Plus是一款MyBatis的增強(qiáng)工具(簡稱MP),為簡化開發(fā)、提高效率,這篇文章給大家介紹MyBatis Plus整合封裝的實(shí)例詳解,感興趣的朋友跟隨小編一起看看吧2020-08-08解析XML文件時(shí)的嵌套異常SAXParseException問題
這篇文章主要介紹了解析XML文件時(shí)的嵌套異常SAXParseException問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04