一,拦截器
–1,概述
让程序员更关注业务代码,事务的处理/性能监测的代码 ,不必关心直接让拦截器配置就 可以了.
–2,步骤
–implements HandlerInterceptor
–方法执行前就调用的preHandle
–方法执行后就调用的postHandle
–方法都执行完后就调用的afterCompletion
–代码
package cn.tedu.controller;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//自定义拦截器:把业务代码和业务无关的代码分开
@Component //交给spring进行ioc
public class MyInterceptor implements HandlerInterceptor {
long start;
@Override //在正式调用自己的方法前,都会先触发preHandle
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
start = System.currentTimeMillis() ;//计时开始
System.out.println("开始准备执行功能~~");
return true;//放行,继续执行后面的功能
}
@Override //在调用自己的结束后,触发postHandle
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
long end = System.currentTimeMillis() ;//计时结束
System.out.println("方法执行完了,耗时: "+(end-start)+"ms");
}
@Override //都干完了
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("资源已被释放...");
}
}
--implements WebMvcConfigurer
--添加自定义的拦截器addInterceptors
--代码
package cn.tedu.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
//把自定义的拦截器,配置在容器中
@Configuration
public class MyConfig implements WebMvcConfigurer {
@Autowired //spring提供的注解,用来完成di--自动装配
private MyInterceptor my;
//重写接口里的方法,添加自定义拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(my);
}
}
--测试
加拦截器前,只执行了业务代码
加拦截器后,在执行业务代码的前后加了一段特定的业务
拦截器的代码,不影响测试http://localhost:8080/car/get
package cn.tedu.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/car")
public class CarController {
@RequestMapping("/save")
public void save(){
System.out.println("save方法正在执行");
}
@RequestMapping("/get")
public void get(){
for (int i = 0; i <1000 ; i++) {
System.out.print("get方法正在执行");
}
System.out.println();
}
}
--效果
开始准备执行功能~~
get方法正在执行get方法正在执行get方法正在执行
方法执行完了,耗时: 38ms
资源已被释放...
二,MVC项目
–1,概述
就是实现MVC三层代码间松耦合
Controller -> Service -> Dao
CarController CarService
CarServiceImpl
Car Car
–2,创建Car类
package cn.tedu.pojo;
import org.springframework.stereotype.Component;
@Component //spring 框架提供的,用来ioc
public class Car {
//作为Model这层,只是提供一些属性,提供set /get /toString /constructor…
private String name;
private String color;
private double price;
public Car() { }
public Car(String name, String color, double price) {
this.name = name;
this.color = color;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Car{" +
"name='" + name + '\'' +
", color='" + color + '\'' +
", price=" + price +
'}';
}
}
--3,创建CarService接口
package cn.tedu.service;
import cn.tedu.pojo.Car;
//这个类用来实现MVC里的C层的优化
public interface CarService {
//接口里的方法都是抽象方法,而且都是public的
//会为简写的方法自动拼接public abstract
Car get();
}
--4,创建CarServiceImpl实现类
package cn.tedu.service;
import cn.tedu.pojo.Car;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
//实现了接口以后,要重写接口里的抽象方法
@Service //和@Component注解作用一样,都是为了让spring进行ioc
public class CarServiceImpl implements CarService {
@Override
public Car get() {
Car c = new Car();
c.setName("保时捷");
c.setColor("红色");
c.setPrice(641000.9);
return c;
}
}
--5,创建CarController类
package cn.tedu.controller;
import cn.tedu.pojo.Car;
import cn.tedu.service.CarService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController //接受请求做出响应
@RequestMapping("/car2") //指定url和controller的mapping规则
public class CarController2 {
//想在Controller调用Service的功能,直接DI就可以了
@Autowired
private CarService carService;
@RequestMapping("/get")
public Car get(){
return carService.get();
}
}
--6,测试
访问url: http://localhost:8080/car2/get
得到: {"name":"保时捷","color":"红色","price":641000.9}
--7,MVC调用流程
请求的过程:从浏览器的地址栏敲了回车之后,直接访问了Controller层,Controller层会调用Service层,获取数据
响应的过程:把Service层return的数据返回给Controller层,Controller层再return给了浏览器展示
三,MyBatis框架
–1,概述
是用来操作数据库的框架,是一个优秀的持久层框架
简化了JDBC的开发步骤,自动完成ORM映射(类里的属性值 和 表里的字段值 自动映射)
–2,核心组件
–mybatis-config.xml 是mybatis的核心配置文件,用来配置事务,数据库的连接信息
–UserMapper.xml 是用来存储操作User表的大量的SQL
–SqlSessionFactory 是会话工厂,创建会话
–SqlSession 是会话,用来执行SQL(select()/insert()…)
–3,需求
利用Mybatis框架查询user表里的数据
–4,开发步骤
–准备数据库,准备表,和表里的记录
–添加mybatis的依赖jar包
–创建mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- mybatis的核心配置文件 配置了数据源,事务,... -->
<configuration>
<environments default="test">
<environment id="test">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<!--数据库的驱动-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!--数据库的url-->
<property name="url" value="jdbc:mysql://localhost:3306/mybatisdb?characterEncoding=utf8&serverTimezone=Asia/Shanghai" />
<!--数据库的用户名-->
<property name="username" value="root"/>
<!--数据库的密码-->
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
</configuration>
--创建User类
package cn.tedu.mybatis;
//用来 封装User表里返回的数据
public class User {
private int id;
private String name;
private String addr;
private int age;
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", addr='" + addr + '\'' +
", age=" + age +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
--创建UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 是mybatis框架用来写SQL语句的文件,namespace用来作为文件的唯一标识-->
<mapper namespace="userMapperNS">
<!--select用来表示要执行查询语句,
id属性是当前SQL的唯一标识.
resultType属性用来完成ORM映射,把查到的结果和指定类里的属性映射值
-->
<select id="getAll" resultType="cn.tedu.mybatis.User">
select * from user
</select>
</mapper>
--修改核心配置文件mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- mybatis的核心配置文件 配置了数据源,事务,Mapper.xml映射文件 -->
<configuration>
<environments default="test">
<environment id="test">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<!--数据库的驱动-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!--数据库的url-->
<property name="url" value="jdbc:mysql://localhost:3306/mybatisdb?characterEncoding=utf8&serverTimezone=Asia/Shanghai" />
<!--数据库的用户名-->
<property name="username" value="root"/>
<!--数据库的密码-->
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--引入UserMapper.xml文件-->
<mappers>
<mapper resource="UserMapper.xml"></mapper>
</mappers>
</configuration>
--测试
--加载核心配置文件mybatis-config.xml
--创建会话工厂
--创建会话
--执行SQL
--处理返回值
package cn.tedu.mybatis;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
//测试 mybatis
public class TestMybatis {
public static void main(String[] args) throws IOException {
// 加载核心配置文件mybatis-config.xml
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
// 创建会话工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
// 创建会话
SqlSession session = factory.openSession();
// 执行SQL
// session.selectList(namespace的值.sql的id);
List<User> list = session.selectList("userMapperNS.getAll");
// 处理返回值
for (User u : list) {
System.out.println(u);
}
}
}
–
作业:
–1,敲三遍 ( 笔记里的第二个,MVC项目 )
–2,敲三遍 ( MyBatis框架的第四点 )