Статьи

Начало работы с Spring JDBC в веб-приложении

Я показал вам, как настроить основное веб-приложение Spring 3 MVC в моей предыдущей статье. Повторно используя эту настройку проекта в качестве шаблона, я покажу вам, как улучшить его для работы с JDBC. При этом вы можете хранить и извлекать данные из базы данных. Мы добавим новый контроллер и службу данных через Spring, чтобы вы могли увидеть, как Spring инъекция и настройка аннотаций работают вместе.

Прямое приложение на основе JDBC легко настроить по сравнению с полным ORM, таким как Hibernate. Вам не нужно беспокоиться об АОП, TranactionManager, сопоставлении сущностей и полном массиве других конфигураций. Помимо java.jdbc API JDK, Spring поставляется с модулем spring-jdbc который может продуктивно JdbcTemplate ваш компьютер с помощью хорошо известного класса JdbcTemplate . Давайте рассмотрим, как это можно настроить и запустить как веб-приложение.

Начало работы и настройка проекта

Для демонстрации я буду использовать версию H2Database в памяти как хранилище JDBC. Это просто в использовании и настройке. И если вы решили использовать их базу данных на основе FILE или TCP, вам просто нужно будет переустановить источник данных, и вы можете продолжить исследовать больше.

Мы начнем с добавления новых зависимостей в существующий файл spring-web-annotation/pom.xml .

01
02
03
04
05
06
07
08
09
10
<dependency>
   <groupId>com.h2database</groupId>
   <artifactId>h2</artifactId>
   <version>1.3.163</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-jdbc</artifactId>
   <version>3.2.4.RELEASE</version>
  </dependency>

Благодаря этому у вас будет доступ к классам модулей Spring для настройки. Найдите предыдущий файл src/main/java/springweb/WebApp.java в вашем существующем проекте и добавьте новое сравнение ниже:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package springweb;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
 
import javax.sql.DataSource;
 
public class WebApp extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[]{ RootConfig.class };
    }
 
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[]{ WebAppConfig.class };
    }
 
    @Override
    protected String[] getServletMappings() {
        return new String[]{ "/" };
    }
 
 @Configuration
    @EnableWebMvc
    @ComponentScan("springweb.controller")
    public static class WebAppConfig {
    }
 
 @Configuration
 @ComponentScan("springweb.data")
 public static class RootConfig {
  @Bean
  public DataSource dataSource() {
   DataSource bean = new EmbeddedDatabaseBuilder()
     .setType(EmbeddedDatabaseType.H2)
     .addScript("classpath:schema.sql")
     .build();
   return bean;
  }
 }
}

Новым здесь является то, что мы ввели новый класс RootConfig который будет загружен внутри getRootConfigClasses() . RootConfig — это просто еще одна конфигурация на основе аннотаций Spring, которая создает новый контекст Spring для определений RootConfig . Мы создали бин, который будет запускать базу данных в памяти. Компонент, возвращаемый сборщиком, также удобно реализовал интерфейс javax.sql.DataSource , так что мы можем фактически внедрить его в любой сервис данных и сразу начать его использовать.

Еще одна интересная особенность встроенного построителя базы данных Spring заключается в том, что он также запускает любой сценарий SQL как часть запуска! Для этой демонстрации мы создадим таблицу PING в файле src/main/resources/schema.sql . Этот файл виден Spring как корень CLASSPATH благодаря стандартной исходной структуре Maven.

1
2
3
4
5
CREATE TABLE PING (
  ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
  TAG VARCHAR(1024) NOT NULL,
  TS DATETIME NOT NULL
);

Это настройка источника данных. Теперь обратите внимание, что я не добавил это определение источника данных Spring в существующий класс WebAppConfig . Причина в том, что мы хотим, чтобы отдельный контекст Spring конфигурировал все bean-компоненты уровня обслуживания, сохраняя при этом WebAppConfig для всех bean-компонентов, связанных с MVC Spring (таких как Controller, сопоставление URL-адресов и т. Д.). Это помогает организовать ваши определения bean-компонентов в иерархическом порядке контекста Spring; с RootConfig качестве родительского и WebAppConfig качестве дочерних слоев. Это также означает, что все сервисные компоненты в RootConfig автоматически видны для WebAppConfig ; с целью инъекции и т. д.

Также обратите внимание, что с помощью отдельных классов конфигурации мы можем указать два разных пакета для поиска компонентов службы; мы используем springweb.controller для WebAppConfig и springweb.data для RootConfig . Это важно, и это может избавить вас от некоторых проблем, поскольку Spring автоматически обнаружит все эти компоненты на основе аннотаций.

Создание службы данных

Теперь пришло время использовать JDBC, поэтому давайте напишем класс службы src/main/java/springweb/data/PingService.java файле src/main/java/springweb/data/PingService.java .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package springweb.data;
 
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
 
import javax.sql.DataSource;
import java.util.Date;
import java.util.List;
import java.util.Map;
 
@Repository
public class PingService {
    public static Log LOG = LogFactory.getLog(PingService.class);
 
    private JdbcTemplate jdbcTemplate;
 
    @Autowired
    public void setDataSource(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }
 
    public void insert(String tag) {
        LOG.info("Inserting Ping tag: " + tag);
        jdbcTemplate.update("INSERT INTO PING(TAG, TS) VALUES(?, ?)", tag, new Date());
    }
 
    public List<Map<String, Object>> findAllPings() {
        return jdbcTemplate.queryForList("SELECT * FROM PING ORDER BY TS");
    }
}

Сервис очень прост. Я выставляю два метода: один для вставки и один для извлечения всех данных Ping. Заметил, что я использовал @Repository чтобы указать Spring, что этот класс является компонентной службой, которая выполняет службу данных. Также обратите внимание, как мы внедряем DataSource с помощью метода setter, а затем JdbcTemplate экземпляр JdbcTemplate качестве поля члена. Исходя из этого, мы можем в полной мере использовать API Spring JDBC для запросов и обновлений.

Примечание о регистрации. Само ядро ​​Spring использует Apache common-logging , поэтому я повторно использовал этот API, даже не pom.xml их явно в моем pom.xml . Если вы хотите увидеть больше подробностей из вывода журнала, вы должны добавить реализацию log4j logger в проект, и она должна работать автоматически. Я оставлю это как ваше упражнение.

Далее нам нужно написать контроллер, который может переносить данные на страницу веб-интерфейса. Мы создадим это в файле src/main/java/springweb/controller/PingController.java .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package springweb.controller;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import springweb.data.PingService;
 
import java.util.List;
import java.util.Map;
 
@Controller
public class PingController {
 
    @Autowired
    private PingService pingService;
 
    @RequestMapping(value="/ping/{tag}", produces="text/plain")
    @ResponseBody
    public String pingTag(@PathVariable("tag") String tag) {
        pingService.insert(tag);
        return "Ping tag '" + tag + "' has been inserted. ";
    }
 
    @RequestMapping(value="/pings", produces="text/plain")
    @ResponseBody
    public String pings() {
        List<Map<String, Object>> result = pingService.findAllPings();
  if (result.size() == 0)
   return "No record found.";
 
        StringBuilder sb = new StringBuilder();
        for (Map<String, Object> row : result) {
            sb.append("Ping" + row).append("\n");
        }
        return sb.toString();
    }
}

В этом контроллере вы можете легко увидеть, что данные Ping выбираются и обновляются через нашу службу данных путем внедрения. Я объявил и сопоставил URL /ping/{tag} чтобы вставить данные Ping в базу данных. Spring имеет очень хорошее отображение синтаксической аннотации, которое может извлечь параметр из вашего URL. Я разрешаю пользователю установить простое слово тега для вставки в качестве записи Ping, чтобы мы могли определить источник в базе данных.

URL-адрес другого обработчика контроллера очень прост; он просто возвращает все записи из таблицы PING.

Для демонстрации я предпочитаю не использовать JSP в качестве представления, а возвращать простой текст непосредственно из контроллера. Spring позволил вам сделать это, добавив @ResponseBody в метод-обработчик. Также обратите внимание, что мы можем указать тип содержимого как text/plain как вывод непосредственно с помощью аннотации.

тестирование

Чтобы увидеть ваш тяжелый труд выше, вам просто нужно запустить плагин Maven tomcat. Предыдущая статья показала вам команду для этого. После того, как вы перезапустите его, вы сможете открыть браузер и использовать эти URL для тестирования.

Программирование

Из этого простого упражнения вы можете быстро увидеть, что Spring MVC дает вам много преимуществ; и очень весело в разработке веб-приложений. Spring, по принципам дизайна, стремится быть дружественным к разработчикам, повышает производительность и ненавязчиво в вашей среде. Это одна из причин, по которой мне так нравится работать. Я надеюсь, вам понравится этот урок и вы пойдете дальше самостоятельно.

Удачного программирования!

Ссылка: Начало работы с Spring JDBC в веб-приложении от нашего партнера по JCG Земьяна Дена в блоге A Programmer’s Journal .