手写一个Mybatis框架

sprin-web

手写一个Mybatis框架

  • 目录
    • 概述
      • 需求:
    • 设计思路
    • 实现思路分析
      • 1.读取xml文件,建立连接
      • 2..创建SqlSession,搭建Configuration和Executor之间的桥梁
      • 3.创建Executor,封装JDBC操作数据库
      • 4.创建MapperProxy,使用动态代理生成Mapper对象
    • 拓展Demo实现
      • 相关代码如下:
      • 实验效果:
    • 分析:
  • 小结:
  • 参考资料和推荐阅读

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

目录

手写一个Mybatis框架_第1张图片

概述

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.传值参数设定:

实验效果:

手写一个Mybatis框架_第2张图片

分析:

在动态类中我们可以使用工具HSDB工具找到这个方法实现。
手写一个Mybatis框架_第3张图片

手写一个Mybatis框架_第4张图片

小结:

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

参考资料和推荐阅读

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

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

你可能感兴趣的:(开源项目和工具组件)