0


SpringMVC(三、JDBCTemplate和拦截器)

JDBCTemplate

1 JdbcTemplate概述

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

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

2 JdbcTemplate开发步骤

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

  1. <!--导入spring的jdbc坐标-->
  2. <dependency>
  3. <groupId>org.springframework</groupId>
  4. <artifactId>spring-jdbc</artifactId>
  5. <version>5.0.5.RELEASE</version>
  6. </dependency>
  7. <!--导入spring的tx坐标-->
  8. <dependency>
  9. <groupId>org.springframework</groupId>
  10. <artifactId>spring-tx</artifactId>
  11. <version>5.0.5.RELEASE</version>
  12. </dependency>

② 创建数据库表和实体

  1. public class Account {
  2. private String name;
  3. private double money;
  4. public String getName() {
  5. return name;
  6. }
  7. public void setName(String name) {
  8. this.name = name;
  9. }
  10. public double getMoney() {
  11. return money;
  12. }
  13. public void setMoney(double money) {
  14. this.money = money;
  15. }
  16. @Override
  17. public String toString() {
  18. return "Account{" +
  19. "name='" + name + '\'' +
  20. ", money=" + money +
  21. '}';
  22. }
  23. }

③ 创建JdbcTemplate对象

  1. import com.mchange.v2.c3p0.ComboPooledDataSource;
  2. import org.junit.Test;
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5. import org.springframework.jdbc.core.JdbcTemplate;
  6. import java.beans.PropertyVetoException;
  7. public class JdbcTemplateTest {
  8. @Test
  9. //测试Spring产生jdbcTemplate对象
  10. public void test2() throws PropertyVetoException {
  11. ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
  12. JdbcTemplate jdbcTemplate = app.getBean(JdbcTemplate.class);
  13. int row = jdbcTemplate.update("insert into account values(?,?)", "lisi", 5000);
  14. System.out.println(row);
  15. }
  16. @Test
  17. //测试JdbcTemplate开发步骤
  18. public void test1() throws PropertyVetoException {
  19. //创建数据源对象
  20. ComboPooledDataSource dataSource = new ComboPooledDataSource();
  21. dataSource.setDriverClass("com.mysql.jdbc.Driver");
  22. dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
  23. dataSource.setUser("root");
  24. dataSource.setPassword("root");
  25. JdbcTemplate jdbcTemplate = new JdbcTemplate();
  26. //设置数据源对象 知道数据库在哪
  27. jdbcTemplate.setDataSource(dataSource);
  28. //执行操作
  29. int row = jdbcTemplate.update("insert into account values(?,?)", "tom", 5000);
  30. System.out.println(row);
  31. }
  32. }

④ 执行数据库操作

  1. import org.junit.Test;
  2. import org.junit.runner.RunWith;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.jdbc.core.BeanPropertyRowMapper;
  5. import org.springframework.jdbc.core.JdbcTemplate;
  6. import org.springframework.test.context.ContextConfiguration;
  7. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  8. import java.util.List;
  9. @RunWith(SpringJUnit4ClassRunner.class)
  10. @ContextConfiguration("classpath:applicationContext.xml")
  11. public class JdbcTemplateCRUDTest {
  12. @Autowired
  13. private JdbcTemplate jdbcTemplate;
  14. @Test
  15. public void testQueryCount(){
  16. Long count = jdbcTemplate.queryForObject("select count(*) from account", Long.class);
  17. System.out.println(count);
  18. }
  19. @Test
  20. public void testQueryOne(){
  21. Account account = jdbcTemplate.queryForObject("select * from account where name=?", new BeanPropertyRowMapper<Account>(Account.class), "tom");
  22. System.out.println(account);
  23. }
  24. @Test
  25. public void testQueryAll(){
  26. List<Account> accountList = jdbcTemplate.query("select * from account", new BeanPropertyRowMapper<Account>(Account.class));
  27. System.out.println(accountList);
  28. }
  29. @Test
  30. public void testUpdate(){
  31. jdbcTemplate.update("update account set money=? where name=?",10000,"tom");
  32. }
  33. @Test
  34. public void testDelete(){
  35. jdbcTemplate.update("delete from account where name=?","tom");
  36. }
  37. }

Spring产生JdbcTemplate对象

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

  1. <!--加载jdbc.properties-->
  2. <context:property-placeholder location="classpath:jdbc.properties"/>
  3. <!--数据源对象-->
  4. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  5. <property name="driverClass" value="${jdbc.driver}"/>
  6. <property name="jdbcUrl" value="${jdbc.url}"/>
  7. <property name="user" value="${jdbc.username}"/>
  8. <property name="password" value="${jdbc.password}"/>
  9. </bean>
  10. <!--jdbc模板对象-->
  11. <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  12. <property name="dataSource" ref="dataSource"/>
  13. </bean>
  1. jdbc.driver=com.mysql.jdbc.Driver
  2. jdbc.url=jdbc:mysql://localhost:3306/test
  3. jdbc.username=root
  4. jdbc.password=root

拦截器

1 拦截器的作用

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

2 拦截器和过滤器区别

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

3 拦截器是快速入门

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

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

  1. import org.springframework.web.servlet.HandlerInterceptor;
  2. import org.springframework.web.servlet.ModelAndView;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.io.IOException;
  7. public class MyInterceptor1 implements HandlerInterceptor {
  8. //在目标方法执行之前 执行
  9. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
  10. System.out.println("preHandle.....");
  11. String param = request.getParameter("param");
  12. if("yes".equals(param)){
  13. return true;
  14. }else{
  15. request.getRequestDispatcher("/error.jsp").forward(request,response);
  16. return false;//返回true代表放行 返回false代表不放行
  17. }
  18. }
  19. //在目标方法执行之后 视图对象返回之前执行
  20. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
  21. modelAndView.addObject("name","itheima");
  22. System.out.println("postHandle...");
  23. }
  24. //在流程都执行完毕后 执行
  25. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
  26. System.out.println("afterCompletion....");
  27. }
  28. }

② 配置拦截器

  1. <!--配置拦截器-->
  2. <mvc:interceptors>
  3. <mvc:interceptor>
  4. <!--对哪些资源执行拦截操作-->
  5. <mvc:mapping path="/**"/>
  6. <bean class="com.xmp.interceptor.MyInterceptor1"/>
  7. </mvc:interceptor>
  8. </mvc:interceptors>

③ 测试拦截器的拦截效果

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

4 多拦截器操作

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

  1. import org.springframework.web.servlet.HandlerInterceptor;
  2. import org.springframework.web.servlet.ModelAndView;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.io.IOException;
  7. public class MyInterceptor2 implements HandlerInterceptor {
  8. //在目标方法执行之前 执行
  9. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
  10. System.out.println("preHandle22222.....");
  11. return true;
  12. }
  13. //在目标方法执行之后 视图对象返回之前执行
  14. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
  15. System.out.println("postHandle2222...");
  16. }
  17. //在流程都执行完毕后 执行
  18. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
  19. System.out.println("afterCompletion2222....");
  20. }
  21. }
  1. <!--配置拦截器-->
  2. <mvc:interceptors>
  3. <mvc:interceptor>
  4. <!--对哪些资源执行拦截操作-->
  5. <mvc:mapping path="/**"/>
  6. <bean class="com.xmp.interceptor.MyInterceptor2"/>
  7. </mvc:interceptor>
  8. <mvc:interceptor>
  9. <!--对哪些资源执行拦截操作-->
  10. <mvc:mapping path="/**"/>
  11. <bean class="com.xmp.interceptor.MyInterceptor1"/>
  12. </mvc:interceptor>
  13. </mvc:interceptors>

5 拦截器方法说明

方法名说明preHandle()方法将在请求处理之前进行调用,该方法的返回值是布尔值Boolean类型的, 当它返回为false 时,表示请求结束,后续的Interceptor 和Controller 都不会 再执行;当返回值为true 时就会继续调用下一个Interceptor 的preHandle方 法postHandle()该方法是在当前请求进行处理之后被调用,前提是preHandle 方法的返回值为 true 时才能被调用,且它会在DispatcherServlet 进行视图返回渲染之前被调 用,所以我们可以在这个方法中对Controller 处理之后的ModelAndView 对象 进行操作afterCompletion()该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图 之后执行,前提是preHandle 方法的返回值为true 时才能被调用

标签: spring java mybatis

本文转载自: https://blog.csdn.net/qq_53463544/article/details/126120716
版权归原作者 大三的土狗 所有, 如有侵权,请联系我们删除。

“SpringMVC(三、JDBCTemplate和拦截器)”的评论:

还没有评论