Web应用程序中的Spring JDBC入门

在上一篇文章中,我已经向您展示了如何设置基本的Spring 3 MVC Web应用程序 。 重复使用该项目设置作为模板,我将向您展示如何增强它以与JDBC一起使用。 有了它,您可以存储和检索数据库中的数据。 我们将通过Spring添加一个新的控制器和一个数据服务,以便您可以看到Spring注入和注释配置如何协同工作。

与完整的ORM(例如Hibernate)相比,基于JDBC的直接应用程序易于安装。 您无需担心AOP,TranactionManager,实体映射和其他配置的完整阵列。 在JDK的java.jdbc API java.jdbc ,Spring附带了spring-jdbc模块,该模块可以通过其众所周知的JdbcTemplate类有效地引导您。 让我们探讨如何将其设置并作为Web应用程序运行。

入门和项目设置

出于演示目的,我将使用H2Database的内存版本作为JDBC存储。 使用和设置都很简单。 而且,如果您决定使用他们的基于FILE或TCP的数据库,则只需重新设置数据源,然后您就可以继续探索更多内容。

我们将从向您现有的spring-web-annotation/pom.xml文件添加新的依赖关系开始。

<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文件,并在下面添加新内容:

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注释的配置,它为bean定义创建了一个新的Spring上下文。 我们在那里创建了一个将运行内存数据库的bean。 构建器返回的bean还方便地实现了javax.sql.DataSource接口,因此我们实际上可以将其注入任何数据服务中并立即开始使用它。

关于Spring嵌入式数据库构建器的另一件事很酷,那就是它在启动过程中还可以运行任何SQL脚本! 对于此演示,我们将在src/main/resources/schema.sql文件中创建一个PING表。 由于Maven标准的源代码结构,该文件对于Spring在CLASSPATH的根目录中是可见的。

CREATE TABLE PING (
  ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
  TAG VARCHAR(1024) NOT NULL,
  TS DATETIME NOT NULL
);

这就是数据源设置。 现在请注意,我没有将此数据源Spring bean定义添加到现有的WebAppConfig类中。 原因是我们希望一个单独的Spring上下文来配置所有服务级别的bean,同时为所有与Spring MVC相关的bean(例如Controller,URL映射等)保留WebAppConfig 。 这有助于按Spring上下文的层次结构组织bean定义。 将RootConfig作为父层,将WebAppConfig作为子层。 这也意味着,在所有的服务组件RootConfig是自动可见WebAppConfig ; 为了注射等目的

还要注意,使用分离的配置类,我们可以指定两个不同的程序包来扫描服务组件; 我们将springweb.controller用于WebAppConfig ,将springweb.data用于RootConfig 。 这很重要,它可以为您省去一些麻烦,让Spring自动检测所有这些基于注释的组件。

创建数据服务

现在是时候使用JDBC了,让我们在src/main/java/springweb/data/PingService.java文件下编写一个数据服务类。

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指示该类是执行数据服务的组件服务。 还要注意我们如何使用setter方法注入DataSource ,然后将JdbcTemplate实例化为成员字段。 由此,我们可以充分利用Spring JDBC API进行查询和更新。

关于日志的注释。 Spring核心本身使用Apache common-logging ,因此我重用了该API,甚至没有在我的pom.xml明确声明它们。 如果要从日志输出中查看更多详细信息,则应将log4j logger实施添加到项目中,并且它应会自动运行。 我将把它留作您的锻炼。

接下来,我们将需要编写一个Controller来将数据带到Web UI页面。 我们将在src/main/java/springweb/controller/PingController.java文件下创建此文件。

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记录插入,以便我们可以识别数据库中的源。

另一个控制器处理程序/pings URL非常简单; 它只是返回PING表中的所有记录。

出于演示目的,我选择不使用JSP作为视图,而是直接从Controller返回纯文本。 Spring通过在处理程序方法中添加@ResponseBody来实现此@ResponseBody 。 还要注意,我们可以直接使用注释将内容类型指定为text/plain作为输出。

测试中

要查看上面的内容,您只需要运行Maven tomcat插件即可。 上一篇文章向您显示了执行此操作的命令。 重新启动后,您应该可以打开浏览器并使用这些URL进行测试。

编程编程

从这个简单的练习中,您可以快速看到Spring MVC为您带来许多好处。 并在开发Web应用程序中带来很多乐趣。 根据设计原则,Spring倾向于对开发人员友好,可以提高生产力,并且不会干扰您的环境。 这是我喜欢使用它的原因之一。 希望您喜欢本教程,并自己进一步进行探索。

编程愉快!


翻译自: https://www.javacodegeeks.com/2013/10/getting-started-with-spring-jdbc-in-a-web-application.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值