Mybatis源码解析

架构原理

架构图

 Mybatis的架构可分为三层:

1、接口层:SqlSession定义了API接口,通过调用这些API接口来操作数据库。接口层接收到调用请求会调用数据处理层完成数据处理。调用接口的方式有两种:1、传统的直接调用API;2、使用Mapper带来的方式。

2、数据处理层:负责SQL语句的查找、解析、动态生成、执行,以及SQL执行后的结果映射,完成具体的数据库操作。

3、框架支撑层:为数据处理层提供支撑。

Mybatis层次结构

SqlSession:定义了Mybatis的顶层API,客户端通过调用SqlSession来完成数据库相关操作。

Executor:Mybtis的执行器,通过调用StatementHandler执行数据库增删改查操作。

StatementHandler:封装JDBC Statement操作,包括参数映射、数据库操作执行及结果映射。

ParameterHandler:参数映射,由StatementHandler调用进行参数映射。

TypeHandler:负责java及jdbc数据类型之间的映射。

ResultSetHandler:结果映射,由StatementHandler调用进行结果映射。

另外还有一些主要的构件:

MappedStatement:封装xml文件中节点<select|update|insert|delete>或者java类中@Select、@Update等注解配置的SQL信息;

SqlSource:根据传入的参数,动态生成SQL语句,并封装到BoundSql中。

BoundSql:封装动态生成的SQL语句及参数信息。

主体流程

1、配置加载及初始化

配置包括文件(配置mybatis-config.xml和mapper文件*.xml)及java注解两种,将主配置文件内容解析封装到Configuration,将sql解析为对应的MappedStatement,并存放在内存中。

2、接收增删改查请求

使用传统方式(调用Mybatis提供的API)和代理方式接收数据库增删改查请求,将请求传给下层的数据处理层进行处理

3、处理增删改查请求

接收接口层的请求,根据id查找MappedStatement,接着根据执行参数,解析MappedStatment对象,得到最终执行的SQL并执行SQL。对SQL执行结果映射,并得到最终处理结果。

源码剖析

后续源码解析,将围绕如下的代码展开:

public class MybatisDemo {
    public static void main(String[] args) throws IOException{
        //1.配置文件的加载
        InputStream configRes = MybatisDemo.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
        //2.解析配置文件,并初始化创建SqlSessionFactory工厂 DefaultSqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new  SqlSessionFactoryBuilder().build(configRes);
        //3.实例化SqlSession   DefaultSqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //4.请求API,传入SQL ID,此为传统调用方式
        List<User> users = sqlSession.selectList("com.demo.mapper.user.findAll");
        //5.代理调用方式
        //UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        //List<User> users = userMapper.findAll();
        users.forEach(u -> System.out.println(u));
        sqlSession.close();
    } 
}

 配置加载及初始化

可以看到配置加载及初始化主要发生在此处:

//2.解析配置文件,并初始化创建SqlSessionFactory工厂 DefaultSqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configRes);

 SqlSessionFactoryBuilder中的build方法:

public SqlSessionFactory build(InputStream inputStream, String environment, Properties pro
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值