☛ SpringBoot CRUD Rest API with Hibernate

in this blog, creating custom rest API. Rest API that means use Rest Controller @RestController on Configuration class. for the view, we use the Postman tool . where we testing our request and response generated by URL. Here showing the development process one by one.

HTTP Method Url Mapping CRUD Action
POST customer/customersave Create a new customer
GET customer/all-customer-list Read a list of customers
GET customer/single-customer-view/{theCustomerId} Read a single customer
PUT customer/update Update an exiting customer
DELETE customer/delete/{theCustomerId} Delete an existing customer

Create Spring Boot project using STS

POM.XML

<?xml version="1.0" encoding="UTF-8"?>
<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>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.3.0.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.code4devops</groupId>
	<artifactId>SpringBootRestApiWithHibernate</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>SpringBootRestApiWithHibernate</name>
	<description>Spring Boot RestApi With Hibernate</description>

	<properties>
		<java.version>1.8</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-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<scope>runtime</scope>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>org.junit.vintage</groupId>
					<artifactId>junit-vintage-engine</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

Note: write some database information in appliction.properties

appliction.properties

spring.datasource.url=jdbc:mysql://localhost:3306/spring_boot _build_a_rest_api_with_hibernate?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root

Customer.java

package com.code4devops.entity;
import java.util.Date;
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 com.fasterxml.jackson.annotation.JsonFormat;

@Entity
@Table(name = "customer_detail")
public class Customer {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "customer_id", length = 10, nullable = false)
	private int customer_id;
	
	@Column(name = "customer_fname", length = 45, nullable = true)
	private String customer_fname;
	
	@Column(name = "customer_lname", length = 45, nullable = true)
	private String customer_lname;
	
	@Column(name = "customer_mobile", length = 45, nullable = true)
	private String customer_mobile;
	
	@Column(name = "customer_email", length = 45, nullable = true)
	private String customer_email;
	
	@Column(name = "customer_join_date", length = 45, nullable = true)
	@JsonFormat(pattern="yyyy-MM-dd")
    private Date customer_join_date; 
	
	public Customer() {}
	
	public Customer(String customer_fname, String customer_lname, String customer_mobile, String customer_email) {
		this.customer_fname = customer_fname;
		this.customer_lname = customer_lname;
		this.customer_mobile = customer_mobile;
		this.customer_email = customer_email;
	}
	
	public int getCustomer_id() {
		return customer_id;
	}

	public void setCustomer_id(int customer_id) {
		this.customer_id = customer_id;
	}

	public String getCustomer_fname() {
		return customer_fname;
	}

	public void setCustomer_fname(String customer_fname) {
		this.customer_fname = customer_fname;
	}

	public String getCustomer_lname() {
		return customer_lname;
	}

	public void setCustomer_lname(String customer_lname) {
		this.customer_lname = customer_lname;
	}

	public String getCustomer_mobile() {
		return customer_mobile;
	}

	public void setCustomer_mobile(String customer_mobile) {
		this.customer_mobile = customer_mobile;
	}

	public String getCustomer_email() {
		return customer_email;
	}

	public void setCustomer_email(String customer_email) {
		this.customer_email = customer_email;
	}

	public Date getCustomer_join_date() {
		return customer_join_date;
	}

	public void setCustomer_join_date(Date customer_join_date) {
		this.customer_join_date = customer_join_date;
	}

	@Override
	public String toString() {
		return  customer_id + "|" + customer_fname + "|"+ customer_lname + "|" + customer_mobile + "|" + customer_email+ "|" + customer_join_date;
	}
	
	
	
}

CustomerDataAccessObject.java

package com.code4devops.dao;
import java.util.List;
import com.code4devops.entity.Customer;

public interface CustomerDataAccessObject {
	
	public abstract List<Customer> findAll();
	public abstract Customer findById(int customerId);
	public abstract void save(Customer customer);
	public abstract void deleteById(int customerId);
	
}

CustomerDataAccessObjectImplementation.java

package com.code4devops.dao;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import org.hibernate.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.code4devops.entity.Customer;

@Repository
public class CustomerDataAccessObjectImplementation implements CustomerDataAccessObject{

	@Autowired
	private EntityManager entityManager;
	
	@Override
	public List<Customer> findAll() {
		
		//get the current hibernate session
		Session session=entityManager.unwrap(Session.class);
		
		//create a query
		//table name same as class name here in query it case sensitive
		Query	theQuery=session.createQuery("from Customer", Customer.class);
				
				
		//execute query and get result list
		List<Customer> customerList= theQuery.getResultList();
				
				
		//return the results
		return customerList;
	}

	@Override
	public Customer findById(int customerId) {
		
		//get the current hibernate session
		Session session=entityManager.unwrap(Session.class);
		
		//get the Customer Object by customerId
		Customer customer=session.get(Customer.class, customerId);
													
		//return the results
		return customer;
		
	}

	@Override
	public void save(Customer customer) {
		
		//get the current hibernate session
		Session session=entityManager.unwrap(Session.class);
		
		//Remember One Thing : if id=0 the insert else update
		session.saveOrUpdate(customer);
		
	}

	@Override
	public void deleteById(int customerId) {
		
		//get the current hibernate session
		Session session=entityManager.unwrap(Session.class);
		
		//delete Object with primary key
		Query theQuery = session.createQuery("delete from Customer where customer_id=:customer_id");
				
		theQuery.setParameter("customer_id", customerId);
				
		theQuery.executeUpdate();
		
	}

}

CustomerService.java

 
package com.code4devops.service;
import java.util.List;
import com.code4devops.entity.Customer;

public interface CustomerService {
	
	public abstract List<Customer> findAll();
	public abstract Customer findById(int customerId);
	public abstract void save(Customer Customer);
	public abstract void deleteById(int customerId);
	
}

CustomerServiceImplementation.java

package com.code4devops.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.code4devops.dao.CustomerDataAccessObject;
import com.code4devops.entity.Customer;

@Service
public class CustomerServiceImplementation implements CustomerService{

	
	@Autowired
	private CustomerDataAccessObject customerDataAccessObject;
	
	@Override
	@Transactional
	public List<Customer> findAll() {
		return customerDataAccessObject.findAll();
	}

	@Override
	@Transactional
	public Customer findById(int customerId) {
		return customerDataAccessObject.findById(customerId);
	}

	@Override
	@Transactional
	public void save(Customer customer) {
		customerDataAccessObject.save(customer);
		
	}

	@Override
	@Transactional
	public void deleteById(int customerId) {
		customerDataAccessObject.deleteById(customerId);
		
	}

	

}

RestControllerForCustomer.java

package com.code4devops;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.code4devops.entity.Customer;
import com.code4devops.service.CustomerService;

@RestController
@RequestMapping("customer")
public class RestControllerForCustomer {
	
		@Autowired
		private CustomerService customerService;
		

		//expose "customer/customersave"
		@PostMapping("/customersave")
		public  Customer getEmployeeSave(@RequestBody Customer theCustomer) {
			theCustomer.setCustomer_id(0);
			customerService.save(theCustomer);
			return theCustomer;
		}
			
		//expose "customer/all-customer-list"
		@GetMapping("/all-customer-list")
		public List<Customer> getAllEmployeeList() {
			return customerService.findAll();
			
		}
				
		//expose customer/single-customer-view/{theCustomerId}
		@GetMapping("/single-customer-view/{theCustomerId}")
		public Customer getSingleCustomerView(@PathVariable int theCustomerId) {
			return customerService.findById(theCustomerId);
		}
		
		//expose "customer/delete/1"
		@DeleteMapping("/delete/{theCustomerId}")
		public String getEmployee(@PathVariable int theCustomerId) {
			Customer customer=customerService.findById(theCustomerId);
				if( customer == null) {
					throw new RuntimeException("Employee id not found  :"+ theCustomerId);
				}
				customerService.deleteById(theCustomerId);
				
			return "Delete customer id :" +theCustomerId;	
		}
		
		//expose "customer/update"
		@PutMapping("/update")
		public Customer getEmployeeUpdate(@RequestBody Customer customer) {
			customerService.save(customer);
			return customer;
		}
		
}

SpringBootRestApiWithHibernateApplication.java

package com.code4devops;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringBootRestApiWithHibernateApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringBootRestApiWithHibernateApplication.class, args);
	}

}