日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

[JAVA EE] JPA 技术实践:完成增、删、改、查操作

發布時間:2023/11/27 生活经验 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [JAVA EE] JPA 技术实践:完成增、删、改、查操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

項目已上傳:https://codechina.csdn.net/qq_36286039/javaee
注意本項目是包含后文JPA 查詢用法內容的,若您想看只有本文內容的項目,請下載:
https://download.csdn.net/download/qq_36286039/21941623?spm=1001.2014.3001.5501

先看下效果:

id是自動生成的,跳數了是因為之前刪過數據




刪除后

一些術語、概念

entity-dao-service-web層

準備工作

  • 新建 Spring Boot 項目:jpademo2
  • MySQL數據庫:還是testdb user表
  • 添加相關依賴:
  • pom.xml
<!-- Spring Data JPA 依賴 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- MySQL 驅動 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- jquery--><dependency><groupId>org.webjars</groupId><artifactId>jquery</artifactId><version>3.3.1</version></dependency><!-- bootstrap--><dependency><groupId>org.webjars</groupId><artifactId>bootstrap</artifactId><version>3.3.7</version></dependency><!-- bootstrap-datetimepicker --><dependency><groupId>org.webjars</groupId><artifactId>Eonasdan-bootstrap-datetimepicker</artifactId><version>4.17.47</version></dependency><!-- webjars-locator版本控制 --><dependency><groupId>org.webjars</groupId><artifactId>webjars-locator</artifactId><version>0.31</version></dependency><!-- lombok --><!--Lombok插件(神器),能通過注解的方式,在編譯時自動為屬性生成構造器、getter/setter、equals、hashcode、toString…等方法。這樣就省去了手動重建這些代碼的麻煩,使代碼看起來更簡潔些。--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.16</version></dependency>

不僅要添加 Lombok 依賴,idea 還要安裝 Lombok 插件

安裝 Lombok 插件方法:


Lombok 插件需要開啟 Enable Annotation Processing

  • application.properties
#自動生成數據庫表(關鍵)
spring.jpa.hibernate.ddl-auto=update
#mysql數據庫連接配置(非常重要)
spring.datasource.url = jdbc:mysql://localhost:3306/testdb?serverTimezone=Asia/Shanghai
spring.datasource.username = root
spring.datasource.password = root
#mysql數據庫驅動程序(重要)
spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
#jpa配置:在控制臺顯示Hibernate的sql(可選)
spring.jpa.show-sql = true
#其他配置:關閉Thymeleaf 的緩存
spring.thymeleaf.cache = false

項目實踐

  1. 創建實體類
  • 在新建 entity 包中新建 User 類:映射數據庫表


user.java

package com.example.jpademo2.entity;import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;@Entity //聲明類為實體類,不能掉!
@Data//lombok注解
public class User implements Serializable {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(nullable = false,unique = true,length = 20)private String username;@Column(nullable = false,length = 20)private String password;@Column(nullable = false)@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date regdate;@Column(nullable = false)private int status;//getter/setter真的不需要了,因為你安裝了Lombok~~~
}
  1. 創建數據接口訪問層(Repository倉庫)
  • 在新建 repository 包中新建 UserRepository 接口。
  • Repository 接口要繼承 JpaRepository<User, Long> 接口。
package com.example.jpademo2.repository;import com.example.jpademo2.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;public interface UserRepository extends JpaRepository<User,Long> {// JpaRepository 自動實現了很多內置的CURD方法// 可直接調用而不用自己寫代碼,例如:// List<T> findAll();// Optional<T> findById(id);// User save(user);// void delete(user);// void deleteById(id);// long count();// boolean existsById(id);
}
  1. 創建服務層接口
  • 在新建 service 包中新建 UserService 接口。
  • UserService 接口中聲明業務相關方法(根據業務需要)。
package com.example.jpademo2.service;import com.example.jpademo2.entity.User;import java.util.List;//服務層接口
public interface UserService {//根據也無需要定義業務功能接口方法public List<User> getUserList();public User findUserById(Long id);public void save(User user);public void edit(User user);public void delete(Long id);
}
  1. 實現服務層接口
  • 在 service 包中新建 UserServiceImp 類(實現UserService接口)。
  • 服務實現類調用 UserRepository 實現具體業務。

    這段代碼里注意不要掉了@Service
package com.example.jpademo2.service;import com.example.jpademo2.entity.User;
import com.example.jpademo2.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;//實現服務層接口
@Service
public class UserServiceImp implements UserService{@Autowiredprivate UserRepository userRepository;@Overridepublic List<User> getUserList(){return userRepository.findAll();//直接調用Repository內置的CURD方法}@Overridepublic User findUserById(Long id){return userRepository.findById(id).get();//直接調用Repository內置的CURD方法//findById(id)返回的是Optional類(一個可以為null的容器對象)//如果Optional容器中存在對象,則調用get()方法返回該對象}@Overridepublic void edit(User user){userRepository.save(user);//直接調用Repository內置的CURD方法}@Overridepublic void save(User user){userRepository.save(user);//直接調用Repository內置的CURD方法}@Overridepublic void delete(Long id){userRepository.deleteById(id);//直接調用Repository內置的CURD方法}
}
  1. 調用服務層完成業務控制
  • 在新建 controller 包中新建 UserController 控制器。
  • 上面的@Service要是掉了,這里會報錯的
package com.example.jpademo2.controller;import com.example.jpademo2.entity.User;import com.example.jpademo2.service.UserService;
import com.example.jpademo2.service.UserServiceImp;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;import javax.annotation.Resource;
import java.util.Date;
import java.util.List;@Controller
public class UserController {@Autowired // 自動注入( 無需自己new對象:UserService userService=new UserServiceImp(); )private UserService userService;@RequestMapping("/")public String index() {return "redirect:/list"; //請求轉發到 /list}@RequestMapping("/list")public String list(Model model) {List<User> users = userService.getUserList();model.addAttribute("users", users);return "user/list";}@RequestMapping("/add")public String add() {return "user/add"; //打開創建user界面}@PostMapping("/add")public String add(User user) { //保存新創建的useruser.setRegdate(new Date());user.setStatus(0);userService.save(user);return "redirect:/list";}@RequestMapping("/edit/{id}")public String edit(Model model, @PathVariable Long id) {User user=userService.findUserById(id);model.addAttribute("user", user);return "user/edit"; //打開編輯user界面}@PostMapping("/edit")public String edit(User user) { //保存編輯好的useruserService.edit(user);return "redirect:/list";}@RequestMapping("/delete/{id}")public String delete(Model model,@PathVariable Long id) {User user=userService.findUserById(id);model.addAttribute("user", user);return "user/delete"; //刪除之前道個別(看看數據)}@PostMapping("/delete/{id}")public String delete(@PathVariable Long id) { //確認刪除userService.delete(id);return "redirect:/list";}}
  1. 視圖層:
  • 在 templates 中新建 user 文件夾,添加相關頁面文件。
    list.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>用戶列表</title><script th:src="@{/webjars/jquery/jquery.min.js}"></script><script th:src="@{/webjars/bootstrap/js/bootstrap.min.js}"></script><link th:href="@{/webjars/bootstrap/css/bootstrap.min.css}" rel="stylesheet">
</head>
<body>
<div class="container"><h2>用戶列表</h2><div class="with:80%"><div style="margin: 20px;"><a href="/add" th:href="@{/add}" class="btn btn-info">添加用戶</a></div><table class="table table-hover"><tr><th>用戶id</th><th>用戶名</th><th>密碼</th><th>創建時間</th><th>用戶狀態</th><th>操作</th><th>操作</th></tr><tr th:each="user : ${users}"><th scope="row" th:text="${user.id}">1</th><td th:text="${user.username}">neo</td><td th:text="${user.password}">123456</td><td th:text="${#dates.format(user.regdate,'yyyy/MM/dd HH:mm:ss')}">2020/11/11</td><td th:text="${user.status}">0</td><td><a th:href="@{/edit/{id}(id=${user.id})}">編輯</a></td><td><a th:href="@{/delete/{id}(id=${user.id})}">刪除</a></td></tr></table></div>
</div>
</body>
</html>

add.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>add</title><script th:src="@{/webjars/jquery/jquery.min.js}"></script><script th:src="@{/webjars/bootstrap/js/bootstrap.min.js}"></script><link th:href="@{/webjars/bootstrap/css/bootstrap.min.css}" rel="stylesheet">
</head>
<body>
<div class="container"><h3 class="col-sm-offset-1">添加用戶</h3><div><form class="form-horizontal" th:action="@{/add}" method="post"><div class="form-group"><label for="username" class="col-sm-2 control-label">用戶名</label><div class="col-sm-6"><input type="text" class="form-control" name="username" id="username" placeholder="用戶名"/></div></div><div class="form-group"><label for="password" class="col-sm-2 control-label">密碼</label><div class="col-sm-6"><input type="password" class="form-control" name="password" id="password" placeholder="密碼"/></div></div><div class="form-group"><div class="col-sm-offset-2 col-sm-6"><input type="submit" value="保存" class="btn btn-info"/><input type="reset" value="重填" class="btn btn-info col-sm-offset-1"/><a th:href="@{/list}" class="btn btn-info col-sm-offset-1">返回</a></div></div></form></div>
</div>
</body>
</html>

delete.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script th:src="@{/webjars/jquery/jquery.min.js}"></script><script th:src="@{/webjars/bootstrap/js/bootstrap.min.js}"></script><link th:href="@{/webjars/bootstrap/css/bootstrap.min.css}" rel="stylesheet"></head>
<body>
<div class="container"><h3 class="col-sm-offset-1">確認刪除用戶</h3><div><form class="form-horizontal" th:action="@{/delete/{id}(id=${user.id})}" th:object="${user}" method="post"><input type="hidden" name="id" th:value="*{id}"/> <!--id值隱藏不修改--><div class="form-group"><label class="col-sm-2 control-label">編號</label><div class="col-sm-6"><label class="control-label" th:text="*{id}">id</label></div></div><div class="form-group"><label class="col-sm-2 control-label">用戶名</label><div class="col-sm-6"><label class="control-label" th:text="*{username}">username</label></div></div><div class="form-group"><label class="col-sm-2 control-label">密碼</label><div class="col-sm-6"><label class="control-label" th:text="*{password}">password</label></div></div><div class="form-group"><label class="col-sm-2 control-label">注冊日期</label><div class="col-sm-6"><label class="control-label" th:text="*{#dates.format(regdate,'yyyy-MM-dd HH:mm:ss')}">regdate</label></div></div><div class="form-group"><label class="col-sm-2 control-label">狀態</label><div class="col-sm-6"><label class="control-label" th:text="*{status}">status</label></div></div><div class="form-group"><div class="col-sm-offset-2 col-sm-6"><input type="submit" value="確認刪除" class="btn btn-info"/><a href="/list" th:href="@{/list}" class="btn btn-info col-sm-offset-1">返回</a></div></div></form></div>
</div></body>
</html>

edit.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"/><title>user</title><script th:src="@{/webjars/jquery/jquery.min.js}"></script><script th:src="@{/webjars/bootstrap/js/bootstrap.min.js}"></script><link th:href="@{/webjars/bootstrap/css/bootstrap.min.css}" rel="stylesheet"><script th:src="@{/webjars/momentjs/min/moment-with-locales.js}"></script><link th:href="@{/webjars/Eonasdan-bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css}" rel="stylesheet"><script th:src="@{/webjars/Eonasdan-bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js}"></script>
</head>
<body class="container">
<br/>
<h1>修改用戶</h1>
<br/><br/>
<div class="with:80%"><form class="form-horizontal" th:action="@{/edit}" th:object="${user}" method="post"><input type="hidden" name="id" th:value="*{id}"/> <!--id值隱藏不修改,編輯時必須帶上id值--><div class="form-group"><label for="username" class="col-sm-2 control-label">用戶名</label><div class="col-sm-6"><input type="text" class="form-control" name="username" id="username" th:value="*{username}"placeholder="用戶名"/></div></div><div class="form-group"><label for="password" class="col-sm-2 control-label">密碼</label><div class="col-sm-6"><input type="text" class="form-control" name="password" id="password" th:value="*{password}"placeholder="密碼"/></div></div><!--日歷時間框--><div class="form-group"><label for="regdate" class="col-sm-2 control-label">注冊日期</label><div class="col-sm-6"><div class="input-group" id='datetimepicker'><input type='text' class="form-control" id="regdate" name="regdate"/><span class="input-group-addon"><span class="glyphicon glyphicon-calendar"></span></span></div></div></div><div class="form-group"><label for="status" class="col-sm-2 control-label">用戶狀態</label><div class="col-sm-6"><input type="text" class="form-control" name="status" id="status" th:value="*{status}"placeholder="用戶狀態"/></div></div><div class="form-group"><div class="col-sm-offset-2 col-sm-6"><input type="submit" value="保存" class="btn btn-info"/><a href="/list" th:href="@{/list}" class="btn btn-info col-sm-offset-1">返回</a></div></div></form>
</div>
<script th:inline="javascript">$(function () {$('#datetimepicker').datetimepicker({format: 'YYYY-MM-DD HH:mm:ss', //HH是24小時制,hh是12小時制locale: moment.locale('zh-cn'), //中文日歷defaultDate: /*[[${user.regdate}]]*/"1990-1-1"});});
</script>
</body>
</html>

至此,你已經可以運行了,訪問localhost:8080/list試試吧!

總結

以上是生活随笔為你收集整理的[JAVA EE] JPA 技术实践:完成增、删、改、查操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。