【第15章】深入分析iBatis框架之系统架构与映射原理

1.iBatis框架主要的类层次结构

1.1.工作内容

1.1.1.根据JDBC规范建立与数据库的链接

1.1.2.通过反射打通Java对象与数据库参数交互之间相互转化的关系

1.2.交互式框架

1.3.层次结构主要由操作行为和执行环境组成

1.4.类SqlMapExecutorDelegate耦合了用户端的执行操作行为和执行的环境;它持有所需数据和管理着依赖环境,是一个执行代理类,也可以看成工具类

2.iBatis框架的设计策略

2.1.目的:方便地写出SQL和获取SQL执行结果

2.2.数据映射的过程

2.2.1.根据在statement中定义SQL语句,解析出其中的参数

2.2.2.按照参数出现的顺序保存在Map集合中

2.2.3.按照在Statement中定义的ParameterMap对象类型(int,string,model,java.util.Map)解析出参数的java类型

2.2.4.根据其数据类型构建TypeHandler对象

2.2.5.参数值的复制是通过DateExchange对象完成的

2.3.parameterClass代表参数类型,resultClass(只有查询操作才会有)代表返回结果类型

3.iBatis框架的运行原理

3.1.执行过程

3.1.1.创建SqlMapSession对象

3.1.2.从对象池里取出一个SessionScope对象

3.1.3.建立数据库连接

3.1.4.从对象池里取出一个RequestScope对象

3.1.5.执行SQL语句

3.1.6.映射Java对象参数到ParameterMap,映射数据库列名到ResultMap

3.1.7.归还RequestScope对象到对象池

3.1.8.释放数据库连接

3.1.9.归还SessionScope对象到对象池

3.1.10.销毁或共享SqlMapSession对象

3.2.参数用#参数:JDBC数据类型#

4.iBatis对SQL语句的解析

4.1.iBatis利用statement来解析SQL语句,将参数先替换成?

4.2.把传过来的对象数据结合ParameterMap中的信息提取出一个参数数组,然后调用preparedStatement,setXXX(i,parameter)方法提交参数

4.3.parameter的赋值是根据在parameterPlan(parameterClass创建)中保存的getter方法列表及传进来的对象利用反射机制得到最终的SQL语句,最后提交给数据库

5.数据库字段映射到Java对象

5.1.获取返回对象

5.2.根据返回对象的列名去匹配前面的属性数组,构成一个集合

5.3.选择DaraExchange类型、AccessPlan类型为后面真正的数据交换提供支持

5.4.根据resultMappingList集合从ResultSet中取出列对应的值,构成值数据

5.5.调用对象属性的setter方法将columnVlaues值设置到对象中

5.6.若参数为空或者同一个参数对应多个JDBC类型,就需要在参数后面加上JDBC类型,否则会引起多次编译,影响数据库性能

6.设计模式解析之简单工厂模式

6.1.核心思想:根据属性的不同,产生不同的产品

6.2.具体做法:根据逻辑判断来选择调用具体的接口

7.设计模式解析之工厂模式

7.1.核心思想:根据工厂的不同,产生不同的产品

7.2.具体做法:提出一个类来区分

Remark:

iBatis的流程:通过SQL MAP将Java对象映射成SQL语句,然后再将结果集转换成Java对象

iBatis完成的功能:数据库的数据源管理,iBatis通过配置文件来管理SQL及输入参数的映射,iBatis通过配置文件来获取返回结果到Java对象的映射

简单工厂模式

// 接口(抽象产品)
public interface Person{
  
   public void motion();

}
// 实现类(具体产品)
public class Adult implements Person{

   public void motion(){
     System.out.println("breasketball");
   }
}

public class kid implements Person{

   public void motion(){
     System.out.println("toy");
   }
}
// 工厂类
public static Person person(String personType){

   if(personType.equals("Audlt")){
     
      return new Audlt();
  }else if(personType.equals("Kid")){
      return new Kid();
   }

}

工厂模式

// 工厂接口
public interface Factory{ 
  public Product create(); 
}

// 产品接口
public interface Product{}  

// 产品接口实现类
public class Washer implements Product{ 
   public Washer(){ 
       System.out.println("洗衣机被制造了"); 
   } 
} 
 
public class Icebox implements Product{ 
   public Icebox(){ 
       System.out.println("冰箱被制造了"); 
   } 
} 
 
public class AirCondition implements Product{ 
   public Icebox(){ 
       System.out.println("空调被制造了"); 
   } 
} 

//创建洗衣机的工厂 
public class CreateWasher implements Factory{ 
    public Product create(){ 
          return new Washer(); 
    } 
} 
 
//创建冰箱的工厂 
public class CreateIcebox implements Factory{ 
    public Product create(){ 
          return new Icebox(); 
    } 
} 
 
//创建空调的工厂 
public class CreateAirCondition implements Factory{ 
    public Product create(){ 
          return new AirCondition(); 
    } 
} 

 

转载于:https://my.oschina.net/Tsher2015/blog/750079

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值