关于代码就不贴了,大家可以自行debug自己去看,这个总体的总结可以先看看
Mybatis框架源码分析:
//读取配置文件
InputStream inputstream=Resources.getResourcesAsStream("mybatis-config.xml");
//创建sqlSessionFactory对象
SqlSessionFactory sqlsessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//创建SqlSession对象
session=sqlsessionFactory.openSession();
//操作
session.insert("insertStu",student)
//提交
session.commit();
session.close();
SqlSessionFactory sqlsessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
首先把MyBatis的配置文件封装成IO流的方式,再者就是创建sqlsessionFactory的过程,这里面采用了工厂模式来生成sqlsessionFactory的实例,用SqlSessionFactoryBuilder
的build方法,build方法里面有一个自己的重载的过程,这是因为在这里可以改变Mybatis配置文件中的properties,environment等信息,真正在build方法里面
实现的还是用XMLConfigBuilder的parse()方法来实现对mybatis配置文件的一个解析,这个parse方法返回的configuration对象就有了配置文件的一些信息,
这个configuration对象会作为build方法的一个参数,调用build方法其实就是新建了一个DefaultSqlSessionFactory对象,他是SqlSessionFactory的实现类,也
就是说最后返回的就是DefaultSqlSessionFactory对象
session=sqlsessionFactory.openSession();
由sqlsessionFactory这个工厂来创造sqlsession对象,返回的还是defaultSqlSession对象,这个对象里面有一些属性,比如dirty,autocommit,executor等一些属性
session.insert("insertStu",student) (insertStu是映射文件的id)
这个方法里面可以帮我们找到三个问题的答案:
1.mybatis是如何把insertStu与映射文件的id对应起来的?
2.mybatis如何把数据绑定到sql语句中?
3.mybatis如何输送sql语句?
insert方法其实调用的是update方法,里面会传入上面的两个参数,当sqlsession对象在执行的时候,他要根据configuration对象的mapper映射的id找到当前执行的sql语句,
同时通过对应关系把值赋值到对应的 sql语句中 ,下来就是执行器Executor进行sql语句的执行工作,这里面应该就是封装的一些jdbc的操作,来完成对数据库的交互工作,在
这个操作之前,会有MapperStatement对象将赋值内容和sql占位符进行绑定的一个操作。
session.commit();
这个里面的主要是通过sqlsession对象里面的dirty属性来决定数据库的事务提交的方式,具体就是当dirty属性为true时,就是当sql语句执行完毕后,事务可以进行提交,
当dirty属性为false时,当sql语句执行完毕后,事务可以进行回滚