February 20th, 2023
SpringBoot JPA with H2
JPA is Java Persistence API, is an interface and Hibernate is an implementation of JPA and is an ORM Framework. ORM stands for Object-Relational Mapping
pom.xml
4.0.0
org.springframework.boot
spring-boot-starter-parent
3.0.2
com.brains.database
database-demo
0.0.1-SNAPSHOT
database-demo
Demo project for Spring Boot
17
org.springframework.boot
spring-boot-starter-data-jpa
org.springframework.boot
spring-boot-starter-web
com.h2database
h2
runtime
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
org.projectlombok
lombok
application.properties
#spring.datasource.url=jdbc:h2:mem:testdb;NON_KEYWORDS=USER
spring.datasource.url=jdbc:h2:mem:public;MODE=MYSQL;DATABASE_TO_UPPER=false;INIT=CREATE SCHEMA IF NOT EXISTS public
spring.h2.console.enabled=true
spring.data.jpa.repositories.bootstrap-mode=default
spring.jpa.defer-datasource-initialization=true
spring.jpa.show-sql=true
See the UI for the H2 database by typing this url
http://localhost:8080/h2-console
Add data.sql in the resources folder and it would automatically called at startup. Load some data in the table by adding some records in the same data.sql file.
data.sql
insert into person (id, name, location, birth_date)
values(10001,'Ranga','Hyderabad', now() );
insert into person (id, name, location, birth_date)
values(10002,'John','Guntur', now() );
insert into person (id, name, location, birth_date)
values(10003,'Ravi','Ahmedabad', now() );
Create PersonJdbcDao which can interact with the database. Here all the magic happens using Autoconfiguration by SpringBoot. @JdbcTemplate is the class responsible such database interactions.
package com.brains.database.databasedemo.bean;
import java.util.Date;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.NamedQuery;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Entity
@Data @AllArgsConstructor @NoArgsConstructor
@NamedQuery(name = "find_all_persons", query = "select p from Person p")
public class Person {
@Id
@GeneratedValue
private int id;
private String name;
private String location;
private Date birth_date;
public Person(String name, String location, Date birth_date) {
super();
this.name = name;
this.location = location;
this.birth_date = birth_date;
}
}
package com.brains.database.databasedemo.repository;
import java.util.List;
import org.springframework.stereotype.Repository;
import com.brains.database.databasedemo.bean.Person;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import jakarta.persistence.TypedQuery;
import jakarta.transaction.Transactional;
@Repository
@Transactional
public class PersonJpaRepository {
@PersistenceContext
EntityManager entityManager;
public List findAll(){
TypedQuery personNamedQuery = entityManager.createNamedQuery("find_all_persons", Person.class);
return personNamedQuery.getResultList();
}
public Person findById(int id) {
return entityManager.find(Person.class, id);
}
public Person update(Person person) {
return entityManager.merge(person);
}
public Person insert(Person person) {
return entityManager.merge(person);
}
public void delete(int id) {
Person person = findById(id);
entityManager.remove(person);
}
}
Extend the main applicatino with CommandLineRunner so that run() method can be executed while application startup.
package com.brains.database.databasedemo;
import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.brains.database.databasedemo.bean.Person;
import com.brains.database.databasedemo.repository.PersonJpaRepository;
@SpringBootApplication
public class SpringJpaDemoApplication implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(SpringJpaDemoApplication.class, args);
}
@Autowired
PersonJpaRepository jpaRepository;
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public void run(String... args) throws Exception {
logger.info("Peson found: -> {}", jpaRepository.findById(10002));
logger.info("Insert new person -> {}", jpaRepository.insert(new Person("Suresh", "Ahmedabad", new Date())));
jpaRepository.delete(10001);
logger.info("All persons: -> {}", jpaRepository.findAll());
}
}
Running the Application
2023-02-21T00:28:37.518+05:30 INFO 26412 --- [ main] SpringJpaDemoApplication$$SpringCGLIB$$0 : Peson found: -> Person(id=10002, name=John, location=Guntur, birth_date=2023-02-21 00:28:37.298462)
Hibernate: select next value for person_seq
Hibernate: insert into person (birth_date, location, name, id) values (?, ?, ?, ?)
2023-02-21T00:28:37.527+05:30 INFO 26412 --- [ main] SpringJpaDemoApplication$$SpringCGLIB$$0 : Insert new person -> Person(id=1, name=Suresh, location=Ahmedabad, birth_date=2023-02-21 00:28:37.518)
Hibernate: select p1_0.id,p1_0.birth_date,p1_0.location,p1_0.name from person p1_0 where p1_0.id=?
Hibernate: delete from person where id=?
Hibernate: select p1_0.id,p1_0.birth_date,p1_0.location,p1_0.name from person p1_0
2023-02-21T00:28:37.551+05:30 INFO 26412 --- [ main] SpringJpaDemoApplication$$SpringCGLIB$$0 : All persons: -> [Person(id=1, name=Suresh, location=Ahmedabad, birth_date=2023-02-21 00:28:37.518), Person(id=10002, name=John, location=Guntur, birth_date=2023-02-21 00:28:37.298462), Person(id=10003, name=Ravi, location=Ahmedabad, birth_date=2023-02-21 00:28:37.298631)]
Leave a Reply