架构原理
架构图
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 environme