pom.xml:

    <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>
</dependency>
</dependencies>

The process can be divide into 6 steps:

1. Update db configs in application.properties

2. Create Employee entity

3. Create DAO interface

4. Create DAO implementation

5. Create REST service to use DAO

6. Create REST controller to use DAO

1. application.properties;

spring.datasource.url=jdbc:mysql://localhost:3306/employee_directory?useSSL=false
spring.datasource.username=root
spring.datasource.password=admin

2. Create Employee entity: Entity is defination of the database table

entity/Employee:

package com.luv2code.springboot.cruddemo.entity;

import javax.persistence.*;

@Entity
@Table(name = "employee")
public class Employee {
// define fields
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private int id; @Column(name="first_name")
private String firstName; @Column(name="last_name")
private String lastName; @Column(name="email")
private String email; public Employee () { } public Employee(String firstName, String lastName, String email) {
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
} // define getter/setter public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public java.lang.String getFirstName() {
return firstName;
} public void setFirstName(java.lang.String firstName) {
this.firstName = firstName;
} public java.lang.String getLastName() {
return lastName;
} public void setLastName(java.lang.String lastName) {
this.lastName = lastName;
} public java.lang.String getEmail() {
return email;
} public void setEmail(java.lang.String email) {
this.email = email;
} // define tostring
@Override
public String toString() {
return "Employee{" +
"id=" + id +
", firstName=" + firstName +
", lastName=" + lastName +
", email=" + email +
'}';
}
}

3. DAO interface: Opreations of the database, which will be implementated by the service:

dao/EmployeeDAO:

package com.luv2code.springboot.cruddemo.dao;

import com.luv2code.springboot.cruddemo.entity.Employee;
import java.util.List; public interface EmployeeDAO {
public List<Employee> findAll(); public Employee findById (int theId); public void save(Employee theEmployee); public void deleteById(int theId);
}

4. DAO implementation:

dao/EmployeeDAOHibernateImpl: Here is the implemataion which write query to database

package com.luv2code.springboot.cruddemo.dao;

import java.util.List;
import com.luv2code.springboot.cruddemo.entity.Employee;
import org.hibernate.Session;
import org.hibernate.query.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository; import javax.persistence.EntityManager;
import javax.transaction.Transactional; @Repository
public class EmployeeDAOHibernateImpl implements EmployeeDAO{ // define field for entitymanager
private EntityManager entityManager; // setup constructor injection
@Autowired
public EmployeeDAOHibernateImpl(EntityManager theEntityManager) {
entityManager = theEntityManager;
} @Override
public List<Employee> findAll() {
// get the current hibernate session
Session currentSession = entityManager.unwrap(Session.class); // create a query
Query<Employee> theQuery =
currentSession.createQuery("from Employee", Employee.class); // execute query and get result list
List<Employee> employees = theQuery.getResultList(); // return the results
return employees;
} @Override
public Employee findById(int theId) {
Session crtSession = entityManager.unwrap(Session.class);
Employee theEmployee = crtSession.get(Employee.class, theId); return theEmployee;
} @Override
public void save(Employee theEmployee) {
Session crtSession = entityManager.unwrap(Session.class);
crtSession.saveOrUpdate(theEmployee);
} @Override
public void deleteById(int theId) {
Session crtSession = entityManager.unwrap(Session.class);
Query theQuery =
crtSession.createQuery("delete from Employee where id=:employeeId");
theQuery.setParameter("employeeId", theId);
theQuery.executeUpdate();
}
}

5. Create a service to use DAO:

service/EmployeeService:

package com.luv2code.springboot.cruddemo.service;

import com.luv2code.springboot.cruddemo.entity.Employee;

public interface EmployeeService {

    public List<Employee> findAll();

    public Employee findById(int theId);

    public void save (Employee theEmployee);

    public void deleteById(int theId);
}

service/EmployeeServiceImpl:

package com.luv2code.springboot.cruddemo.service;

import com.luv2code.springboot.cruddemo.dao.EmployeeDAO;
import com.luv2code.springboot.cruddemo.entity.Employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional; public class EmployeeServiceImpl implements EmployeeService{ private EmployeeDAO employeeDAO; @Autowired
public EmployeeServiceImpl (EmployeeDAO theEmployeeDAO) {
employeeDAO = theEmployeeDAO;
} @Override
@Transactional
public List<Employee> findAll() {
return employeeDAO.findAll();
} @Override
@Transactional
public Employee findById(int theId) {
return employeeDAO.findById(theId);
} @Override
@Transactional
public void save(Employee theEmployee) {
employeeDAO.save(theEmployee);
} @Override
@Transactional
public void deleteById(int theId) {
employeeDAO.deleteById(theId);
}
}

6. Controller:

rest/EmployeeRestController:

package com.luv2code.springboot.cruddemo.rest;

import com.luv2code.springboot.cruddemo.entity.Employee;
import com.luv2code.springboot.cruddemo.service.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; @RestController
@RequestMapping("/api")
public class EmployeeRestController { private EmployeeService employeeService; @Autowired
public EmployeeRestController (EmployeeService theEmployeeService) {
employeeService = theEmployeeService;
} // export "/employees" and return list of employees
@GetMapping("/employees/{employeeId}")
public List<Employee> findAll () {
return employeeService.findAll();
} // add mapping for GET /employee/{employeeId}
public Employee getEmployee (@PathVariable int employeeId) {
Employee theEmployee = employeeService.findById(employeeId); if (theEmployee == null) {
throw new RuntimeException("Employee id not found - " + employeeId);
} return theEmployee;
} // add mapping for POST /employees - and new employee
@PostMapping("/employees")
public Employee addEmployee (@RequestBody Employee theEmployee) {
// also just in case they pass an id in JSON ... set id to 0
// this is to force a save of new item ... instead of update theEmployee.setId(0); // if this is update operation, it will update the id
employeeService.save(theEmployee); return theEmployee;
} // add mapping for PUT /employees - update existing employee
@PutMapping("/employees")
public Employee updateEmployee (@RequestBody Employee theEmployee) {
employeeService.save(theEmployee); return theEmployee;
} // delete mapping for DELETE /employees/{employeeId} - delete an existing employee
@DeleteMapping("/employees/{employeeId}")
public String deleteEmployee (@PathVariable int employeeId) {
Employee tempEmployee = employeeService.findById(employeeId);
if (tempEmployee == null) {
throw new RuntimeException("Employee id not found - " + employeeId);
} employeeService.deleteById(employeeId); return "Deleted employee id - " + employeeId;
}
}

[Sping Boot] Build a REST CRUD API with Hibernate的更多相关文章

  1. Spring Boot中使用Swagger2构建API文档

    程序员都很希望别人能写技术文档,自己却很不愿意写文档.因为接口数量繁多,并且充满业务细节,写文档需要花大量的时间去处理格式排版,代码修改后还需要同步修改文档,经常因为项目时间紧等原因导致文档滞后于代码 ...

  2. Spring Boot 项目学习 (四) Spring Boot整合Swagger2自动生成API文档

    0 引言 在做服务端开发的时候,难免会涉及到API 接口文档的编写,可以经历过手写API 文档的过程,就会发现,一个自动生成API文档可以提高多少的效率. 以下列举几个手写API 文档的痛点: 文档需 ...

  3. Java | Spring Boot Swagger2 集成REST ful API 生成接口文档

      Spring Boot Swagger2 集成REST ful API 生成接口文档 原文 简介 由于Spring Boot 的特性,用来开发 REST ful 变得非常容易,并且结合 Swagg ...

  4. Spring Boot 集成 Swagger 生成 RESTful API 文档

    原文链接: Spring Boot 集成 Swagger 生成 RESTful API 文档 简介 Swagger 官网是这么描述它的:The Best APIs are Built with Swa ...

  5. spring boot 2 集成JWT实现api接口认证

    JSON Web Token(JWT)是目前流行的跨域身份验证解决方案.官网:https://jwt.io/本文使用spring boot 2 集成JWT实现api接口验证. 一.JWT的数据结构 J ...

  6. Sping Boot入门到实战之入门篇(三):Spring Boot属性配置

    该篇为Sping Boot入门到实战系列入门篇的第三篇.介绍Spring Boot的属性配置.   传统的Spring Web应用自定义属性一般是通过添加一个demo.properties配置文件(文 ...

  7. Sping Boot入门到实战之入门篇(一):Spring Boot简介

    该篇为Spring Boot入门到实战系列入门篇的第一篇.对Spring Boot做一个大致的介绍. 传统的基于Spring的Java Web应用,需要配置web.xml, applicationCo ...

  8. Sping Boot入门到实战之入门篇(四):Spring Boot自动化配置

    该篇为Sping Boot入门到实战系列入门篇的第四篇.介绍Spring Boot自动化配置的基本原理与实现.   Spring Boot之所以受开发者欢迎, 其中最重要的一个因素就是其自动化配置特性 ...

  9. Sping Boot入门到实战之实战篇(一):实现自定义Spring Boot Starter——阿里云消息队列服务Starter

    在 Sping Boot入门到实战之入门篇(四):Spring Boot自动化配置 这篇中,我们知道Spring Boot自动化配置的实现,主要由如下几部分完成: @EnableAutoConfigu ...

随机推荐

  1. kafka 名词解释及原理解析过程(三)

    为什么要了解这些名词的解释呢?因为在学一个新的知识或者领域的时候,我们需要知道它所定义的概念和名词意思,因为只有这样我们才能理解和掌握这个新的知识点,才能更加系统的掌握这个技术. 一.名词解释 1.b ...

  2. 【转贴】NUMA的取舍与优化设置

    NUMA的取舍与优化设置 https://www.cnblogs.com/tcicy/p/10191505.html 在os层numa关闭时,打开bios层的numa会影响性能,QPS会下降15-30 ...

  3. operator模块和functools模块

    operator模块 在函数式编程中,经常需要把算术运算符当作函数使用.例如,不使用 递归计算阶乘.求和可以使用 sum 函数,但是求积则没有这样的函数. 我们可以使用 reduce 函数(5.2.1 ...

  4. Ubuntu 提示sudo: java: command not found解决办法

    ubuntu下运行sudo Java 时提示“sudo: java: command not found”.在网上找了,其中很多方法都提示要修改/etc/profile的配置,或是修改/etc/env ...

  5. nginx核心模块常用指令

    默认启动Nginx时,使用的配置文件是: 安装路径/conf/nginx.conf 文件,可以在启动nginx的时候,通过-c来指定要读取的配置文件 常见的配置文件有如下几个: nginx.conf: ...

  6. eclipse导入maven空项目,eclipse导入时不识别maven项目

    经常我们在网上下载的一些开源项目中,想要导入eclipse中,却发现eclipse不识别这个项目,这时候怎么办呢? 解决办法多种多样,我这里举例出最实用的2种: 1.在项目的根目录中加入.classp ...

  7. CDN内容分发

    什么是CDN内容分发: CDN的全称是Content Delivery Network,即内容分发网络.CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡.内容分 ...

  8. hdu 6045 多校签到题目

    http://acm.hdu.edu.cn/showproblem.php?pid=6045 题解:遍历一遍,求出两个人答案中相同的个数,用wa表示.然后我从大的数入手,当wa的数都尽可能在两个人答案 ...

  9. C#通讯框架改写

    现有项目是利用C#的socket与PLC进行实时通讯,PLC有两种通讯模式——常规采集&高频采集. 其中常规采集大概在10ms左右发送一次数据,高频采集大概在2ms左右发送一次数据. 现有代码 ...

  10. 5. Java的注释,标识符、标识符的命名规范

      什么是标识符符? 凡是可以由自己命名的地方都称为修饰符. 例: 项目名 ,包名 ,类名 .方法名 2.   命名规范. ①    不可使用java关键字和保留字,但是可以包含关键字和保留字. ②  ...