通过对Mybatis的几天的学习,了解到Mybatis的执行过程,而且对Mybatis的一些API有了一些新的认识,那边以图文方式进行展示
1.原始JDBC调用过程如下:
public static void main(String[] args) {
Connection conn=DriverManager.getConnection("jdbc:mysql:///test","","");
//创建语句执行对象
java.sql.Statement st=conn.createStatement();//使用Statement对象
//执行语句
ResultSet rs=st.executeQuery("select * from User");
//处理结果
while(rs.next()){
System.out.print(rs.getObject(1)+"\t"+rs.getObject(2)+"\t"+rs.getObject(3)+"\t");
}
//6.释放资源,资源rs、st、conn的释放顺序与创建顺序相反
rs.close();
st.close();
conn.close();
}
上面的不足:
①存在硬编码
②连接资料管理存在频繁的释放和建立
解决方式:将一些连接信息,参数对象,结果集对象进行配置化
2.看下mybatis针对以上问题的处理和架构
Mybatis主要架构分为三层:
①接口层:负责提供给调用方的接口,主要包含SqlSession
②数据处理层:包含了从配置文件解析,查找,sql执行到返回结果集映射等执行过程
③支撑层:包括事物管理,连接池,缓存机制,这些是共用的部分,提供给上层的一些支撑组件
下面来说下api的主要作用:
构件 | 描述 |
SqlSession | 作为接口层的组件,提供外部调用 |
Executor | 负责SQL语句生成和查询缓存维护 |
StatementHandler | 封装了JDBC Statement操作,设置参数,将Statement结果集转为List |
ParameterHandler | 对用户传入的参数进行解析为数据库参数 |
ResultSetHandler | 将JDBC的结果集封装到List类型集合中 |
TypeHandler | 负责Java类型和数据库类型之间的转换 |
MappedStatement | 把映射配置文件中的每个结点信息封装到这个实体中 |
SqlSource | 动态生成SQL语句,将信息封装到BoundSql中 |
BoundSql | 最终生成的SQL语句和相应的参数信息 |
3.Mybatis调用层次结构
① 首先解析配置文件,通过XMLConfigBuild解析主配置文件将结果封装在Configuration,通过XMLMapperBuild解析映射配置文件将结果封装为MappedStatement以Map的value存储在Configuration中;
②sqlSession中保存增删改查的接口给用户,它调用Executor接口
③Executor维护缓存功能生成sql语句放在BoundSql中,然后调用StatementHandler接口
④StatementHandler接口负责参数映射和结果集映射功能,并调用底层JDBC获取connection完成数据库操作