我们已经分析了MeBatis 的主要对象和操作流程,应该从哪里入手?

当我们在psvm 操作的时候,第一个需要的对象是SqlSession。所以我们从应用层的接口SqlSession 入手。

那么我们先来创建一个package,它是我们手写的MeBatis ,我们建一个包叫mebatis。

首先我们创建一个自己的SqlSession,叫SqlSession。

根据我们刚才总结的流程图,SqlSession 需要有一个获取代理对象的方法,那么这个代理对象是从哪里获取到的呢?是从我们的配置类里面获取到的,因为配置类里面有接口和它要产生的代理类的对应关系。

所以,我们要先持有一个Configuration 对象,叫GPConfiguration,我们也创建这个类。除了获取代理对象之外,Configuration 里面还存储了我们的接口方法(也就是statementId)和SQL 语句的绑定关系。

第二个,我们在SqlSession 中定义的操作数据库的方法,最后都会调用Executor去操作数据库,所以我们还要持有一个Executor 对象,叫Executor,我们也创建它。

// SqlSession.java
private Configuration configuration;
private Executor executor;

除了这两个属性之外,我们还要定义SqlSession 的行为,也就是它的主要的方法。

第一个方法是查询方法,selectOne(),由于它可以返回任意类型,我们把返回值定义成<T> T 泛型。selectOne()有两个参数,一个是String 类型的statementId,我们会根据它找到SQL 语句。一个是Object 类型的parameter 参数(可以是Integer 也可以是String 等等,任意类型),用来填充SQL 里面的占位符。

它会调用Executor 的query()方法,所以我们创建Executor 类,传入这两个参数,一样返回一个泛型。Executor 里面要传入SQL,但是我们还没拿到,先用statementId代替。

// SqlSession.java
public <T> T selectOne(String statementId, Object parameter){String sql = statementId; // 先用statementId 代替SQLreturn executor.query(sql, parameter);
}
// Executor.java
public <T> T query(String sql, Object paramater ) {return null;
}

第二个方法是获取代理对象的方法,我们通过这种方式去避免了statementId 的硬编码。

我们在SqlSession 中创建一个getMapper()的方法,由于可以返回任意类型的代理类,所以我们把返回值也定义成泛型<T> T。我们是根据接口类型获取到代理对象的,所以传入参数要用类型Class。

// SqlSession.java
public <T> T getMapper(Class clazz){return null;
}

手写自己的MyBatis框架-SqlSession相关推荐

  1. 手写自己的MyBatis框架-Executor

    到了sqlSession 的selectOne()方法,这里我们要去调用Executor 的query()方法,这个时候我们必须传入SQL 语句和参数(根据statementId 获取). 问题来了: ...

  2. 手写自己的MyBatis框架-操作流程

    1.定义接口Mapper 和方法,用来调用数据库操作. Mapper 接口操作数据库需要通过代理类. 2.定义配置类对象Configuration. 3.定义应用层的API SqlSession.它有 ...

  3. 手写自己的MyBatis框架-这个框架需要解决什么问题?

    老王给我看了一段JDBC 的代码: rs.close(); stmt.close(); conn.close(); 1)它需要实现对连接资源的自动管理,也就是把创建Connection.Stateme ...

  4. 手写自己的MyBatis框架-V2.0 可优化之处

    1 .在ResultSetHandler 中, 类型处理都是写死的, 能不能创建一个TypeHandler,把这些关系维护起来,处理所有类型的转换关系和自定义类型: 2.只实现了@Select 的注解 ...

  5. 手写自己的MyBatis框架-V2.0配置文件

    创建了全局配置文件mybatis.properties,存放SQL 连接信息.缓存开关.插件地址.Mapper 接口地址. 全局配置文件在Configuration 配置类的构造器中解析.

  6. 手写自己的MyBatis框架-MapperProxy

    我们要在Configuration 中通过getMapper()方法拿到这个代理对象,必须要有一个实现了InvocationHandler 的代理类.我们来创建它:MapperProxy. 提供一个i ...

  7. 手写自己的MyBatis框架-Configuration

    代理对象我们不是在SqlSession 里面获取到的,要进一步调用Configuration 的getMapper()方法.返回值需要强转成(T). // SqlSession.java public ...

  8. 手写自己的MyBatis框架-核心对象

    1.存放参数和结果映射关系.存放SQL 语句,我们需要定义一个配置类: 2.执行对数据库的操作,处理参数和结果集的映射,创建和释放资源,我们需要定义一个执行器: 3.有了这个执行器以后,我们不能直接调 ...

  9. 手写自己的MyBatis框架-支持插件

    定义了一个@Intercepts 注解,目前还只能拦截Executor 的方法,所以属性只要配置方法名称. 定义Interceptor 接口,是所有自定义插件必须实现的接口. 定义Intercepto ...

最新文章

  1. MySQL查询随机数据的4种方法和性能对比
  2. hdu 1546(最短路)
  3. python编程少儿游戏编程_少儿编程课堂|python – 用游戏学编程
  4. IP地址的分类——a,b,c 类是怎样划分的
  5. 【HDU - 1533】Going Home(网络流,二分图最优匹配,KM算法)
  6. 【个人笔记】OpenCV4 C++ 图像处理与视频分析 11课
  7. MacOS使用技巧总结
  8. 像仓管一样管理redux-仓管也需要才艺(中间件)
  9. 求点到线段的最短距离(QT)
  10. 如何使用KETTLE实现国定法定节假日?
  11. 酷安绿色版 免安装无需UWP版
  12. 如何在职场上获得良好的起点
  13. 32位计算机装64位操作系统,电脑应该装32位还是64位系统?
  14. uni-app 超详细教程(二)(从菜鸟到大佬)
  15. 重新“推开世界的门”:4年过去了,VR还能复兴吗?
  16. 22考研清华深研院电子与通信,985信号与系统400+高分经验分享
  17. x86汇编_SHLD/SHRD双精度左右移指令_笔记49
  18. Oracle任意字符串转换成拼音首字母简写
  19. 深圳地铁回应女高管猝死:工作人员不能贸然救助
  20. 转载Mongondb

热门文章

  1. sql server数据库查询超时报错
  2. jquery的2.0.3版本源码系列(2):21行-94行定义了一些变量和函数 jQuery=function(){}
  3. ERROR Cannot determine the location of the VS Common Tools Folder
  4. 获取 input 单选框和多选框的值
  5. How to start MySQL on Linux
  6. Linux (x86) Exploit 开发系列教程之七 绕过 ASLR -- 第二部分
  7. 春运首日山东烟台海上安全巡航
  8. HTTP RTSP RTMP RTP 协议简说 流媒体学习(一)
  9. python学习笔记之——range()函数
  10. Aidl调用何时使用本地对象问题