sprin-web
手写一个Mybatis框架
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相关原理和简单实现,里面有许多不足,请大家指正~
参考资料和推荐阅读
欢迎阅读,各位老铁,如果对你有帮助,点个赞加个关注呗!~