Spring Boot (4) Connect MySQL by Spring Data JPA
This section describes how to connect MySQL by Spring Data JPA (Java Persistence API). Spring Data JPA, part of the larger Spring Data family, makes it easy to easily implement JPA based repositories. This module deals with enhanced support for JPA based data access layers. It makes it easier to build Spring-powered applications that use data access technologies.
- Spring JPA website:
https://projects.spring.io/spring-data-jpa/ - For more Spring JPA rules, refer to:
1. Creating the POM
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.my.study.springboot</groupId>
<artifactId>mysql</artifactId>
<version>0.0.1-RELEASE</version>
<properties>
<!-- Generic properties -->
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- Need to set Hibernate version explicitly, because java 8 date and time not mapped properly with default version -->
<hibernate.version>5.2.10.Final</hibernate.version>
<javassist-version>3.12.1.GA</javassist-version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.14.RELEASE</version>
</parent>
<dependencies>
<!-- spring-boot-starter-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- spring-boot-starter-data-jpa -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- Java assist -->
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>${javassist-version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2. application.properties
# Common properties
server.port = 8080
server.context-path=/mysql
server.session.timeout=1800
# MySQL connections
spring.datasource.url=jdbc:mysql://localhost:3306/user_management
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# JPA properties
spring.jpa.database=MYSQL
spring.jpa.show-sql=true
# Create table automatically
spring.jpa.hibernate.ddl-auto=update
3. Module
package com.my.study.springboot.mysql.module;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "users")
public class User {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
// @Column(name = "id")
// No need to define @Column if table column is the same as attribute id here
private int id;
// @Column(name = "name")
private String name;
// @Column(name = "age")
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
}
4. Dao (Repository)
package com.my.study.springboot.mysql.dao;
import java.util.List;
import org.springframework.data.repository.CrudRepository;
import com.my.study.springboot.mysql.module.User;
// No need to define implementation class, just only define an interface
public interface IUserDao extends CrudRepository<User, Integer> {
List<User> findByNameContaining(String name);
// Refer to https://docs.spring.io/spring-data/jpa/docs/1.5.1.RELEASE/reference/html/jpa.repositories.html#jpa.query-methods.query-creation
}
5. Controller
package com.my.study.springboot.mysql.controller;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.util.UriComponentsBuilder;
import com.my.study.springboot.mysql.dao.IUserDao;
import com.my.study.springboot.mysql.module.User;
@RestController
public class UserController {
@Autowired
private IUserDao userDao;
// Query all users
@RequestMapping(value = "/user/", method = RequestMethod.GET)
public ResponseEntity<List<User>> listAllUsers() {
Iterator<User> itUsers = userDao.findAll().iterator();
List<User> users = new ArrayList<User>();
while (itUsers.hasNext()) {
users.add(itUsers.next());
}
if (users.isEmpty()) {
// You many decide to return HttpStatus.NOT_FOUND
return new ResponseEntity<List<User>>(HttpStatus.NO_CONTENT);
}
return new ResponseEntity<List<User>>(users, HttpStatus.OK);
}
// Query one user by ID
@RequestMapping(value = "/user/id={id}", method = RequestMethod.GET)
public ResponseEntity<User> findUserById(@PathVariable("id") int id) {
User user = userDao.findOne(id);
if (null == user) {
return new ResponseEntity<User>(HttpStatus.NOT_FOUND);
}
return new ResponseEntity<User>(user, HttpStatus.OK);
}
// Query users by name
@RequestMapping(value = "/user/name={name}", method = RequestMethod.GET)
public ResponseEntity<List<User>> findUsersByName(@PathVariable("name") String name) {
List<User> users = userDao.findByNameContaining(name);
if (users.isEmpty()) {
return new ResponseEntity<List<User>>(HttpStatus.NOT_FOUND);
}
return new ResponseEntity<List<User>>(users, HttpStatus.OK);
}
// Add one user
@RequestMapping(value = "/user/", method = RequestMethod.POST)
public ResponseEntity<Void> createUser(@RequestBody User user, UriComponentsBuilder ucBuilder) {
if (null != userDao.findOne(user.getId())) {
return new ResponseEntity<Void>(HttpStatus.CONFLICT);
}
userDao.save(user);
HttpHeaders headers = new HttpHeaders();
// This is to send client a URL of how to get added user
headers.setLocation(ucBuilder.path("/user/{id}").buildAndExpand(user.getId()).toUri());
return new ResponseEntity<Void>(headers, HttpStatus.CREATED);
}
// Update user by ID
@RequestMapping(value = "/user/{id}", method = RequestMethod.PUT)
public ResponseEntity<User> updateUser(@PathVariable("id") long id, @RequestBody User user) {
User currentUser = userDao.findOne(user.getId());
if (null == currentUser) {
return new ResponseEntity<User>(HttpStatus.NOT_FOUND);
}
userDao.save(user);
return new ResponseEntity<User>(user, HttpStatus.OK);
}
// Delete user by ID
@RequestMapping(value = "/user/{id}", method = RequestMethod.DELETE)
public ResponseEntity<Void> deleteUser(@PathVariable("id") int id) {
User currentUser = userDao.findOne(id);
if (null == currentUser) {
return new ResponseEntity<Void>(HttpStatus.NOT_FOUND);
}
userDao.delete(id);
return new ResponseEntity<Void>(HttpStatus.NO_CONTENT);
}
// Delete all users
@RequestMapping(value = "/user/", method = RequestMethod.DELETE)
public ResponseEntity<Void> deleteAllUsers() {
userDao.deleteAll();
return new ResponseEntity<Void>(HttpStatus.NO_CONTENT);
}
}
6. Main
package com.my.study.springboot.mysql;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
}
7. Code structure
8. Testing
Add user:
Query user by name:
9. References