diff --git a/spring-boot-modules/spring-boot-jpa/pom.xml b/spring-boot-modules/spring-boot-jpa/pom.xml new file mode 100644 index 0000000000..c7a49c0fca --- /dev/null +++ b/spring-boot-modules/spring-boot-jpa/pom.xml @@ -0,0 +1,61 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.2.4.RELEASE + + + com.baeldung + jpa + 0.0.1-SNAPSHOT + spring-boot-jpa + spring-boot-jpa + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-data-jdbc + + + org.springframework.boot + spring-boot-starter-data-jpa + + + mysql + mysql-connector-java + + + + com.h2database + h2 + runtime + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/spring-boot-modules/spring-boot-jpa/src/main/java/com/baeldung/jpa/SpringBootJpaApplication.java b/spring-boot-modules/spring-boot-jpa/src/main/java/com/baeldung/jpa/SpringBootJpaApplication.java new file mode 100644 index 0000000000..f7253c4b8d --- /dev/null +++ b/spring-boot-modules/spring-boot-jpa/src/main/java/com/baeldung/jpa/SpringBootJpaApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.jpa; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringBootJpaApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringBootJpaApplication.class, args); + } + +} diff --git a/spring-boot-modules/spring-boot-jpa/src/main/java/com/baeldung/jpa/controller/CarController.java b/spring-boot-modules/spring-boot-jpa/src/main/java/com/baeldung/jpa/controller/CarController.java new file mode 100644 index 0000000000..444f13ff8d --- /dev/null +++ b/spring-boot-modules/spring-boot-jpa/src/main/java/com/baeldung/jpa/controller/CarController.java @@ -0,0 +1,27 @@ +package com.baeldung.jpa.controller; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.jpa.entity.Car; +import com.baeldung.jpa.service.CarService; + +@RestController +public class CarController { + @Autowired + private CarService carService; + + @GetMapping(path = "/modelcount") + public long getTotalCarsByModel(@RequestParam("model") String model) { + return carService.getTotalCarsByModel(model); + } + + @GetMapping(path = "/carsafteryear") + public List findCarsAfterYear(@RequestParam("year") Integer year) { + return carService.findCarsAfterYear(year); + } +} diff --git a/spring-boot-modules/spring-boot-jpa/src/main/java/com/baeldung/jpa/entity/Car.java b/spring-boot-modules/spring-boot-jpa/src/main/java/com/baeldung/jpa/entity/Car.java new file mode 100644 index 0000000000..3e850e391d --- /dev/null +++ b/spring-boot-modules/spring-boot-jpa/src/main/java/com/baeldung/jpa/entity/Car.java @@ -0,0 +1,34 @@ +package com.baeldung.jpa.entity; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Car { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column + private long id; + + @Column + private String model; + + @Column + private Integer year; + + public long getId() { + return id; + } + + public String getModel() { + return model; + } + + public Integer getYear() { + return year; + } + +} diff --git a/spring-boot-modules/spring-boot-jpa/src/main/java/com/baeldung/jpa/repository/CarRepository.java b/spring-boot-modules/spring-boot-jpa/src/main/java/com/baeldung/jpa/repository/CarRepository.java new file mode 100644 index 0000000000..6b3bf57feb --- /dev/null +++ b/spring-boot-modules/spring-boot-jpa/src/main/java/com/baeldung/jpa/repository/CarRepository.java @@ -0,0 +1,22 @@ +package com.baeldung.jpa.repository; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.jpa.repository.query.Procedure; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import com.baeldung.jpa.entity.Car; + +@Repository +public interface CarRepository extends JpaRepository { + + @Procedure(procedureName = "GET_TOTAL_CARS_BY_MODEL") + int getTotalCarsByModel(@Param("model_in") String model); + + @Query(value = "CALL FIND_CARS_AFTER_YEAR(:year_in);", nativeQuery = true) + List findCarsAfterYear(@Param("year_in") Integer year_in); + +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-jpa/src/main/java/com/baeldung/jpa/service/CarService.java b/spring-boot-modules/spring-boot-jpa/src/main/java/com/baeldung/jpa/service/CarService.java new file mode 100644 index 0000000000..62e9a3b067 --- /dev/null +++ b/spring-boot-modules/spring-boot-jpa/src/main/java/com/baeldung/jpa/service/CarService.java @@ -0,0 +1,23 @@ +package com.baeldung.jpa.service; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baeldung.jpa.entity.Car; +import com.baeldung.jpa.repository.CarRepository; + +@Service +public class CarService { + @Autowired + private CarRepository carRepository; + + public int getTotalCarsByModel(String model) { + return carRepository.getTotalCarsByModel(model); + } + + public List findCarsAfterYear(Integer year) { + return carRepository.findCarsAfterYear(year); + } +} diff --git a/spring-boot-modules/spring-boot-jpa/src/main/resources/application.properties b/spring-boot-modules/spring-boot-jpa/src/main/resources/application.properties new file mode 100644 index 0000000000..ce149df16b --- /dev/null +++ b/spring-boot-modules/spring-boot-jpa/src/main/resources/application.properties @@ -0,0 +1,17 @@ + +#spring.jpa.hibernate.ddl-auto=validate + +#MySql +spring.datasource.url=jdbc:mysql://localhost:3306/baeldung +spring.datasource.username=baeldung +spring.datasource.password=baeldung +#spring.datasource.driver-class-name=com.mysql.jdbc.Driver +#spring.datasource.platform=mysql +#spring.datasource.initialization-mode=always +#spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect + + + +#For debugging +#spring.jpa.show-sql = true + diff --git a/spring-boot-modules/spring-boot-jpa/src/main/resources/car-mysql.sql b/spring-boot-modules/spring-boot-jpa/src/main/resources/car-mysql.sql new file mode 100644 index 0000000000..bb4ab2a86e --- /dev/null +++ b/spring-boot-modules/spring-boot-jpa/src/main/resources/car-mysql.sql @@ -0,0 +1,27 @@ +DROP TABLE IF EXISTS car; + +CREATE TABLE car (id int(10) NOT NULL AUTO_INCREMENT, + model varchar(50) NOT NULL, + year int(4) NOT NULL, + PRIMARY KEY (id)); + +INSERT INTO car (model, year) VALUES ('BMW', 2000); +INSERT INTO car (model, year) VALUES ('BENZ', 2010); +INSERT INTO car (model, year) VALUES ('PORCHE', 2005); +INSERT INTO car (model, year) VALUES ('PORCHE', 2004); + +DELIMITER $$ + +DROP PROCEDURE IF EXISTS FIND_CARS_AFTER_YEAR$$ +CREATE PROCEDURE FIND_CARS_AFTER_YEAR(IN year_in INT) +BEGIN + SELECT * FROM car WHERE year >= year_in ORDER BY year; +END$$ + +DROP PROCEDURE IF EXISTS GET_TOTAL_CARS_BY_MODEL$$ +CREATE PROCEDURE GET_TOTAL_CARS_BY_MODEL(IN model_in VARCHAR(50), OUT count_out INT) +BEGIN + SELECT COUNT(*) into count_out from car WHERE model = model_in; +END$$ + +DELIMITER ; diff --git a/spring-boot-modules/spring-boot-jpa/src/test/java/com/baeldung/jpa/SpringBootJpaApplicationTests.java b/spring-boot-modules/spring-boot-jpa/src/test/java/com/baeldung/jpa/SpringBootJpaApplicationTests.java new file mode 100644 index 0000000000..d1d6a4bb9f --- /dev/null +++ b/spring-boot-modules/spring-boot-jpa/src/test/java/com/baeldung/jpa/SpringBootJpaApplicationTests.java @@ -0,0 +1,13 @@ +package com.baeldung.jpa; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class SpringBootJpaApplicationTests { + + @Test + void contextLoads() { + } + +}