Mybatis执行流程(下)------Dao层详解
Mapper简介:
- 上文结尾在项目中发现会用到Dao层的mapper接口和映射文件等。这是因为在之前开发中有很多冗余的工作,比如要实现100个增删查改的方法,除了本身的业务逻辑代码,还要存在开启,提交事务这种重复性的动作,于是就有了使用Mapper来写好接口后,不需实现接口,直接完成相关功能的高效开发。
- 废话不多说,首先通过代码示例来简单了解Mybatis中如何用代理模式帮助我们的!之后在通过项目了解mapper在项目中发挥了怎样的作用。
一、代理模式简介
代理模式(Proxy),说白了,就是你想增强某业务类(比如增加一条数据)的功能,例如想让它拥有可以自己开启、提交事务的功能。但是秉承着编程中的一个思想:***不要随意去修改别人已经写好的代码或者方法,***所以多写一个类用来整合你的业务类和新增功能类。
代理模式分为静态和动态两种:
1、静态代理代码
//接口(通过接口访问目标业务类)
public interface Itf_person{
void adddata();
}
---------------------------------------------
//想要访问的目标业务类(增加一个数据的类)
public class Person implements Itf_person{
public void add(){
System.out.println("增加一条数据");
}
}
---------------------------------------------
//想要增加的功能类(提交事务)
public class Transaction{
public void beginTransaction(){
System.out.println("开启事务");
}
public void commit(){
System.out.println("提交事务");
}
}
---------------------------------------------
//代理对象
public class PersonProxy implements Itf_person {
//业务类和功能类
private Person person;
private Transaction transaction;
//利用构造方法注入业务类和功能类
public PersonProxy(Person person,Transaction transaction){
this.person = person;
this.transaction = transaction;
}
@Override
public void add(){
transaction.beginTransaction();
person.add();
transaction.commit();
}
}
2、动态代理
- 动态代理的思路和静态基本相同,不同点在于弥补了静态代理中存在每一个都会产生一个代理类这种冗余,动态代理在接口中声明的所有方法都被转移到**调用处理器(InvocationHandler.invoke)**一个集中的方法中处理。这样,在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。所以不再更多介绍,这里只是为了简单理解这种理念方便了解Mapper。
三、Mapper代理方式开发Dao层
- 写好Mapper中的接口后,由Mybatis框架根据接口定义创建接口的动态代理对象。
- 代码示例:
Mapper中的接口
Mapper中的映射文件
注:映射文件是一个java类到数据库表的特定映射