Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

Spring Boot and Spring Data JPA Integration

DZone's Guide to

Spring Boot and Spring Data JPA Integration

This tutorial steps you through the process of creating a Spring Boot application connected to a PostgreSQL server

· Java Zone ·
Free Resource

How do you break a Monolith into Microservices at Scale? This ebook shows strategies and techniques for building scalable and resilient microservices.

Nowadays, spring and JPA integration have become a piece of cake thanks to Spring Boot and spring Data.

I am going setup a postgresql server:

docker pull postgres
#run the container
docker run --name postgreslocal -e POSTGRES_PASSWORD=postgres -d postgres
#get the ip
docker inspect --format '{{ .NetworkSettings.IPAddress }}' postgreslocal
#get the port
docker inspect --format '{{ .NetworkSettings.Ports }}' postgreslocal

Create the employees Table:

create schema spring_data_jpa_example;

create table spring_data_jpa_example.employee(
id SERIAL PRIMARY KEY,
firstnameTEXTNOT NULL,
lastnameTEXTNOT NULL,
 emailTEXT not null,
 age INT NOT NULL,
 salary real,
unique(email)
);

insert into spring_data_jpa_example.employee (firstname,lastname,email,age,salary) 
values ('Emmanouil','Gkatziouras','gkatzioura@gmail.com',18,3000.23);

Let’s begin with our gradle file:

group 'com.gkatzioura'
version '1.0-SNAPSHOT'

apply plugin: 'java'

sourceCompatibility = 1.8

buildscript {
 repositories {
 mavenCentral()
 }
 dependencies {
 classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.3.RELEASE")
 }
}

apply plugin: 'idea'
apply plugin: 'spring-boot'

repositories {
 mavenCentral()
}

dependencies {
 compile("org.springframework.boot:spring-boot-starter-web") {
 exclude module: "spring-boot-starter-tomcat"
 }
 compile("org.postgresql:postgresql:9.4-1206-jdbc42")
 compile("org.springframework.boot:spring-boot-starter-jetty")
 compile("org.springframework.boot:spring-boot-starter-data-jpa:1.3.3.RELEASE")
 compile("com.mchange:c3p0:0.9.5.2")
 testCompile("junit:junit:4.11");
}

As you see, we added the c3p0 connection pool, the spring-boot-starter-data-jpa for hibernate and the postgres driver. That’s all we need.

The Application Class

package com.gkatzioura.springdata.jpa;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

/**
 * Created by gkatzioura on 6/2/16.
 */
@SpringBootApplication
public class Application {


 public static void main(String[] args) {

 SpringApplication springApplication = new SpringApplication();
 ApplicationContext ctx = springApplication.run(Application.class, args);
 }
}

The DataSource Configuration


package com.gkatzioura.springdata.jpa.config;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

/**
 * Created by gkatzioura on 6/2/16.
 */
@Configuration
public class DataSourceConfig {

 @Bean
 public DataSource createDataSource() throws Exception {

 ComboPooledDataSource ds = new ComboPooledDataSource();
 ds.setJdbcUrl("jdbc:postgresql://172.17.0.3:5432/postgres?user=postgres&password=postgres");
 ds.setDriverClass("org.postgresql.Driver");

 return ds;
 }

}

The Employee entity


package com.gkatzioura.springdata.jpa.persistence.entity;

import javax.persistence.*;

/**
 * Created by gkatzioura on 6/2/16.
 */
@Entity
@Table(name = "employee", schema="spring_data_jpa_example")
public class Employee {

 @Id
 @Column(name = "id")
 @GeneratedValue(strategy = GenerationType.SEQUENCE)
 private Long id;

 @Column(name = "firstname")
 private String firstName;

 @Column(name = "lastname")
 private String lastname;

 @Column(name = "email")
 private String email;

 @Column(name = "age")
 private Integer age;

 @Column(name = "salary")
 private Integer salary;

 public Long getId() {
 return id;
 }

 public void setId(Long 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 String getEmail() {
 return email;
 }

 public void setEmail(String email) {
 this.email = email;
 }

 public Integer getAge() {
 return age;
 }

 public void setAge(Integer age) {
 this.age = age;
 }

 public Integer getSalary() {
 return salary;
 }

 public void setSalary(Integer salary) {
 this.salary = salary;
 }
}

The employee repository

package com.gkatzioura.springdata.jpa.persistence.repository;

import com.gkatzioura.springdata.jpa.persistence.entity.Employee;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

/**
 * Created by gkatzioura on 6/2/16.
 */
@Repository
public interface EmployeeRepository extends JpaRepository<Employee,Long>{
}

And a controller that will fetch all the data

package com.gkatzioura.springdata.jpa.controller;

import com.gkatzioura.springdata.jpa.persistence.entity.Employee;
import com.gkatzioura.springdata.jpa.persistence.repository.EmployeeRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * Created by gkatzioura on 6/2/16.
 */
@RestController
public class TestController {

 @Autowired
 private EmployeeRepository employeeRepository;

 @RequestMapping("/employee")
 public List<Employee> getTest() {

 return employeeRepository.findAll();
 }
}

Pretty convenient considering the dependencies and the XML configuration overhead of the past.

You can find the source code on GitHub.

How do you break a Monolith into Microservices at Scale? This ebook shows strategies and techniques for building scalable and resilient microservices.

Topics:
spring ,aws ,sqs ,jms

Published at DZone with permission of

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}