Я показал вам, как настроить основное веб-приложение 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 для тестирования.
- HTTP: // локальный: 8081 / весна веб-аннотаций / пинг / Tester1
- HTTP: // локальный: 8081 / весна веб-аннотаций / пинг / tester2
- HTTP: // локальный: 8081 / весна веб-аннотаций / пинг / Tester3
- HTTP: // локальный: 8081 / весна веб-аннотаций / Пинги
Программирование
Из этого простого упражнения вы можете быстро увидеть, что Spring MVC дает вам много преимуществ; и очень весело в разработке веб-приложений. Spring, по принципам дизайна, стремится быть дружественным к разработчикам, повышает производительность и ненавязчиво в вашей среде. Это одна из причин, по которой мне так нравится работать. Я надеюсь, вам понравится этот урок и вы пойдете дальше самостоятельно.
Удачного программирования!