public static void main(String[] args) {
//读取全局配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//解析配置文件,返回SqlSessionFactory对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = factory.openSession();
//获得了接口对象,调用接口中的方法。
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> list = mapper.getUserByName("tom");
}
详细流程
1.使用Resource中的getResourceAsStream(“mybatis-config.xml”) 方法读取mybatis-config.xml。(当ssm整合后,环境配置与mapper映射文件的注册会转移到spring配置文件中)
2.创建SqlSessionFactoryBuilder对象,调用build(inputstream)方法读取并解析配置文件,返回SqlSessionFactory对象。
- build()方法中创建了一个XMLConfigBuilder对象来解析mybatis-config.xml。(初始化配置文件信息的本质就是创建Configuration对象,将解析的xml数据封装到Configuration内部的属性中)(下文中使用到Configuration对象的mappedStatements属性,就是将配置文件中的增删改查标签分别封装成MappedStatement然后存放到mappedStatements属性中,存放方式键值对:存储时key
= 全限定类名 + 方法名,value = 对应的MappedStatement对象) - 创建后的的XMlConfigurationBuilder对象调用parse方法来进行解析,其中parse调用了parseConfiguration方法来将各个标签中的内容封装到Configuration对象的属性当中,并在parse方法中返回。
- 返回之后使用build(XMLConfigBuilder.parse());返回一个DefaultSqlSessionFactory的一个会话工厂实例
3.使用会话工厂实例创建一个sqlSession ,再调用getMapper方法,传入对应Mapper的字节码对象来获取对应的接口对象,然后使用其中的方法。(MyBatis初始化时对接口的处理:MapperRegistry是Configuration中的一个属性,它内部维护一个HashMap用于存放mapper接口的工厂类,每个接口对应一个工厂类。mappers中可以配置接口的包路径,或者某个具体的接口类)
- getMapper()方法中通过从MapperRegistry中的HashMap中拿到mapperProxyFactory,然后通过newInstance(sqlSession)来创建一个实例,并使用其中的方法 (在动态代理返回了示例后,我们就可以直接调用mapper类中的方法了,说明在MapperProxy中的invoke方法中已经为我们实现了方法)