写本篇的目的
本篇可以解决新手在学习Mybatis时疑惑的几个问题
比如:1.为什么要一个Dao的接口类就要对应编写一个mapper映射xml文件
2.为什么通过配置mybatis-config.xml文件和Dao层接口方法的编写,及对应的xml映射文件的编写,然后通过调用Mybatis提供的接口就能实现方法的调用?
注:因为本人知识量尚浅,有些内容解释不一定全面,本篇只供新手小白理解Mybatis的执行流程,但本人认为讲解的清晰的已经远超CSDN的百分之90博主,因为他们大部分都是互相盗取文章,复制粘贴,文章教学方式逻辑并不连贯,本文以自己学习的思路分享给大家
学习方式
基于使用Mybaits执行sql语句的流程去分析底层原理
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.获取sqlSession工厂
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(in);
//3.通过sqlSession工厂获取sqlSession对象
SqlSession sqlSession = sessionFactory.openSession();
//4.使用sqlSession创建Dao接口的代理对象
UserDao userDao = sqlSession.getMapper(UserDao.class);
//5.使用代理对象执行方法
List<User> users = userDao.findAll();
for (User user : users) {
System.out.println(user);
}
//6.关闭资源
sqlSession.close();
in.close();
1.读取配置文件
2.获取SessionFactory工厂
如何解析文件流?
配置类的属性
工厂的如何设计
SqlSessionFacory的具体实现
3.获取Session对象
sqlSession的具体实现
4.创建Dao接口的代理对象
Executor
Executor类的主要作用:负责执行sql语句,并且封装结果集
5.使用代理对象执行方法
总结
我们来总结一下Mybatis大致是如何实现最终接口代理对象方法的执行
首先我们要将我们配置的mybatis-config.xml文件通过类加载器的getResoureceAsStream()方法加载到内存中,然后工厂构建者通过构建工厂build()方法的内部通过Dom4j技术来解析文件流,并返回一个Configuration对象,这个Configuration的属性有数据库连接四要素和Map对象,Map内部封装着以mapper映射文件中的namespace+.+id为key,以Mapper对象为value,Mapper对象的属性有sql语句和返回值。然后根据这个配置文件,来创建SqlSessionFactory,然后通过SqlSessionFactory获取Session对象,再通过Session对象获取代理对象,代理对象的方法执行是靠通过JDK动态代理增强Executor对象的selectList方法,selecList方法就是通过调用原生的JDBC接口来实现的
注:最底层执行sql的类就是Executor,操作底层就是通过原始的JDBC,故需要配置类通过构造传参的方法,一步步传递到SqlSession类中