Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate
Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate sẽ bao gồm 4 xử lý cơ bản đó là thêm (C), lấy dữ liệu (R), cập nhật dữ liệu (U) và xóa dữ liệu (D).
Trong những bài hướng dẫn trước, chúng tôi đã trình bày cách tạo một Web application với Spring MVC nhưng chưa có phần xử lý database. Và để xử lý database, chúng ta phải cần đến Hibernate.
Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate – Các bước thực hiện
1/ Tạo một Maven Web Application Project
Các bạn có thể tạo mới một Project. Trong bài hướng dẫn này, chúng tôi sử dụng lại project của bài Hướng dẫn validation trong Spring MVC 5
2/ Mở file pom.xml và thêm dependency
<!-- Spring ORM -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.1.0.RELEASE</version>
</dependency>
<!-- Hibernate Core -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.17.Final</version>
</dependency>
<!-- MySQL Server -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
3/ Tạo một file tên AppContext để cấu hình Spring và Hibernate sử dụng Java code
Nhập code cho AppContext
package vn.giasutinhoc.spring5mvc.config;
import java.util.Properties;
import javax.sql.DataSource;
import org.springframework.core.env.Environment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@PropertySource("classpath:database.properties")
@EnableTransactionManagement
@ComponentScan(basePackages = { "vn.giasutinhoc.spring5mvc" })
public class AppContext {
@Autowired
private Environment environment;
@Bean
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
sessionFactory.setPackagesToScan(new String[] { "vn.giasutinhoc.spring5mvc.model" });
sessionFactory.setHibernateProperties(hibernateProperties());
return sessionFactory;
}
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName"));
dataSource.setUrl(environment.getRequiredProperty("jdbc.url"));
dataSource.setUsername(environment.getRequiredProperty("jdbc.username"));
dataSource.setPassword(environment.getRequiredProperty("jdbc.password"));
return dataSource;
}
private Properties hibernateProperties() {
Properties properties = new Properties();
properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect"));
properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql"));
properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql"));
properties.put("hibernate.hbm2ddl.auto", environment.getRequiredProperty("hibernate.hbm2ddl.auto"));
return properties;
}
@Bean
public HibernateTransactionManager getTransactionManager() {
HibernateTransactionManager transactionManager = new HibernateTransactionManager();
transactionManager.setSessionFactory(sessionFactory().getObject());
return transactionManager;
}
}
4/ Tạo file database.properties bên trong thư mục resources để cấu hình kết nối đến database
Chọn File -> chọn New -> chọn File
Nhập database.properties tại File name -> chọn Finish
Nhập code cho database.properties
jdbc.driverClassName = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/demoDB?useSSL=false
jdbc.username = root
jdbc.password = root
hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
hibernate.show_sql = true
hibernate.format_sql = true
hibernate.hbm2ddl.auto = update
5/ Tạo một entity tên Customer
Mở Customer.java trong package vn.giasutinhoc.spring5mvc.model và thay đổi code
package vn.giasutinhoc.spring5mvc.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.Email;
@Entity
@Table(name = "customer")
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
@NotNull(message = "Không được bỏ trống")
@Size(min = 1, message = "không được bỏ trống")
private String lastName;
@Column(name = "free_passes")
@NotNull(message = "không được bỏ trống")
@Min(value = 0, message = "phải lớn hơn hoặc bằng 0")
@Max(value = 10, message = "phải nhỏ hơn hoặc bằng 10")
private Integer freePasses;
@Column(name = "postal_code")
@Pattern(regexp = "^[a-zA-Z0-9]{5}", message = "5 ký tự hoặc số")
private String postalCode;
@Column(name = "email")
@NotNull(message = "không được bỏ trống")
@Email(message = "Không đúng định dạng email! Vui lòng nhập lại email")
private String email;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Integer getFreePasses() {
return freePasses;
}
public void setFreePasses(Integer freePasses) {
this.freePasses = freePasses;
}
public String getPostalCode() {
return postalCode;
}
public void setPostalCode(String postalCode) {
this.postalCode = postalCode;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
Các bạn chú ý những chỗ chúng tôi tô màu vàng và đóng khung đỏ
6/ Tạo một class tên CustomerDAO
Nhập code cho CustomerService
7/ Tạo một class tên CustomerService
Nhập code cho CustomerService
8/ Mở CustomerController.java và thêm code (phần chúng tôi đóng khung đỏ)
9/ Mở customer-form.jsp và thay đổi code (những chỗ chúng tôi tô màu vàng như trong hình)
10/ Tạo một view tên list-customers.jsp bên trong thư mục views
Nhập code cho list-customers.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Danh sách khách hàng</title>
<link href="<c:url value="/resources/css/bootstrap.min.css" />"
rel="stylesheet">
<script src="<c:url value="/resources/js/jquery-1.11.1.min.js" />"></script>
<script src="<c:url value="/resources/js/bootstrap.min.js" />"></script>
<%@ page isELIgnored="false"%>
</head>
<body>
<div class="container">
<div class="col-md-12">
<h2>CRM - Customer Relationship Manager</h2>
<hr />
<input type="button" value="Thêm mới"
onclick="window.location.href='showForm'; return false;"
class="btn btn-primary" /> <br /> <br />
<div class="panel panel-info">
<div class="panel-heading">
<div class="panel-title">Danh sách khách hàng</div>
</div>
<div class="panel-body">
<div class="table-responsive">
<table class="table table-striped table-bordered">
<tr>
<th>First Name</th>
<th>Last Name</th>
<th>Free Passes</th>
<th>Postal Code</th>
<th>Email</th>
<th>Action</th>
</tr>
<!-- loop over and print our customers -->
<c:forEach var="tempCustomer" items="${customers}">
<!-- construct an "update" link with customer id -->
<c:url var="updateLink" value="/customer/updateForm">
<c:param name="customerId" value="${tempCustomer.id}" />
</c:url>
<!-- construct an "delete" link with customer id -->
<c:url var="deleteLink" value="/customer/delete">
<c:param name="customerId" value="${tempCustomer.id}" />
</c:url>
<tr>
<td>${tempCustomer.firstName}</td>
<td>${tempCustomer.lastName}</td>
<td>${tempCustomer.freePasses}</td>
<td>${tempCustomer.postalCode}</td>
<td>${tempCustomer.email}</td>
<td>
<!-- display the update link --> <a href="${updateLink}">Cập
nhật</a> | <a href="${deleteLink}"
onclick="if (!(confirm('Bạn muốn xóa thông tin khách hàng này?'))) return false">Xóa</a>
</td>
</tr>
</c:forEach>
</table>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate – Build, Deploy và Run
1/ Tạo cơ sở dữ liệu tên demoDb
Database sau khi tạo
2/ Về cách build, deploy và run các bạn tham khảo bài Hướng dẫn tạo project sử dụng Spring MVC 5 với eclipse
3/ Kết quả khi chạy http://localhost:8080/Spring5MVCProject/customer/list
Chọn Thêm mới
Nhập đầy đủ thông tin
Chọn Đăng ký