首頁 > 軟體

Spring Boot深入學習資料存取之Spring Data JPA與Hibernate的應用

2022-10-28 14:00:38

前言

Hibernate是一個開源的物件關係對映框架,它對JDBC及進行了非常輕量級的物件封裝,它將POJO簡單的java物件與資料庫表建立對映關係,是一個全自動的ORM框架,Hibernate可以自動生成SQL語句自動執行。

JPA是官方提出的Java持久化規範,JPA通過註解或XML描述物件一關係表的對映關係,並將記憶體中的實體物件持久化到資料庫

Spring Data JPA通過提供基於JPA的Repository極大的簡化了JPA的寫法,在幾乎不寫實現的情況下,實現資料庫的存取和操作,使用Spring Data JPA建立資料存取層十分方便,只需要定義一個整合JapRepository的介面即可

Hibernate的詳細解析

Spring Boot的支援

可以在STS建立Spring Boot應用時就選擇Spring Data JPA模組依賴

如果在Maven專案中需要使用它,則可以在pom.xml檔案中通過如下設定新增Spring Data JPA模組依賴

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

下面通過一個簡單的條件查詢範例來實戰

1:建立資料庫 此處不再贅述 有問題可以私信

2:修改pom.xml檔案 新增mysql依賴

<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
-<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/>
<!-- lookup parent from repository -->
</parent>
<groupId>com.ch</groupId>
<artifactId>ch6_1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>ch6_1</name>
<description>Demo project for Spring Boot</description>
-<properties>
<java.version>11</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>
<!-- 新增MySQL依賴 -->
-<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.45</version>
<!-- MySQL8.x時,請使用8.x的聯結器 -->
</dependency>
-<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
-<build>
-<plugins>
-<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

3:在application.properties檔案中設定如下內容

server.servlet.context-path=/ch6_1
###
##資料來源資訊設定
###
#資料庫地址
spring.datasource.url=jdbc:mysql://localhost:3306/springbootjpa?characterEncoding=utf8
#資料庫MySQL為8.x時,url為jdbc:mysql://localhost:3306/springbootjpa?useSSL=false&serverTimezone=Asia/Beijing&characterEncoding=utf-8
#資料庫使用者名稱
spring.datasource.username=root
#資料庫密碼
spring.datasource.password=root
#資料庫驅動
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#資料庫MySQL為8.x時,驅動類為com.mysql.cj.jdbc.Driver
####
#JPA持久化設定
####
#指定資料庫型別
spring.jpa.database=MYSQL
#指定是否在紀錄檔中顯示SQL語句
spring.jpa.show-sql=true
#指定自動建立、更新資料庫表等設定,update表示如果資料庫中存在持久化類對應的表就不建立,不存在就建立對應的表
spring.jpa.hibernate.ddl-auto=update
#讓控制器輸出的JSON字串格式更美觀
spring.jackson.serialization.indent-output=true 

4:建立持久化實體類MyUser

建立名為com.ch.ch6_1entity的包 並在該包中建立名為MyUser的持久化實體類 部分程式碼如下

package com.ch.ch6_1.entity;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "user_table")
/**
 * 如果沒寫表名,預設為類名的片語
 * (如MyUser類對應的表名為my_user)
 */
public class MyUser implements Serializable{
	private static final long serialVersionUID = 1L;
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private int id;//主鍵
	/**使用@Column註解,可以設定列相關屬性(列名,長度等),
	 * 可以省略,預設為屬性名小寫
	 */
	private String uname;
	private String usex;
	private int age;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getUname() {
		return uname;
	}
	public void setUname(String uname) {
		this.uname = uname;
	}
	public String getUsex() {
		return usex;
	}
	public void setUsex(String usex) {
		this.usex = usex;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

@Entity註解表明該實體類時一個與資料庫表對映的實體類

@Table表示實體類與哪個資料庫表對映

5:建立資料存取層

建立名為com.ch.ch6_1.repository並在該包中建立名為UserRepository的介面 程式碼如下

package com.ch.ch6_1.repository;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import com.ch.ch6_1.entity.MyUser;
/**
 * 這裡不需要使用@Repository註解資料存取層,
 * 因為Spring Boot自動設定了JpaRepository
 */
public interface UserRepository extends JpaRepository<MyUser, Integer>{
	public MyUser findByUname(String uname);
	public List<MyUser> findByUnameLike(String uname);
}

6:建立業務層

建立名為com.ch.ch6_1.service的包 並在該包中建立UserService介面和介面的實現類UserServiceImpl

介面程式碼如下

package com.ch.ch6_1.service;
import java.util.List;
import com.ch.ch6_1.entity.MyUser;
public interface UserService {
	public void saveAll();
	public List<MyUser> findAll();
	public MyUser findByUname(String uname);
	public List<MyUser> findByUnameLike(String uname);
	public MyUser getOne(int id);
}

實現類部分程式碼如下

package com.ch.ch6_1.service;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.ch.ch6_1.entity.MyUser;
import com.ch.ch6_1.repository.UserRepository;
@Service
@Transactional
public class UserServiceImpl implements UserService{
	@Autowired
	private UserRepository userRepository;//依賴注入資料存取層
	@Override
	public void saveAll() {
		MyUser mu1 = new MyUser();
		mu1.setUname("陳恆1");
		mu1.setUsex("男");
		mu1.setAge(88);
		MyUser mu2 = new MyUser();
		mu2.setUname("陳恆2");
		mu2.setUsex("女");
		eLike(String uname) {
		return userRepository.findByUnameLike("%" + uname + "%");
	}
	@Override
	public MyUser getOne(int id) {
		//呼叫父介面中的方法getOne
		return userRepository.getOne(id);
	}
}

7:建立控制器類UserTestController

建立名為com.ch.ch6_1.controller的包 並在該包中建立名為UserTestController的類 部分程式碼如下

package com.ch.ch6_1.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.ch.ch6_1.service.UserService;
@Controller
public class UserTestController {
	@Autowired
	private UserService userService;
	@RequestMapping("/save")
	@ResponseBody
	public String save() {
		userService.saveAll();
		return "儲存使用者成功!";
	}
	}
	@RequestMapping("/findAll")
	public String findAll(Model model){
		model.addAttribute("title", "查詢所有使用者");
		model.addAttribute("allUsers",userService.findAll());
		return "showAll";
	}
	@RequestMapping("/findByUnameLike")
	public String findByUnameLike(String uname, Model model){
		model.addAttribute("title", "根據使用者名稱模糊查詢所有使用者");
		model.addAttribute("allUsers",userService.findByUnameLike(uname));
		return "showAll";
	}
}

8:整理指令碼樣式靜態檔案

JS指令碼 CSS樣式 圖片等靜態檔案預設放在src/main/resourcex/static目錄下 有需求可以評論區留言找我要

9:建立View檢視頁面

建立檢視頁面showAll.html和showAuser.html 部分程式碼如下

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>顯示查詢結果</title>
<link rel="stylesheet" th:href="@{css/bootstrap.min.css}" rel="external nofollow"  />
<link rel="stylesheet" th:href="@{css/bootstrap-theme.min.css}" rel="external nofollow"  />
</head>
<body>
	<div class="panel panel-primary">
		<div class="panel-heading">
			<h3 class="panel-title">Spring Data JPA簡單查詢</h3>
		</div>
	</div>
	<div class="container">
		<div class="panel panel-primary">
			<div class="panel-heading">
				<h3 class="panel-title"><span th:text="${title}"></span></h3>
			</div>
			<div class="panel-body">
				<div class="table table-responsive">
					<tab
							</tr>
						</tbody>
					</table>
				</div>
			</div>
		</div>
	</div>
</body>
</html>

到此這篇關於Spring Boot深入學習資料存取之Spring Data JPA與Hibernate的應用的文章就介紹到這了,更多相關Spring Boot資料存取內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com