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 {@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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366350.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python pyplot中axis_Python Pyplot xaxis未显示在图形上

pyplot未在图形上显示x轴&#xff1a;import pandas as pdimport matplotlib.pyplot as pltdf pd.read_csv(sitka_weather_2014.csv)df[AKST] pd.to_datetime(df.AKST)df[Dates] df[AKST].dt.strftime(%b %d, %Y)df.set_index("Dates", inplace True)# Plot Dataf…

为什么dubbo的调用重试不建议设置成超过1

前面提到过&#xff0c;重试是靠ClusterInvoker来保证的&#xff0c;不同的Cluster在调用失败的时候 做不同处理 比如默认的FailoverClusterInvoke的doInvoke方法里面&#xff1a;int len getUrl().getMethodParameter(invocation.getMethodName(), Constants.RETRIES_KEY, Co…

web前端入门学习(纯干货)

web前端怎么样才能入门&#xff0c;首先我们要从什么是初级web前端工程师说起&#xff1a; 按照我的想法&#xff0c;我把前端工程师分为了入门、初级、中级、高级这四个级别&#xff0c; 入门级别指的是了解什么是前端&#xff08;前端到底是什么其实很多人还是不清楚的&…

用BlockingExecutor限制任务提交

JDK的java.util.concurrent.ThreadPoolExecutor允许您将任务提交到线程池&#xff0c;并使用BlockingQueue来保存提交的任务。 如果您要提交数千个任务&#xff0c;请指定一个“绑定”队列&#xff08;即最大容量的队列&#xff09;&#xff0c;否则JVM可能会耗尽内存。 您可以…

[校内模拟题2]

水题 但是原地螺旋炸裂 都不好意思贴代码了QWQ enc 【问题背景】 zhx 和他的妹子聊天。 【问题描述】 考虑一种简单的加密算法。假定所有句子都由小写英文字母构成&#xff0c; 对于每一个字母&#xff0c; 我们将它唯一地映射到另一个字母。 例如考虑映射规则&#xff1a;a-&g…

AJAX初识(原生JS版AJAX和Jquery版AJAX)

一、什么是JSON 1.介绍JSON独立于语言&#xff0c;是一种与语言无关的数据格式。JSON指的是JavaScript对象表示法&#xff08;JavaScript Object Notation&#xff09;JSON是轻量级的文本数据交换格式JSON具有自我描述性&#xff0c;更易理解JSON使用JavaScript语法来描述数据对…

python保存为xlsb_Read XLSB File in Pandas Python

问题There are many questions on this, but there has been no simple answer on how to read an xlsb file into pandas. Is there an easy way to do this?回答1:Hi actually there is a way. Just use pyxlsb library.import pandas as pdfrom pyxlsb import open_workboo…

内存不足而没有OutOfMemoryError

这实际上是最初发布于2010年的帖子的转世。 昨天&#xff0c;当听到我们的工程师咒骂一个特别令人讨厌的错误时&#xff0c;闪回发生了。 当诅咒停止时&#xff0c;我走过去核实我的怀疑。 瞧&#xff0c;我是正确的–情绪波动是由应用程序用尽了堆空间导致的&#xff0c;但死于…

人工智能第二星期总结-------纵里寻它千百度

2018-07-28 第二周&#xff1a; 此时此刻我怀着无比沉重的心情在这里做一周的学习检讨工作 这星期依此就开始讲到了函数&#xff0c;话说函数可是python里面的钟头戏&#xff0c;不仅可以节约代码&#xff0c;还可以把代码重复使用&#xff0c;只要后面轻轻松松就可以搞定啦&am…

个人作业——软件产品案例分析

个人作业——软件产品案例分析 第一部分 调研&#xff0c;评测 评测&#xff1a; 第一次上手体验 第一眼看上去功能很全面&#xff0c;但是到点开来发现功能大部分没有实现&#xff0c;体验不太好。 缺陷Bug情况 课表查询 bug描述&#xff1a;课表查询没有课表结果,点进去当前周…

java hashtable put_Java Hashtable put()方法与示例

哈希表类put()方法put()方法在java.util包中可用。put()方法用于将给定的键元素(key_ele)放入给定的值元素(val_ele)。put()方法是一个非静态方法&#xff0c;只能通过类对象访问&#xff0c;如果尝试使用类名访问该方法&#xff0c;则会收到错误消息。put()方法在放置键/值对时…

HTML之表单

表单&#xff1a; 表单是一个包含表单元素的区域。 表单元素是允许用户在表单中输入内容,比如&#xff1a;文本域(textarea)、下拉列表、单选框(radio-buttons)、复选框(checkboxes)等等。 表单使用表单标签 <form> 来设置: <form> . input 元素 . </form>…

将AspectJ与NetBeans平台开发集成

您是否正在使用NetBeans平台开发项目&#xff1f; 您愿意使用AspectJ来使用AOP吗&#xff1f; 您不知道如何将AspectJ编译器集成到NetBeans的内部版本中&#xff1f; 如果您的回答是“是”&#xff0c;则此帖子适合您。 我决定写这篇技术文章&#xff0c;是因为我在寻找该解决…

Linux CentOS 6.5 使用自带jdk修改环境变量

来源:https://www.cnblogs.com/zhenxiqia/p/9049290.html Linux CentOS 6.5 使用自带jdk修改环境变量 首先声明&#xff0c;默认jdk指我们安装完CentOS后系统自带jdk&#xff0c;自己下载安装的jdk只需要下载&#xff0c;解压即可&#xff0c;之后步骤与此文一致 1.查看我们默认…

第二阶段冲刺10

基本的代码已经编写完成&#xff0c;游戏的功能已经完善&#xff0c;基本上已经是一个合格的软件了&#xff0c;这次为期10天的冲刺很充实&#xff0c;我们切实的完善了软件&#xff0c;学会了很多&#xff0c;也可以更好的融入团队中了。团结就是力量&#xff0c;十天前我们还…

java如何找重复数字_Java如何找出数组中重复的数字

题目描述&#xff1a;找出数组中重复的数字&#xff0c;具体内容如下在一个长度为n的数组里的所有数字都在 0~n-1的范围内。数组中某些数字是重复的&#xff0c;但不知道有几个数字是重复的&#xff0c;也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如&…

页面中添加锚点的几种方式

本文档创建时间:2018-11-7 15:52:28 方法一,使用a标签添加 通过设置a标签的href属性,跳转到页面中指定id标签的位置a标签的href属性值前要增加#来作为标识,表示是在当前页面的内部跳转 简单的案例: 1 <html>2 <head></head>3 <body>4 <!--设置锚点…

休眠事实:有利于双向集vs列表

Hibernate是一个很棒的ORM工具&#xff0c;它极大地简化了开发&#xff0c;但是如果您想正确地使用它&#xff0c;则有很多陷阱。 在大中型项目中&#xff0c;具有双向父子关联非常常见&#xff0c;这使我们能够浏览给定关系的两端。 在控制关联的持久/合并部分时&#xff0c…

ue正则

1 删除含某些内容的行,例:含有PTTAddress 使用替换功能&#xff0c;勾选正则表达式(Regular Expressions)&#xff0c;查找为%*PTTAddress*^p&#xff0c;替换为空 2.替换大写字母为_大写字母 替换功能&#xff0c;查找为 ^([A-Z]^)&#xff0c;替换为 _^1转载于:https://www.c…

20 存储过程

一、存储过程的定义 存储过程是存储在数据库目录中的一坨的声明性SQL语句。 Java&#xff0c;Python&#xff0c;PHP等应用程序可以调用存储过程。 MySQL是最受欢迎的开源RDBMS&#xff0c;被社区和企业广泛使用。 然而&#xff0c;在它发布的第一个十年期间&#xff0c;它不支…