它是spring框架中提供的一个对象,是对原始繁琐的jdbc API对象的简单封装。spring框架为我们提供了很多的操作模板类。例如:操作关系型数据的Jdbc Template和Hibernate Template,操作Nosql数据库的Redis Template,操作消息队列的Jms 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
表和实体
@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);
}
}
我们可以将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);
}
@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);
}
}
Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。
将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(Interceptor Chain)。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。拦截器也是AOP思想的具体实现。
区别 | 过滤器(Filter) | 拦截器(Interceptor) |
---|---|---|
使用范围 | 是servlet规范中的一部分,任何Javaweb工程都可以使用 | 是springmvc框架自己的,只有使用了springmvc框架的工程才能使用 |
拦截范围 | 在url-pattern中配置了/*之后,可以对所有要访问的资源拦截 | 在 |
自定义拦截器:
①创建拦截器类实现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
同上,再编写一个MyInterceptor2操作,测试执行顺序。
拦截器方法说明:
方法名 | 说明 |
---|---|
preHandle() | 方法将在请求处理之前进行调用,该方法的返回值是布尔值Boolean类型的,当它返回为false 时,表示请求结束,后续的Interceptor 和Controller 都不会再执行;当返回值为true 时就会继续调用下一个Interceptor 的preHandle 方法。 |
postHandle() | 该方法是在当前请求进行处理之后被调用,前提是preHandle 方法的返回值为true 时才能被调用,且它会在DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对controller处理之后的ModelAndView对象进行操作。 |
afterHandle() | 该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行,前提是preHandle方法的返回值为true时才被调用。 |