spring系列之——JDBCTemplate和SpringMVC拦截器

3.6、Spring JDBC Template

3.6.1、JdbcTemplate概述

它是spring框架中提供的一个对象,是对原始繁琐的jdbc API对象的简单封装。spring框架为我们提供了很多的操作模板类。例如:操作关系型数据的Jdbc Template和Hibernate Template,操作Nosql数据库的Redis Template,操作消息队列的Jms Template等等。

3.6.2、Jdbc Template开发步骤

①导入spring-jdbc和spring-tx依赖

②创建数据表和实体

③创建Jdbc Template对象

④执行数据库操作


<dependency>
    <groupId>org.springframeworkgroupId>
        <artifactId>spring-jdbcartifactId>
        <version>5.0.5.RELEASEversion>
    dependency>

<dependency>
    <groupId>org.springframeworkgroupId>
    <artifactId>spring-txartifactId>
    <version>5.0.5.RELEASEversion>
dependency>

创建websites数据库,websites表和实体

spring系列之——JDBCTemplate和SpringMVC拦截器_第1张图片

@Data
@AllArgsConstructor
@NoArgsConstructor
public class website {
    private int id;
    private String name;
    private String url;
    private int alexa;
    private String country;
}
public class JdbcTemplateTest {

    @Test
    public void test1() throws PropertyVetoException {

        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/websites");
        //&serverTimezone=GMT%2B8&useSSL=false&useUnicode=true&characterEncoding=UTF-8
        dataSource.setUser("root");
        dataSource.setPassword("admin");
        JdbcTemplate jdbcTemplate = new JdbcTemplate();

        jdbcTemplate.setDataSource(dataSource);
        int row = jdbcTemplate.update("insert into websites values (?,?,?,?,?)",7,"百度","https:///www.baidu.com",3,"cn");

        System.out.println(row);


    }
}

3.6.3、spring产生JdbcTmeplate对象

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

 
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
    <property name="driverClass" value="com.mysql.cj.jdbc.Driver">property> 
    <property name="jdbcUrl" value="jdbc:mysql:///websites">property> 
    <property name="user" value="root">property> 
    <property name="password" value="admin">property>
bean>
 
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
    <property name="dataSource" ref="dataSource">property>
bean>
@Test
public void test2(){
    ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
    JdbcTemplate jdbcTemplate = app.getBean(JdbcTemplate.class);
    int update = jdbcTemplate.update("insert into websites values(?,?,?,?,?)", 8, "大耳朵图图", "good-omen.top", 2, "cn");
    System.out.println(update);
}

封装jdbc的四大参数:

创建jdbc.properties文件夹,在applicationContext.xml文件中引入该文件。

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/websites
jdbc.username=root
jdbc.password=admin

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">

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

    
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}">property>
        <property name="jdbcUrl" value="${jdbc.url}">property>
        <property name="user" value="${jdbc.username}">property>
        <property name="password" value="${jdbc.password}">property>
    bean>
    
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource">property>
    bean>

beans>
	@Test
    public void test2(){
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        JdbcTemplate jdbcTemplate = app.getBean(JdbcTemplate.class);
        int update = jdbcTemplate.update("insert into websites values(?,?,?,?,?)", 9, "大耳朵图图", "good-omen.top", 2, "cn");
        System.out.println(update);
    }

spring系列之——JDBCTemplate和SpringMVC拦截器_第2张图片

3.6.4、JdbcTemplate的常用操作

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class JdbcTemplateCRUDTest {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Test
    public void testUpdate(){

        jdbcTemplate.update("update websites set name = ? where name = ?","图图的学习乐园","大耳朵图图");

    }

    @Test
    public void testDelete(){
        jdbcTemplate.update("delete from account where name=?","图图的学习乐园");
    }

    @Test
    public void testQueryAll(){
        List<Website> websites = jdbcTemplate.query("select * from website", new BeanPropertyRowMapper<Website>(Website.class));
        for (Website website : websites) {
            System.out.println(website.toString());
        }
    }

    @Test
    //测试查询单个对象操作
    public void testQueryOne(){
        Website website = jdbcTemplate.queryForObject("select * from Website where name=?", new BeanPropertyRowMapper<Website>(Website.class), "百度");
        System.out.println(website.getName());
    }
    @Test
    //测试查询单个简单数据操作(聚合查询)
    public void testQueryCount(){
        Long aLong = jdbcTemplate.queryForObject("select count(*) from Website", Long.class);
        System.out.println(aLong);
    }

}

3.7、SpringMVC拦截器

3.7.1、拦截器(interceptor)的作用

Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理后处理

将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(Interceptor Chain)。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。拦截器也是AOP思想的具体实现。

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

3.7.2、拦截器快速入门

自定义拦截器:

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

②配置拦截器

③测试拦截器的拦截效果

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @Author tutu
 * @Date 2021/11/6
 * @Version 1.0
 */
public class MyInterceptor1 implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        System.out.println("preHandle running...");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

        System.out.println("postHandle...");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

        System.out.println("afterCompletion...");
    }
}

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.spongebob.config.MyInterceptor1"/>
    mvc:interceptor>
mvc:interceptors>
@RequestMapping("quick24")
@ResponseBody
public ModelAndView quickMethod24(){
    System.out.println("目标方法执行...");
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("name","spongebob");
    modelAndView.setViewName("index");
    return modelAndView;
}
http://localhost:8080/spring_06_mvc_war_exploded/quick24

spring系列之——JDBCTemplate和SpringMVC拦截器_第3张图片

3.7.3、多拦截器操作

同上,再编写一个MyInterceptor2操作,测试执行顺序。

spring系列之——JDBCTemplate和SpringMVC拦截器_第4张图片

拦截器方法说明:

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

你可能感兴趣的:(spring,java,后端)