Mybatis 源码阅读之一 整体概括

321 阅读3分钟

源码搭建的话,请参考此链接

Mybatis源码搭建

Mybatis的基本架构

先说一下JDBC获取数据库数据的流程

1.加载JDBC驱动(以mysql为例子,既是mysql-connector-java) 2.建立数据库连接 3.创建JDBC Statements对象 4.编写SQL 5.执行SQL 6.处理结果 7.释放资源 Connection,Statements,Resultset

使用Mybatis连接数据库,用到的核心组件

  • 数据库连接池
  • 事务管理
  • 缓存机制
  • 数据处理层
  • 接口层

不管怎么说Mybatis底层也是调用JDBC来完成SQL执行,我们需要关注的类包:

  • org.apache.ibatis.datasource (数据源和连接池相关)
  • org.apache.ibatis.transaction (事务相关)
  • org.apache.ibatis.session (sqlSession)
  • org.apache.ibatis.cache(缓存)
  • org.apache.ibatis.executor(执行器)

下面来我们看一下demo中的例子

	public static void main(String[] args) {
        String      resource    ="mybatis-config.xml"; // 加载mybatis配置文件
        InputStream inputStream =null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }
        SqlSessionFactory sqlSessionFactory =null;
        sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); // 根据配置文件创建一个sqlSessionFactory工厂。每次new 一个SqlSession
        SqlSession sqlSession =null;
        try {
            sqlSession=sqlSessionFactory.openSession(); // 从池中获取session
            RoleMapper roleMapper=sqlSession.getMapper(RoleMapper.class);// 通过session获取Mapper,在Spring中我们通常使用 DI 注入方式得到
            Role role=roleMapper.getRole(1L);
            log.debug("sql 已经被执行");
            System.out.println(role.getId()+":"+role.getRoleName()+":"+role.getNote());
            sqlSession.commit();
        } catch (Exception e) {
            sqlSession.rollback();
            e.printStackTrace();
        }finally {
            sqlSession.close();
        }
    }

需要注意的是SqlSession并没有依赖JDBC的连接Connection而是通过Transaction来关联,更多细节在以后展开,这里先大概描述。

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="lazyLoadingEnabled" value="true"/>
        <!-- <setting name="aggressiveLazyLoading" value="false"/> -->
    </settings>
    <typeAliases>
        <typeAlias alias="role" type="mytest.learn.Role"/>
    </typeAliases>
    <typeHandlers>
        <typeHandler jdbcType="VARCHAR" javaType="string" handler="mytest.learn.MyStringHandler"/>
    </typeHandlers>
    <!-- 定义数据库的信息,默认使用development数据库构建环境 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:13306/mybatis" />
                <property name="username" value="root" />
                <property name="password" value="123456" />
            </dataSource>
        </environment>
    </environments>
    <!-- 定义映射器 -->
    <mappers>
        <package name="mytest.learn"/>
    </mappers>
</configuration>

在代码sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);中解析mybatis-config,涉及到XML解析成对象。具体怎么样解析请看源码,这里不关注其解析过程。

总结

mybatis框架,做的是减少了好多模板代码,节省了维护成本,操作数据库更为简单化,只需要写好对应SQl和Domain对象,即可自动转换成JavaBean,还有N多好处,个人想到既是这些。数据库连接就是通过(以mysql为例子)mysql:// 协议跟Mysql服务器进行通讯的,底层肯定是TCP了。连接池就是保存连接,当应用程序启动的时候会预先连接到Mysql服务器上,存活一些长连接,只要有请求过来直接从池中返回连接,进行交互即可,重用了连接。提高了效率。

PS:此为个人笔记,水平有限,讲解的不是很好,请大家见谅,有不对的地方请多多包涵并指出,感激不尽!有问题随时联系我。