Mybatis执行SQL语句是进入XML文件中找对应的语句吗?
???????不是,我们在执行Mybatis的build方法时,将流读取到的Mybatis全局配置文件的内容,包括在其内注册的Mapper都将数据封装为了Java对象(Configuration),Mapper对应的Java对象为MapperRegistry,里面存放的是Mapper的信息,其作为Configuration类的一个属性。 ???????所以我们以为执行SQL语句时是到XML文件中去找,实际上操作的是已创建好的Java对象中数据。
一、图解
测试代码
@Test
public void XMLAndBean() throws IOException {
String myBatisPath = "mybatis-config.xml";
InputStream inputStream =
Resources.getResourceAsStream(myBatisPath);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory sessionFactory = builder.build(inputStream);
SqlSession session = sessionFactory.openSession();
Object o = session.selectOne(
"com.hong.mybatis.dao.EmployeeMapper.selectEmployee",
"1");
System.out.println(o);
session.commit();
session.close();
}
图解:
二、源码分析
[1] build方法内部
???????这里可以看到解析的XML文件内容,被封装到了Configuration当中,那么下面我们再来看下Configuration中是否有存放Mapper的对象。
protected final MapperRegistry mapperRegistry = new MapperRegistry(this);
???????因为Mapper是用来管理SQL语句的,此时MapperRegistry放的就是Mapper中的SQL信息,它被存放在MappedStatement类型的mappedStatements当中,见名知意,它是一个Map,它的key就是SQL标签的id值,value就是SQL语句。
【2】执行查询操作
【3】mappedStatement的结构
三、总结
???????通过上面的源码解析,可以看到XxxMapper.xml文件中的SQL语句,在build的时候就被加载进MapperRegistry对象(Java对象)中了,在执行增删改查操作时,实际上调用的是MapperStatement中的内容。
|