SpringMVC(三、JDBCTemplate)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: Spring框架对JDBC进行封装,使用JdbcTemplate方便实现对数据库操作。Spring MVC 的拦截器(interceptor)类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。 将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(Interceptor Chain)。在访问被拦截的方 法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。拦截器也是AOP思想的具体实现。

JDBCTemplate

1、JdbcTemplate概述

     什么是 JdbcTemplate(Template)译为模板?


     Spring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作。它是spring框架中提供的一个对象,是对原始繁琐的Jdbc API对象的简单封装。spring框架为我们提供了很多的操作 模板类。例如:操作关系型数据的JdbcTemplate和HibernateTemplate,操作nosql数据库的RedisTemplate,操 作消息队列的JmsTemplate等等。


2、JdbcTemplate开发步骤


① 导入spring-jdbc和spring-tx坐标

<!--导入spring的jdbc坐标--><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.0.5.RELEASE</version></dependency><!--导入spring的tx坐标--><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.0.5.RELEASE</version></dependency>


② 创建数据库表和实体

publicclassAccount {
privateStringname;
privatedoublemoney;
publicStringgetName() {
returnname;
    }
publicvoidsetName(Stringname) {
this.name=name;
    }
publicdoublegetMoney() {
returnmoney;
    }
publicvoidsetMoney(doublemoney) {
this.money=money;
    }
@OverridepublicStringtoString() {
return"Account{"+"name='"+name+'\''+", money="+money+'}';
    }
}


③ 创建JdbcTemplate对象


importcom.mchange.v2.c3p0.ComboPooledDataSource;
importorg.junit.Test;
importorg.springframework.context.ApplicationContext;
importorg.springframework.context.support.ClassPathXmlApplicationContext;
importorg.springframework.jdbc.core.JdbcTemplate;
importjava.beans.PropertyVetoException;
publicclassJdbcTemplateTest {
@Test//测试Spring产生jdbcTemplate对象publicvoidtest2() throwsPropertyVetoException {
ApplicationContextapp=newClassPathXmlApplicationContext("applicationContext.xml");
JdbcTemplatejdbcTemplate=app.getBean(JdbcTemplate.class);
introw=jdbcTemplate.update("insert into account values(?,?)", "lisi", 5000);
System.out.println(row);
    }
@Test//测试JdbcTemplate开发步骤publicvoidtest1() throwsPropertyVetoException {
//创建数据源对象ComboPooledDataSourcedataSource=newComboPooledDataSource();
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
dataSource.setUser("root");
dataSource.setPassword("root");
JdbcTemplatejdbcTemplate=newJdbcTemplate();
//设置数据源对象  知道数据库在哪jdbcTemplate.setDataSource(dataSource);
//执行操作introw=jdbcTemplate.update("insert into account values(?,?)", "tom", 5000);
System.out.println(row);
    }
}


④ 执行数据库操作


importorg.junit.Test;
importorg.junit.runner.RunWith;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.jdbc.core.BeanPropertyRowMapper;
importorg.springframework.jdbc.core.JdbcTemplate;
importorg.springframework.test.context.ContextConfiguration;
importorg.springframework.test.context.junit4.SpringJUnit4ClassRunner;
importjava.util.List;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
publicclassJdbcTemplateCRUDTest {
@AutowiredprivateJdbcTemplatejdbcTemplate;
@TestpublicvoidtestQueryCount(){
Longcount=jdbcTemplate.queryForObject("select count(*) from account", Long.class);
System.out.println(count);
    }
@TestpublicvoidtestQueryOne(){
Accountaccount=jdbcTemplate.queryForObject("select * from account where name=?", newBeanPropertyRowMapper<Account>(Account.class), "tom");
System.out.println(account);
    }
@TestpublicvoidtestQueryAll(){
List<Account>accountList=jdbcTemplate.query("select * from account", newBeanPropertyRowMapper<Account>(Account.class));
System.out.println(accountList);
    }
@TestpublicvoidtestUpdate(){
jdbcTemplate.update("update account set money=? where name=?",10000,"tom");
    }
@TestpublicvoidtestDelete(){
jdbcTemplate.update("delete from account where name=?","tom");
    }
}


Spring产生JdbcTemplate对象


     我们可以将JdbcTemplate的创建权交给Spring,将数据源DataSource的创建权也交给Spring,在Spring容器内部将 数据源DataSource注入到JdbcTemplate模版对象中,配置如下:


 <!--加载jdbc.properties-->

   <context:property-placeholder location="classpath:jdbc.properties"/>


  <!--数据源对象-->

   <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

       <property name="driverClass" value="${jdbc.driver}"/>

       <property name="jdbcUrl" value="${jdbc.url}"/>

       <property name="user" value="${jdbc.username}"/>

       <property name="password" value="${jdbc.password}"/>

   </bean>


  <!--jdbc模板对象-->

   <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">

       <property name="dataSource" ref="dataSource"/>

   </bean>


jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/testjdbc.username=rootjdbc.password=root


拦截器

1、拦截器的作用


  Spring MVC 的拦截器(interceptor)类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。 将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(Interceptor Chain)。在访问被拦截的方 法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。拦截器也是AOP思想的具体实现。


2、拦截器和过滤器区别



区别 过滤器(Filter) 拦截器(Interceptor)
使用范围 是 servlet 规范中的一部分,任何 Java Web 工程都可以使用 是 SpringMVC 框架自己的,只有使用了 SpringMVC 框架的工程才能用
拦截范围 在 url-pattern 中配置了/*之后, 可以对所有要访问的资源拦截 在中配置了/**之 后,也可以多所有资源进行拦截,但是可以通 过标签 排除不需要拦截的资源


3、拦截器是快速入门


自定义拦截器很简单,只有如下三步:


① 创建拦截器类实现HandlerInterceptor接口


importorg.springframework.web.servlet.HandlerInterceptor;
importorg.springframework.web.servlet.ModelAndView;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjava.io.IOException;
publicclassMyInterceptor1implementsHandlerInterceptor {
//在目标方法执行之前 执行publicbooleanpreHandle(HttpServletRequestrequest, HttpServletResponseresponse, Objecthandler) throwsServletException, IOException {
System.out.println("preHandle.....");
Stringparam=request.getParameter("param");
if("yes".equals(param)){
returntrue;
        }else{
request.getRequestDispatcher("/error.jsp").forward(request,response);
returnfalse;//返回true代表放行  返回false代表不放行        }
    }
//在目标方法执行之后 视图对象返回之前执行publicvoidpostHandle(HttpServletRequestrequest, HttpServletResponseresponse, Objecthandler, ModelAndViewmodelAndView) {
modelAndView.addObject("name","itheima");
System.out.println("postHandle...");
    }
//在流程都执行完毕后 执行publicvoidafterCompletion(HttpServletRequestrequest, HttpServletResponseresponse, Objecthandler, Exceptionex) {
System.out.println("afterCompletion....");
    }
}


② 配置拦截器


 <!--配置拦截器-->

   <mvc:interceptors>

       <mvc:interceptor>

           <!--对哪些资源执行拦截操作-->

           <mvc:mapping path="/**"/>

           <bean class="com.xmp.interceptor.MyInterceptor1"/>

       </mvc:interceptor>

   </mvc:interceptors>


③ 测试拦截器的拦截效果


测试再访问时实现被拦截效果


4、多拦截器操作


同上,在编写一个MyHandlerInterceptor2操作,测试执行顺序


importorg.springframework.web.servlet.HandlerInterceptor;
importorg.springframework.web.servlet.ModelAndView;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjava.io.IOException;
publicclassMyInterceptor2implementsHandlerInterceptor {
//在目标方法执行之前 执行publicbooleanpreHandle(HttpServletRequestrequest, HttpServletResponseresponse, Objecthandler) throwsServletException, IOException {
System.out.println("preHandle22222.....");
returntrue;
    }
//在目标方法执行之后 视图对象返回之前执行publicvoidpostHandle(HttpServletRequestrequest, HttpServletResponseresponse, Objecthandler, ModelAndViewmodelAndView) {
System.out.println("postHandle2222...");
    }
//在流程都执行完毕后 执行publicvoidafterCompletion(HttpServletRequestrequest, HttpServletResponseresponse, Objecthandler, Exceptionex) {
System.out.println("afterCompletion2222....");
    }
}

<!--配置拦截器-->

   <mvc:interceptors>

       <mvc:interceptor>

           <!--对哪些资源执行拦截操作-->

           <mvc:mapping path="/**"/>

           <bean class="com.xmp.interceptor.MyInterceptor2"/>

       </mvc:interceptor>

       <mvc:interceptor>

           <!--对哪些资源执行拦截操作-->

           <mvc:mapping path="/**"/>

           <bean class="com.xmp.interceptor.MyInterceptor1"/>

       </mvc:interceptor>

   </mvc:interceptors>


5、拦截器方法说明


方法名 说明
preHandle() 方法将在请求处理之前进行调用,该方法的返回值是布尔值Boolean类型的, 当它返回为false 时,表示请求结束,后续的Interceptor 和Controller 都不会 再执行;当返回值为true 时就会继续调用下一个Interceptor 的preHandle方 法
postHandle() 该方法是在当前请求进行处理之后被调用,前提是preHandle 方法的返回值为 true 时才能被调用,且它会在DispatcherServlet 进行视图返回渲染之前被调 用,所以我们可以在这个方法中对Controller 处理之后的ModelAndView 对象 进行操作
afterCompletion() 该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图 之后执行,前提是preHandle 方法的返回值为true 时才能被调用
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
Java 数据库 Spring
【SSM面向CRUD编程专栏 6】springMVC拦截器、异常处理 jdbcTemplate(二)
【SSM面向CRUD编程专栏 6】springMVC拦截器、异常处理 jdbcTemplate(二)
292 0
【SSM面向CRUD编程专栏 6】springMVC拦截器、异常处理 jdbcTemplate(二)
|
前端开发 Java Spring
【SSM面向CRUD编程专栏 6】springMVC拦截器、异常处理 jdbcTemplate(一)
【SSM面向CRUD编程专栏 6】springMVC拦截器、异常处理 jdbcTemplate(一)
166 0
【SSM面向CRUD编程专栏 6】springMVC拦截器、异常处理 jdbcTemplate(一)
|
前端开发 Java 数据库连接
|
SQL 前端开发 Java
(可以跑通的,有数据库的,mchange+ aop )springmvc+jdbctemplate+mchange+multidatasource
   基于 上篇文章  mybatis +springmvc+ mchange+multidatasource 没有跑通 , 一直没有找到 问题所在,现在 用 jdbctemplate 是可以跑通的 ,,,,           (可以跑通的,有数据库的,mchange+...
800 0
|
6月前
|
设计模式 前端开发 JavaScript
Spring MVC(一)【什么是Spring MVC】
Spring MVC(一)【什么是Spring MVC】
|
5月前
|
设计模式 前端开发 Java
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
75 1
|
5月前
|
前端开发 Java 应用服务中间件
Spring框架第六章(SpringMVC概括及基于JDK21与Tomcat10创建SpringMVC程序)
Spring框架第六章(SpringMVC概括及基于JDK21与Tomcat10创建SpringMVC程序)
|
5月前
|
XML Java 数据格式
SpringMVC的XML配置解析-spring18
SpringMVC的XML配置解析-spring18
|
5月前
|
应用服务中间件
从代码角度戳一下springMVC的运行过程-spring16
从代码角度戳一下springMVC的运行过程-spring16
|
6月前
|
前端开发 Java 关系型数据库
基于ssm框架旅游网旅游社交平台前后台管理系统(spring+springmvc+mybatis+maven+tomcat+html)
基于ssm框架旅游网旅游社交平台前后台管理系统(spring+springmvc+mybatis+maven+tomcat+html)