Hướng dẫn CRUD (Thêm sửa xóa) Spring WebMVC vs Hibernate

2023-06-20 10:30:47

Hướng dẫn CRUD (Thêm sửa xóa) Spring WebMVC vs Hibernate

Bước 1 : Tạo CSDL

Tạo bảng categories: 

create table categories(
    categoryId int GENERATED AS IDENTITY primary key,
    categoryName nvarchar2(100) not null unique,
    categoryStatus number default 1

);

Bước 2: Tạo ứng dụng Dynamic Web Project có tên CRUDSpringMVC

File > New > Other  > Web > Dynamic Web Project

Bước 3: Convert to maven project

Convert project về maven project để quản lý các thư viện của dự án trong file  pom.xml
Click phải vào project > Configure > Convert to Maven Project > Finish

Bước 4: Thêm các thư viện cho ứng dụng trong file pom.xml:

 spring-webmvc,spring-orm,hibernate-core,hibernate-entitymanager,ojdbc8,jstl,javax.servlet-api:

file pom.xml: 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>CRUDSpringMVC</groupId>
  <artifactId>CRUDSpringMVC</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <dependencies>
  	<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
	<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.18</version>
	</dependency>
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-orm -->
	<!-- https://mvnrepository.com/artifact/org.springframework/spring-orm -->
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-orm</artifactId>
	    <version>5.3.24</version>
	</dependency>

	<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
	<dependency>
	    <groupId>org.hibernate</groupId>
	    <artifactId>hibernate-core</artifactId>
	    <version>6.1.7.Final</version>
	    <type>pom</type>
	</dependency>
	<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager -->
	<dependency>
	    <groupId>org.hibernate</groupId>
	    <artifactId>hibernate-entitymanager</artifactId>
	    <version>5.6.14.Final</version>
	</dependency>
	<!-- https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc8 -->
	<dependency>
	    <groupId>com.oracle.database.jdbc</groupId>
	    <artifactId>ojdbc8</artifactId>
	    <version>21.9.0.0</version>
	</dependency>
	<!-- https://mvnrepository.com/artifact/jstl/jstl -->
	<dependency>
	    <groupId>jstl</groupId>
	    <artifactId>jstl</artifactId>
	    <version>1.2</version>
	</dependency>
	
	<dependency>
	  <groupId>javax.servlet</groupId>
	  <artifactId>javax.servlet-api</artifactId>
	  <version>3.0.1</version>
	  <scope>provided</scope>
	</dependency>
  </dependencies> 
   <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <release>17</release>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.2.3</version>
      </plugin>
    </plugins>
  </build>
</project>

Bước 5: Cấu hình file web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>CRUDSpringMVC</display-name>
  <servlet>
  	<servlet-name>CRUDSpringMVC</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  	<init-param>
  		<param-name>contextConfigLocation</param-name> 
  		<param-value>/WEB-INF/config/spring-config.xml</param-value>
  	</init-param>
  </servlet>
  <servlet-mapping>
  		<servlet-name>CRUDSpringMVC</servlet-name>
  		<url-pattern>/</url-pattern>
  </servlet-mapping>
  <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

Bước 6: Cấu hình file spring-config.xml

Tạo file spring-config.xml trong thư mục: /WEB-INF/config/

<?xml version="1.0" encoding="UTF-8"?> 

<beans xmlns="http://www.springframework.org/schema/beans" 

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 

  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 

    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> 

  <context:component-scan base-package="com.mosoftvn.crud_spring_mvc" /> 

  <bean 

    class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 

    <property name="prefix"> 

      <value>/views/</value> 

    </property> 

    <property name="suffix"> 

      <value>.jsp</value> 

    </property> 

  </bean> 
  <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  		<property name="driverClassName" value="oracle.jdbc.OracleDriver"></property>
  		<property name="url" value="jdbc:oracle:thin:@localhost:1521:CrmDB"></property>
  		<property name="username" value="system"></property>
  		<property name="password" value="123456"></property>
  </bean>
  <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
  	<property name="dataSource" ref="dataSource"></property>
  		<property name="packagesToScan" value="com.mosoftvn.crud_spring_mvc.entities"></property>
  		<property name="hibernateProperties">
  			<props>
  				<prop key="hibernate.show_sql">true</prop>
  				<prop key="hibernate.dialect">org.hibernate.dialect.Oracle12cDialect</prop>
  			</props>
  		</property>
  </bean>
</beans>

Bước 7: Tạo các class entity:

trong src/main/java tạo package com.mosoftvn.crud_spring_mvc tạo thêm package con trong package vừa tạo com.mosoftvn.crud_spring_mvc.entities

Tạo class Category: 

package com.mosoftvn.crud_spring_mvc.entities;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.GenerationType;
@Entity
@Table(name = "categories")
public class Category {
	@Id
	@Column(name = "categoryId")
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer categoryId;
	@Column(name =  "categoryName")
	private String categoryName;
	@Column(name = "categoryStatus")
	private Boolean categoryStatus;
	
	public Category() {
		// TODO Auto-generated constructor stub
	}

	public Category(Integer categoryId, String categoryName, Boolean categoryStatus) {
		super();
		this.categoryId = categoryId;
		this.categoryName = categoryName;
		this.categoryStatus = categoryStatus;
	}

	public Integer getCategoryId() {
		return categoryId;
	}

	public void setCategoryId(Integer categoryId) {
		this.categoryId = categoryId;
	}

	public String getCategoryName() {
		return categoryName;
	}

	public void setCategoryName(String categoryName) {
		this.categoryName = categoryName;
	}

	public Boolean getCategoryStatus() {
		return categoryStatus;
	}

	public void setCategoryStatus(Boolean categoryStatus) {
		this.categoryStatus = categoryStatus;
	}
	
	
}

Bước 8: Tạo giao diện CategoryDAO.

trong src/main/java tạị package com.mosoftvn.crud_spring_mvc tạo thêm package con com.mosoftvn.crud_spring_mvc.dao:

CategoryDAO:

package com.mosoftvn.crud_spring_mvc.dao;

import java.util.List;

import com.mosoftvn.crud_spring_mvc.entities.Category;

public interface CategoryDAO {
	public List<Category> getAll();
	public Boolean create(Category category);
	public Category find(Integer categoryID);
	public Boolean update(Category category);
	public Boolean delete(Integer categoryID);
}

Bước 9: Cài đặt phương thức trong lớp CategoryDAOImp

Tại package dao. tạo thêm class CategoryDAOImp:

package com.mosoftvn.crud_spring_mvc.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.mosoftvn.crud_spring_mvc.entities.Category;

@Repository
public class CategoryDAOImpl implements CategoryDAO {
	@Autowired
	private SessionFactory sessionFactory;
	@Override
	public List<Category> getAll() {
		// TODO Auto-generated method stub
		Session session = sessionFactory.openSession();
		
		try {
			List list = session.createQuery("from Category").list();
			return list;
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		} finally {
			session.close();
		}
		return null;
	}

	@Override
	public Boolean create(Category category) {
		// TODO Auto-generated method stub
		Session session = sessionFactory.openSession();
		try {
			session.beginTransaction();
			session.save(category);
			session.getTransaction().commit();
			return true;
		} catch (Exception e) {
			// TODO: handle exception
		} finally {
			session.close();
		}
		return false;
	}

	@Override
	public Category find(Integer categoryID) {
		Session session = sessionFactory.openSession();
		try {
			Category category = session.get(Category.class,categoryID);
			return category;
		} catch (Exception e) {
			// TODO: handle exception
		} finally {
			session.close();
		}
		return null;
	}

	@Override
	public Boolean delete(Integer categoryID) {
		Session session = sessionFactory.openSession();
		
		try {
			session.beginTransaction();
			session.delete(find(categoryID));
			session.getTransaction().commit();
			return true;
		} catch (Exception e) {
			// TODO: handle exception
			session.getTransaction().rollback();
		} finally {
			session.close();
		}
		return null;
	}

	@Override
	public Boolean update(Category category) {
		Session session = sessionFactory.openSession();
		try {
			session.beginTransaction();
			session.update(category);
			session.getTransaction().commit();
			return true;
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally {
			session.close();
		}
		return false;
	}

}

Bước 10: Cài đặt lớp CategoryController:

trong src/main/java tại package com.mosoftvn.crud_spring_mvc tạo thêm package con trong package vừa tạo com.mosoftvn.crud_spring_mvc.controllers

CategoryController: 

package com.mosoftvn.crud_spring_mvc.controllers;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.mosoftvn.crud_spring_mvc.dao.CategoryDAO;
import com.mosoftvn.crud_spring_mvc.entities.Category;

import net.bytebuddy.matcher.ModifierMatcher.Mode;

@Controller
public class CategoryControllers {
	
	@Autowired
	private CategoryDAO categoryDAO;
	@RequestMapping(value = "/")
	public String index(Model model) {
		List<Category> list = categoryDAO.getAll();
		model.addAttribute("list",list);
		return "category/index";
	}
	
	@GetMapping(value = "/addCategory")
	public String add(Model model) {
		Category category = new Category();
		model.addAttribute("category", category);
		return "category/add";
	}
	
	@PostMapping(value = "/insertCategory")
	public String save(@ModelAttribute("category")Category category,Model model) {
		
		boolean check = categoryDAO.create(category);
		if(check) {
			return "redirect:/";
		}
			
		return "category/add";
	}
	
	@GetMapping("/deleteCategory/{id}")
	public String delete(@PathVariable  String id,RedirectAttributes redirectAttrs) {
		
		if(categoryDAO.delete(Integer.parseInt(id))) {
			redirectAttrs.addFlashAttribute("success", "Xóa thành công");
			return "redirect:/";
		}
		
		return "redirect:/";
		
	}
	@GetMapping("/editCategory/{id}")
	public String edit(@PathVariable Integer id,Model model) {
		Category category = categoryDAO.find(id);
		model.addAttribute("category", category);
		return "category/edit";
	}
	
	@PostMapping(value = "/updateCategory")
	public String update(@ModelAttribute("category") Category category,RedirectAttributes redirectAttrs) {
		
		if(categoryDAO.update(category)) {
			redirectAttrs.addFlashAttribute("success", "Cập nhậtthành công");
			return "redirect:/";
		}
		
		return "redirect:/";
	}
}

Bước 11: Tạo các view jsp:

Trong thư mục wepapp tạo thư mục views/category

lần lượt tạo các view trong thư mục đó:

index.jsp: 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
  <head>
    <title>Title</title>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" >
  </head>
  <body>
    
    <div class="container">
        <div class="row justify-content-center">
        	
        
            <div class="col-lg-6">
            <c:if test="${!empty success}">
		        <div class="alert alert-primary" role="alert">
					<strong>${success}</strong>
				</div>
        	</c:if>
                <table class="table">
                    <thead>
                        <tr>
                            <th>STT</th>
                            <th>Name</th>
                            <th>Status</th>
                            <th></th>
                        </tr>
                    </thead>
                    <tbody>
                    <c:forEach items="${list}" var="c" varStatus="loop">
                    	 <tr>
                            <td scope="row">${loop.count}</td>
                            <td>${c.categoryName}</td>
                            <td>${c.categoryStatus ? 'Active' :'Hiden'}</td>
                            <td>
                             <a href="deleteCategory/${c.categoryId}" class="btn btn-danger">Delete</a>
                             <a href="editCategory/${c.categoryId}" class="btn btn-primary">Edit</a>
                             </td>
                        </tr>
                       
                    </c:forEach>
                       
                    </tbody>
                </table>
                <a href="addCategory" class="btn btn-success">Thêm mới</a>
            </div>
        </div>
    </div>

</body>
</html>

add.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
  <head>
    <title>Title</title>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" >
  </head>
  <body>
    
    <div class="container">
        <div class="row justify-content-center">
            <div class="col-lg-6">
                <form:form action="insertCategory" method="POST" modelAttribute="category">
					  <div class="form-group">
					    <label for="exampleInputEmail1">Category Name</label>
					    <form:input type="text" path="categoryName" class="form-control"/>
					    
					  </div>
					  <div class="form-group">
					  <label for="exampleInputEmail1">Category Status</label>
					    <div>
					    <div class="form-check form-check-inline">
						  <form:radiobutton  class="form-check-input" path="categoryStatus" checked="checked"   value="1" />
						  <label class="form-check-label" for="inlineRadio1">Active</label>
						</div>
						
						<div class="form-check form-check-inline">
						  <form:radiobutton  class="form-check-input"  path="categoryStatus"  value="0" />
						  <label class="form-check-label" for="inlineRadio2">Hidden</label>
						</div>
					    
					    </div>
					    
					  </div>
					 
					  <button type="submit" class="btn btn-primary">Add</button>
				</form:form>
            </div>
        </div>
    </div>

</body>
</html>

edit.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
 <c:set var="baseURL" value="${pageContext.request.localName}"/>
<!DOCTYPE html>
<html>
  <head>
    <title>Title</title>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" >
  </head>
  <body>
    
    <div class="container">
        <div class="row justify-content-center">
            <div class="col-lg-6">
                <form:form action="../updateCategory" method="POST" modelAttribute="category">
					  <div class="form-group">
					    <label for="exampleInputEmail1">Category Name</label>
					    <form:input type="text" path="categoryName" class="form-control"/>
					    <form:input path="categoryId" readonly="true" type="hidden"/>
					  </div>
					  <div class="form-group">
					  <label for="exampleInputEmail1">Category Status</label>
					    <div>
					    <div class="form-check form-check-inline">
						  <form:radiobutton  class="form-check-input" path="categoryStatus" checked="${category.categoryStatus ? 'checked': ''}"   value="1" />
						  <label class="form-check-label" for="inlineRadio1">Active</label>
						</div>
						
						<div class="form-check form-check-inline">
						  <form:radiobutton  class="form-check-input"  path="categoryStatus"  value="0" checked ="${!category.categoryStatus ? 'checked': ''}"/>
						  <label class="form-check-label" for="inlineRadio2">Hidden</label>
						</div>
					    
					    </div>
					    
					  </div>
					 
					  <button type="submit" class="btn btn-primary">Update</button>
				</form:form>
            </div>
        </div>
    </div>

</body>
</html>

 

Cấu trúc dự án : 

Bài viết liên quan

Ngày đăng : 2023-08-31 08:48:49
Spring MVC Custom Validation(Hướng dẫn validate file)

Spring MVC Custom Validation- Hướng dẫn validate file multipart file, custome anotation validate, validate file không rỗng , validate định dạng file.....

Read More
Ngày đăng : 2023-07-26 17:12:59
Hướng dẫn sử dụng i18n Internationalization(Quốc tế hóa) làm đa ngôn ngữ trong Spring MVC

Sử dụng i18n Internationalization(Quốc tế hóa) làm đa ngôn ngữ trong ứng dụng web với Spring MVC

Read More
Ngày đăng : 2023-07-20 17:17:45
Tải giao diện Admin LTE

Tải giao diện Admin LTE 2 bản rút gọn nhẹ làm trang quản trị cho ứng dụng web ...............

Read More
Ngày đăng : 2023-06-22 11:15:11
Hướng dẫn CRUD Spring WebMVC vs Hibernate phần 2 (Quản lý sản phẩm)

Hướng dẫn CRUD Spring WebMVC vs Hibernate phần 2 (Quản lý sản phẩm), CRUD có upload image và có quan hệ khóa ngoại

Read More
Ngày đăng : 2023-06-13 18:25:02
Hướng dẫn upload file trong spring webmvc

Hướng dẫn upload file trong spring webmvc sử dụng common-io, common-fileupload ...

Read More
Ngày đăng : 2023-06-13 18:15:39
Hướng dẫn validate form trong Spring WebMVC

Hướng dẫn validate form trong springMVC sử dụng javax-validate

Read More
Ngày đăng : 2023-06-08 14:57:17
Tổng quan về Spring Framework và Spring MVC

Là một framework phát triển ứng dụng phổ biến nhất cho ứng dụng doanh nghiệp trong Java Là một nền tảng Java mã nguồn mở. Được viết đầu tiên bởi Rod Johnson và được phát hành lần đầu dưới phiên bản Apache 2.0 vào tháng 6 năm 2003

Read More