手写一个Mybatis框架

sprin-web

Keep quiet and ask less,Value determines relationship. No one likes rookies.
talk is cheap, show me the code,make a better result.

目录

在这里插入图片描述

概述

Mybatis是Apache的一个Java开源项目,是一个支持动态Sql语句的持久层框架。

需求:

需求整理如下:
1.支持普通 SQL 查询
2.诸如建立连接,Statement, JDBC相关异常处理等等都交给Mybatis去做了
3.关注在增删改查等操作层面上,而把技术细节都封装在了我们看不见的地方。

设计思路

在这里插入图片描述

实现思路分析

1.读取xml文件,建立连接

从图中可以看出,MyConfiguration负责与人交互。待读取xml后,将属性和连接数据库的操作封装在MyConfiguration对象中供后面的组件调用。。

2…创建SqlSession,搭建Configuration和Executor之间的桥梁

Session仅拥有一个对应的数据库连接,sqlSession将有一个getMapper方法,然后使用动态代理生成对象后,就可以做数据库的操作了

3.创建Executor,封装JDBC操作数据库

Executor是一个执行器,负责SQL语句的生成和查询缓存(缓存还没完成)的维护,也就是jdbc的代码

4.创建MapperProxy,使用动态代理生成Mapper对象

对指定的接口生成一个对象,使得执行它的时候能运行一句sql罢了,而接口无法直接调用方法,所以这里使用动态代理生成对象

拓展Demo实现

相关代码如下:

1.核心代码是动态代理获取接口方法


public class MySqlsession {

	 private Excutor excutor= new MyExcutor();

	 private MyConfiguration myConfiguration = new MyConfiguration();

	   public <T> T selectOne(String statement,Object parameter){
	       return excutor.query(statement, parameter);
	   }

	   @SuppressWarnings("unchecked")
	   public <T> T getMapper(Class<T> clas){
	     //动态代理调用
	       return (T)Proxy.newProxyInstance(clas.getClassLoader(),new Class[]{clas},
	           new MyMapperProxy(myConfiguration,this));
	   }

	}

2.代理工厂:


public class MyMapperProxy implements InvocationHandler{

 private  MySqlsession mySqlsession;

 private MyConfiguration myConfiguration;

   public MyMapperProxy(MyConfiguration myConfiguration,MySqlsession mySqlsession) {
       this.myConfiguration=myConfiguration;
       this.mySqlsession=mySqlsession;
   }

 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
   MapperBean readMapper = myConfiguration.readMapper("UserMapper.xml");
   //是否是xml文件对应的接口
   if(!method.getDeclaringClass().getName().equals(readMapper.getInterfaceName())){
     return null;
   }
   List<Function> list = readMapper.getList();
   if(null != list || 0 != list.size()){
     for (Function function : list) {
     //id是否和接口方法名一样
      if(method.getName().equals(function.getFuncName())){
               return mySqlsession.selectOne(function.getSql(), String.valueOf(args[0]));
           }
     }
   }
      return null;
 }
}
  

3.传值参数设定:

实验效果:

在这里插入图片描述

分析:

在动态类中我们可以使用工具HSDB工具找到这个方法实现。
在这里插入图片描述

在这里插入图片描述

小结:

主要讲述了Mybatis相关原理和简单实现,里面有许多不足,请大家指正~

参考资料和推荐阅读

  1. 从 0 开始手写一个 Mybatis 框架,三步搞定!.
  2. 读完源码,手写一个mybatis框架.
  3. 透彻理解MyBatis设计思想之手写实现.
  4. MYBATIS系列教材 (一)- 基础 - 入门教程.

欢迎阅读,各位老铁,如果对你有帮助,点个赞加个关注呗!~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

执于代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值