在上一篇文章中,我已经向您展示了如何设置基本的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 {@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class<?>[]{ RootConfig.class };}@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class<?>[]{ WebAppConfig.class };}@Overrideprotected String[] getServletMappings() {return new String[]{ "/" };}@Configuration@EnableWebMvc@ComponentScan("springweb.controller")public static class WebAppConfig {}@Configuration@ComponentScan("springweb.data")public static class RootConfig {@Beanpublic 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;@Autowiredpublic 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 {@Autowiredprivate PingService pingService;@RequestMapping(value="/ping/{tag}", produces="text/plain")@ResponseBodypublic String pingTag(@PathVariable("tag") String tag) {pingService.insert(tag);return "Ping tag '" + tag + "' has been inserted. ";}@RequestMapping(value="/pings", produces="text/plain")@ResponseBodypublic 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进行测试。

  • http:// localhost:8081 / spring-web-annotation / ping / tester1
  • http:// localhost:8081 / spring-web-annotation / ping / tester2
  • http:// localhost:8081 / spring-web-annotation / ping / tester3
  • http:// localhost:8081 / spring-web-annotation / pings

编程编程

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

编程愉快!

参考: A程序员杂志博客上的JCG合作伙伴 Zemian Deng在Web应用程序中使用Spring JDBC入门 。

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

Web应用程序中的Spring JDBC入门相关推荐

  1. Spring Security并发会话控制示例教程–如何限制Java JEE Web应用程序中的用户会话数...

    如果您不知道, Spring安全性可能会限制用户可以拥有的会话数. 如果要开发Web应用程序,尤其是Java JEE中的安全Web应用程序 ,则必须提出与在线银行门户相似的要求,例如, 每个用户一次只 ...

  2. spring_在基于Spring的Web应用程序中使用Http Session

    spring 在基于Spring的Web应用程序中拥有和使用Http会话有多种方法. 这是基于最近项目经验的总结. 方法1 只需在需要的HttpSession中注入即可. @Service publi ...

  3. 如何使用recaptcha_在Spring MVC Web应用程序中使用reCaptcha

    如何使用recaptcha CAPTCHA是一个程序,可以生成人类可以通过但计算机程序" 不能 "通过的测试并对其进行评分. 所采取的策略之一是向用户显示具有扭曲文本的图像,并且用 ...

  4. 在基于Spring的Web应用程序中使用Http Session

    在基于Spring的Web应用程序中拥有和使用Http会话有多种方法. 这是基于最近项目经验的总结. 方法1 只需在需要的HttpSession中注入即可. @Service public class ...

  5. 在Spring MVC Web应用程序中添加社交登录:集成测试

    我已经写了关于为使用Spring Social 1.1.0的应用程序编写单元测试的挑战,并为此提供了一种解决方案 . 尽管单元测试很有价值,但是它并不能真正告诉我们我们的应用程序是否正常运行. 这就是 ...

  6. 在Spring MVC Web应用程序中添加社交登录:单元测试

    Spring Social 1.0具有spring-social-test模块,该模块为测试Connect实现和API绑定提供支持. 该模块已从Spring Social 1.1.0中删除,并由 Sp ...

  7. 在Spring MVC Web应用程序中使用reCaptcha

    CAPTCHA是一种程序,可以生成人类可以通过的测试并对其进行评分,而计算机程序" 不能 "通过. 所采取的策略之一是向用户显示具有扭曲文本的图像,并且用户应在输入区域中书写文本. ...

  8. json日期格式化 java_java_Java Web程序中利用Spring框架返回JSON格式的日期,返回Json时格式化日期Date 第一 - phpStudy...

    Java Web程序中利用Spring框架返回JSON格式的日期 返回Json时格式化日期Date第一步:创建CustomObjectMapper类 /** * 解决SpringMVC使用@Respo ...

  9. Spring Boot Web应用程序中注册 Servlet 的方法实例

    Spring Boot Web应用程序中注册 Servlet 的方法实例 本文实例工程源代码:https://github.com/KotlinSpringBoot/demo1_add_servlet ...

最新文章

  1. 83篇文献-万字总结强化学习之路
  2. 理论与实践中的CNN模型结构,如何引领深度学习热潮
  3. IT技术文章示例(附源码)
  4. 华为V3.4-RIP命令总结
  5. leetcode104. 二叉树的最大深度(dfs)
  6. 标准正态分布_正态分布,正态分布如何变换为标准正态分布
  7. 盘点常用Java排序算法
  8. c语言limits.h_ (limits.h)C ++中(整数类型的大小)的宏常量
  9. 清除服务器上传队列的文件,webUploader上传demo
  10. 简述传统动画跟计算机动画的异同点,Flash动画设计与传统动画设计的特点比较研究...
  11. c语言不通包里的函数,C语言中实现不同函数间jump的方法 -电脑资料
  12. 机器学习项目中使用统计学方法的十个例子
  13. OpenKG祝大家端午安康
  14. .net core系列源码地址介绍
  15. JS 三级联动之 省市县。
  16. php在线拼图游戏,js+html5实现可在手机上玩的拼图游戏_javascript技巧
  17. 2020最新手机百度云不限速教程,下载速度10M/S,比会员还快
  18. Webots学习笔记(四)---舵轮模型
  19. web渗透(asp数字型注入模拟实战)
  20. Java面试题基础系列

热门文章

  1. phone6s home键按不动了怎么办 苹果6s home键按不动解决方法
  2. 16-就业课(2.1)-应用容器-Docker
  3. 不同范数下的余弦定理_第06题 | 从源头追溯「余弦定理」amp; 文理科知识点的异同...
  4. python简单爬虫课题_VS2019python爬虫入门
  5. 高特权级代码段转向低特权级代码段(利用 ret(retf) 指令实现 jmp from ring0 to ring3)
  6. jep290涉及jdk版本_JDK 13中的JEP 355文本块
  7. 谷歌gcp 远程计算机_引导性GCP:带有Google Cloud Pub / Sub的Spring Cloud Stream
  8. eclipse clean_Clean Sheet – Windows 10的人体工程学Eclipse主题
  9. gui jfr_Java飞行记录器(JFR)
  10. jClarity:在Azure上升级到Java