在Spring Boot应用程序中使用JDBC模板

x33g5p2x  于2022-10-04 转载在 Spring  
字(5.4k)|赞(0)|评价(0)|浏览(666)

本教程讨论了如何在Spring Boot应用程序中使用**JDBC模板。

在这个例子中,我们将使用H2内存数据库,这是一个用于测试的最好选择。首先执行Spring Boot CLI并使用init命令。

  1. $ spring init -d=jdbc,h2 -g=com.example -a=jdbc-app --package-name=com.example -name=jdbc-app -x

这个命令将创建一个简单的应用程序,它依赖于spring-boot-starter-jdbc pom和H2的依赖关系。参见pom.xml文件。

  1. <?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">
  2. <modelVersion>4.0.0</modelVersion>
  3. <groupId>com.example</groupId>
  4. <artifactId>jdbc-app</artifactId>
  5. <version>0.0.1-SNAPSHOT</version>
  6. <packaging>jar</packaging>
  7. <name>jdbc-app</name>
  8. <description>Demo project for Spring Boot</description>
  9. <parent>
  10. <groupId>org.springframework.boot</groupId>
  11. <artifactId>spring-boot-starter-parent</artifactId>
  12. <version>2.1.0.RELEASE</version>
  13. <relativePath/>
  14. <!-- lookup parent from repository -->
  15. </parent>
  16. <properties>
  17. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  18. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  19. <java.version>1.8</java.version>
  20. </properties>
  21. <dependencies>
  22. <dependency>
  23. <groupId>org.springframework.boot</groupId>
  24. <artifactId>spring-boot-starter-jdbc</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>com.h2database</groupId>
  28. <artifactId>h2</artifactId>
  29. <scope>runtime</scope>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.springframework.boot</groupId>
  33. <artifactId>spring-boot-starter-test</artifactId>
  34. <scope>test</scope>
  35. </dependency>
  36. </dependencies>
  37. <build>
  38. <plugins>
  39. <plugin>
  40. <groupId>org.springframework.boot</groupId>
  41. <artifactId>spring-boot-maven-plugin</artifactId>
  42. </plugin>
  43. </plugins>
  44. </build>
  45. </project>

你可以看到spring-boot-starter-jdbc pom和H2的依赖关系已经包含在内。接下来,让我们给我们的项目添加一个域类。

  1. package com.example;
  2. public class Person {
  3. Long id;
  4. String name;
  5. String surname;
  6. public Person(Long id, String name, String surname) {
  7. super();
  8. this.id = id;
  9. this.name = name;
  10. this.surname = surname;
  11. }
  12. public Person() {
  13. super();
  14. }
  15. public Long getId() {
  16. return id;
  17. }
  18. private void setId(Long id) {
  19. this.id = id;
  20. }
  21. public String getName() {
  22. return name;
  23. }
  24. public void setName(String name) {
  25. this.name = name;
  26. }
  27. public String getSurname() {
  28. return surname;
  29. }
  30. public void setSurname(String surname) {
  31. this.surname = surname;
  32. }
  33. @Override
  34. public String toString() {
  35. return "Person [id=" + id + ", name=" + name + ", surname=" + surname + "]";
  36. }
  37. }

正如你所看到的,这是一个普通的Java类,没有Hibernate/JPA注释,因为我们将使用JDBC模板而不是ORM框架。为了使事情顺利进行,我们需要一个服务类来处理执行SQL语句的问题。

  1. package com.example;
  2. import java.util.ArrayList;
  3. import java.util.Date;
  4. import java.util.List;
  5. import org.slf4j.Logger;
  6. import org.slf4j.LoggerFactory;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.jdbc.core.JdbcTemplate;
  9. import org.springframework.stereotype.Service;
  10. @Service
  11. public class PersonService {
  12. private static final Logger log = LoggerFactory.getLogger(PersonService.class);
  13. @Autowired JdbcTemplate jdbcTemplate;
  14. public void insertData() {
  15. log.info("Table creation");
  16. jdbcTemplate.execute("DROP TABLE PERSON IF EXISTS");
  17. jdbcTemplate.execute("CREATE TABLE PERSON(id SERIAL, name VARCHAR(255), surname VARCHAR(255))");
  18. log.info("Inserting data");
  19. jdbcTemplate.execute("INSERT INTO PERSON(name,surname) VALUES('John','Doe')");
  20. log.info("Inserting data");
  21. jdbcTemplate.execute("INSERT INTO PERSON(name,surname) VALUES('Gabriel','Fox')");
  22. log.info("Done.");
  23. }
  24. public List<Person> findAll() {
  25. List<Person> entries = new ArrayList<>();
  26. jdbcTemplate
  27. .query(
  28. "SELECT * FROM PERSON",
  29. new Object[] {},
  30. (rs, row) ->
  31. new Person(rs.getLong("id"), rs.getString("name"), rs.getString("surname")))
  32. .forEach(entry -> entries.add(entry));
  33. return entries;
  34. }
  35. }

让我们看一下它的内容。

  • @JdbcTemplate 。这是一个自动连接的JdbcTemplate类,它将负责执行针对数据库的任务。

  • insertData 。这个方法将首先尝试放弃Person表,如果它存在的话,然后它将创建带有字段的Person表,最后,它将向数据库插入一些数据。

  • findAll 。这个方法将使用jdbcTemplate实例和查询方法(接受SQL语法)来获取所有数据;它将返回一个Person实例的集合。

接下来,修改JdbcAppApplication.java类以使用上述服务。

  1. package com.example;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.boot.CommandLineRunner;
  6. import org.springframework.boot.SpringApplication;
  7. import org.springframework.boot.autoconfigure.SpringBootApplication;
  8. @SpringBootApplication
  9. public class JdbcAppApplication implements CommandLineRunner {
  10. private static final Logger log = LoggerFactory.getLogger(JdbcAppApplication.class);
  11. @Autowired PersonService service;
  12. public static void main(String[] args) {
  13. SpringApplication.run(JdbcAppApplication.class, args);
  14. }
  15. @Override
  16. public void run(String... arg0) throws Exception {
  17. log.info("Insert Data");
  18. service.insertData();
  19. log.info("findAll()");
  20. service.findAll().forEach(entry -> log.info(entry.toString()));
  21. }
  22. }

这是将被执行的主类。

  • 它声明了PersonService的自动连接版本,使其在运行方法执行时可用。

  • 它实现了CommandLineRunner接口,当然你也需要实现它的方法,叫做public void run(String... args)。只要记住,这个运行方法将在Spring Boot启动后执行。

要运行该应用程序,请执行以下命令。

  1. $ ./mvnw spring-boot:run

该命令将使用Spring Initializr附带的Maven包装器运行该应用。如果你将Maven作为全局工具,只需运行此命令即可。

  1. $ mvn spring-boot:run

相关文章