InputStream inputStream = Resources.getResourceAsStream(resource);
// 1. 创建会话工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 2. 创建会话
SqlSession session = sqlSessionFactory.openSession();
// 3. 使用Mapper
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlogById(1);
1. 创建会话工厂
mybatis-spring
这个包里面提供了一个工厂类SqlSessionFactoryBean
,这个工厂类实现了spring的扩展点FactoryBean,InitializingBean
。
由于实现了FactoryBean 接口,所以初始化的时候,会调用 getObject()
方法,里面又调用了 InitializingBean 接口的 afterPropertiesSet()
方法,这里面调用了buildSqlSessionFactory()
方法,来创建会话工厂。
2. 创建会话并获取Mapper
mybatis-spring
这个包还提供了一个类 MapperScannerConfigurer
,这个类实现了BeanDefinitionRegistryPostProcessor
接口,这个接口有一个方法postProcessBeanDefinitionRegistry()
方法,也是spring的一个扩展点,主要是在注册Bean定义的之后调用,以修改、增加、删除Bean定义。这里主要用来
增加Bean定义,也就是扫描Mapper,但是这里扫描后注册的不是
Mapper接口的实现类,而是一个工厂MapperFactoryBean
,这个工厂实现了FactoryBean
。
然后在创建Service类
的时候,需要注入 Mapper 属性
,此时需要从容器中getBean()
,而容器中注册的是MapperFactoryBean
,就会调用 getObject()
方法,这里面创建了会话,并从会话中获取到了Mapper。注意这里创建的会话不是
DefaultSqlSession,而是mybatis-spring包
里面的 SqlSessionTemplate
。
网友评论