Mybatis

一,拦截器
–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&amp;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&amp;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框架的第四点 )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值