Bạn có tò mò cách ứng dụng Crud tạo project bằng một bảng MYSQL spring boot và JSP? Hãy để bài viết đây hướng dẫn các lập trình viên một vài mẹo vô cùng bổ ích nhé!
Trước khi thực hiện bất kỳ thao tác nào trên dữ liệu, chúng ta cần tạo bảng cần thiết. Ví dụ, ta sẽ tạo một bảng có tênsinh_vienvien và chèn dữ liệu.
Để kiểm tra ứng dụng ngay lập tức, bạn cần có một số dữ liệu trong bảng. Bạn cũng có thể chạy một số thử nghiệm bằng cách tạo thông tin sinh viên mới từ giao diện người dùng nếu ban đầu bảng của bạn không có bất kỳ dữ liệu nào.
Cấu trúc dự án
Cây thư mục dự án như sau:
Thiết lập dự án
Bạn có thể tạo một dự án dựa trên maven trong IDE hoặc công cụ yêu thích của mỗi người.
Trong đó bao gồm các phụ thuộc bắt buộc trong tập lệnh pom.xml để làm việc trên ứng dụng này bằng Spring Boot JPA.
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!– //mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-jasper –> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency> <!– //mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator –> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> </dependency> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>jakarta.servlet.jsp.jstl</artifactId> <version>3.0.1</version> </dependency> <!– //mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa –> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!– //mvnrepository.com/artifact/mysql/mysql-connector-java –> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!– //mvnrepository.com/artifact/org.projectlombok/lombok-maven-plugin –> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.24</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>jakarta.servlet.jsp.jstl</artifactId> <version>2.0.0</version> </dependency> <!– taglibs-standard-spec-*.jar –> <!– //mvnrepository.com/artifact/org.apache.taglibs/taglibs-standard-spec –> <dependency> <groupId>org.apache.taglibs</groupId> <artifactId>taglibs-standard-spec</artifactId> <version>1.2.5</version> </dependency> <!– taglibs-standard-impl-*.jar –> <!– //mvnrepository.com/artifact/org.apache.taglibs/taglibs-standard-impl –> <dependency> <groupId>org.apache.taglibs</groupId> <artifactId>taglibs-standard-impl</artifactId> <version>1.2.5</version> </dependency> <!– //mvnrepository.com/artifact/jstl/jstl –> <dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>jstl-api</artifactId> <version>1.2</version> </dependency> } |
Config trong file application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/**tên dự database** spring.datasource.username= ** username ** spring.datasource.password= ** password** spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver spring.datasource.sql-script-encoding=UTF-8 spring.jpa.properties.hibernate.globally_quoted_identifiers=true spring.jpa.hibernate.ddl-auto=none spring.jpa.show-sql=true spring.mvc.view.prefix: /WEB-INF/view/ spring.mvc.view.suffix: .jsp |
Lớp thực thể (Entity Class)
Giả sử chúng ta có lớp thực thể sau được gọi SinhVien.
package com.example.demo.model; import lombok.Data; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Data @Entity @Table(name = “sinh_vien”) public class SinhVien { @Id @Column(name = “ma_sinh_vien”) @GeneratedValue(strategy = GenerationType.IDENTITY) private long maSinhVien; @Column(name = “ten_sinh_vien”, nullable = true) private String tenSinhVien; } |
Các annotation mình sử dụng trong đoạn code trên là các annotation của JPA:
@Entity xác định lớp hiện tại là một entity.
@Table xác định tên bảng ánh xạ sang.
@Id xác định thuộc tính hiện tại là ID trong bảng CSDL.
@GeneratedValue xác định kiểu sinh khóa chính, ở đây là AUTO_INCREMENT.
@Column xác định thuộc tính hiện tại là một cột trong CSDL.
Spring Data JPA Repository
Spring Data JPA API cung cấp hỗ trợ kho lưu trữ cho Java Persistence API (JPA) và nó giúp giảm bớt sự phát triển của các ứng dụng cần truy cập các nguồn dữ liệu JPA. Ở đây ta sẽ tạo giao diện kho lưu trữ mà không cần tạo bất kỳ phương thức nào trong giao diện này vì Spring cung cấp các phương thức để thực hiện các thao tác CRUD cơ bản.
package com.example.demo.repository; import com.example.demo.model.SinhVien; import org.springframework.data.jpa.repository.JpaRepository; public interface SinhVienRepo extends JpaRepository<SinhVien, Long> { } |
Service
Lớp Service nằm giữa bộ controller và lớp DAO và chứa các phương thức trừu tượng. Nhìn chung, bạn nên thực hiện gọi các hàm trong lớp dịch vụ này.
package com.example.demo.service; import com.example.demo.model.SinhVien; import com.example.demo.request.SinhVienRequest; import java.util.List; public interface SinhVienService { List<SinhVien> getList(); SinhVien insert(SinhVien sinhVien); boolean delete(long id); SinhVien update( SinhVien sinhVien); SinhVien findById(long id); } |
Implements
Lớp SinhVienServiceImpl ghi đè các phương thức của SinhVienService và thực hiện logic nghiệp vụ trong lớp dịch vụ này Bạn nhận được kết quả của các truy vấn nối từ kho lưu trữ và chuyển cho lớp điều khiển REST. Đến đây, chúng ta sử dụng cùng một phương pháp để lưu hoặc cập nhật thông tin công ty mới hoặc hiện có tương ứng.
package com.example.demo.service.impl; import com.example.demo.model.SinhVien; import com.example.demo.repository.SinhVienRepo; import com.example.demo.request.SinhVienRequest; import com.example.demo.service.SinhVienService; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Optional; @Service public class SinhVienServiceImpl implements SinhVienService { @Autowired private SinhVienRepository sinhVienRepository; @Override public List<SinhVien> getList() { return sinhVienRepository.findAll(); } @Override public SinhVien insert(SinhVien sinhVien) { return sinhVienRepository.save(sinhVien); } @Override public boolean delete(long id) { Optional<SinhVien> sinhVien = sinhVienRepository.findById(id); if (sinhVien.isPresent()) { sinhVienRepository.deleteById(id); return true; } return false; } @Override public SinhVien update( SinhVien sinhVien) { SinhVien editSinhVien = sinhVienRepository.findById(sinhVien.getMaSinhVien()).orElse(null); sinhVien.setTenSinhVien(sinhVien.getTenSinhVien()); return sinhVienRepository.save(sinhVien); } @Override public SinhVien findById(long id) { return sinhVienRepository.findById(id).orElse(null); } } |
Hiển thị dữ liệu sinh viên
Controller @Controller public class SinhVienController { @Autowired private SinhVienService sinhVienService; @GetMapping(“/view”) public String home(Model model){ List<SinhVien> sinhViens = sinhVienService.getList(); System.out.println(sinhViens); model.addAttribute(“data”,sinhViens); return “index”; // return file } } index.jsp <%@ page language=”java” contentType=”text/html; charset=UTF-8″ pageEncoding=”UTF-8″%> <%@ taglib prefix=”c” uri=”//java.sun.com/jsp/jstl/core” %> <html> <head> <meta http-equiv=”Content-Type” content=”text/html; charset=ISO-8859-1″> <title>Insert title here</title> </head> <body > <div class=”container mt-3″> <h1>Add Sinh vien Form</h1> <a href=”addSinhVien” class=”btn btn-primary”> Add Sinh Vien </a> <div class=”row”> <p>${data} hello</p> <table class=”table table-hover”> <thead> <tr> <th scope=”col”>ID</th> <th scope=”col”>Name</th> </tr> </thead> <tbody> <c:forEach var=”sinhVien” items=”${data}”> <tr> <td class=”table-plus”>${sinhVien.maSinhVien} </td> <td>${sinhVien.tenSinhVien}</td> <td><a href=”editSinhVien/${sinhVien.maSinhVien}” class=”btn btn-warning”> Edit </a></td> <td><a href=”deleteSinhVien/${sinhVien.maSinhVien}” class=”btn btn-danger”> Delete </a></td> </tr> </c:forEach> </tbody> </table> </div> </div> </body> </html> Thêm mới một sinh viên Controller @GetMapping(“/addSinhVien”) public String viewAddSinhVien() { return “addSinhVien”; } @PostMapping(“/insertSinhVien”) public String insertSinhVien(@ModelAttribute(“insertSinhVien”) SinhVien sinhVien){ sinhVienService.insert(sinhVien); return “redirect:/view”; } addSinhVien.jsp <%@ page language=”java” contentType=”text/html; charset=UTF-8″ pageEncoding=”UTF-8″%> <%@ taglib prefix=”c” uri=”//java.sun.com/jsp/jstl/core” %> <html> <head> <meta http-equiv=”Content-Type” content=”text/html; charset=ISO-8859-1″> <%– <link href=”//cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css” rel=”stylesheet” integrity=”sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD” crossorigin=”anonymous”>–%> <title>Insert title here</title> </head> <body > <div class=”container mt-3″> <h1>Add Employee Form</h1> <form action=”insertSinhVien” method=”post”> <div class=”row”> <div class=”col”> <div class=”form-group”> <label for=”name”>Name</label> <input type=”text” class=”form-control” id=”name” name=”tenSinhVien” placeholder=”Enter Name”> </div> </div> </div> <button type=”submit” class=”btn btn-primary”>Submit</button> </form> </div> </body> </html> Cập nhật sinh viên Controller @PostMapping(“/editSinhVien/updateSinhVien”) public String updateSinhVien( @ModelAttribute(“sinhVien”) SinhVien sinhVien){ sinhVienService.update( sinhVien); return “redirect:/view”; } @GetMapping(“/editSinhVien/{id}”) public String viewUpdateSinhVien(@PathVariable(“id”) Long id, Model model) { model.addAttribute(“sinhVien”, sinhVienService.findById(id)); return “updateSinhVien”; } updateSinhVien.jsp <%@ page language=”java” contentType=”text/html; charset=UTF-8″ pageEncoding=”UTF-8″%> <%@ taglib prefix=”c” uri=”//java.sun.com/jsp/jstl/core” %> <html> <head> <meta http-equiv=”Content-Type” content=”text/html; charset=ISO-8859-1″> <%– <link href=”//cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css” rel=”stylesheet” integrity=”sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD” crossorigin=”anonymous”>–%> <title>Insert title here</title> </head> <body > <div class=”container mt-3″> <h1>Edit Sinh Vien Form</h1> <form action=”updateSinhVien” method=”POST” modelAttribute=”sinhVien”> <div class=”row”> <div class=”col”> <div class=”form-group”> <label for=”id”>Id</label> <input type=”text” value=”${sinhVien.maSinhVien}” class=”form-control” id=”id” name=”maSinhVien” > </div> </div> </div> <div class=”row”> <div class=”col”> <div class=”form-group”> <label for=”name”>Name</label> <input class=”form-control” id=”name” name=”tenSinhVien” placeholder=”Enter name”> ${sinhVien.tenSinhVien } </input> </div> </div> </div> <button type=”submit” class=”btn btn-primary”>Submit</button> </form> </div> </body> </html> |
Xóa Sinh viên
Controller @GetMapping(“/deleteSinhVien/{id}”) public String deleteSinhVien(@PathVariable(“id”) Long id){ sinhVienService.delete(id); return “redirect:/view”; } |
Trong bài viết này, chúng ta đã học cách CRUD 1 project 1 bảng mysql spring boot vs jsp. Tất cả các mẫu mã hiển thị trong bài viết đều có sẵn trên github. Mong rằng các bạn lập trình viên cũng đã đúc rút được thêm một số mẹo hay cho bản thân để áp dụng sau này!
Bộ môn Ứng dụng phần mềm
Trường Cao đẳng FPT Mạng cá cược bóng đá
cơ sở Hà Nội