MyBatis 源码分析系列文章导读 (9)

为了减少配置文件所占的文章篇幅,上面的配置经过了一定的简化,这里只列出了 MyBatis 和 Spring 相关包的坐标。继续往下看,下面将 MyBatis 中的一些类配置到 Spring 的配置文件中。

<!-- application-mybatis.xml --> <beans> <context:property-placeholder location="jdbc.properties"/> <!-- 配置数据源 --> <bean> <property value="${jdbc.driver}" /> <property value="${jdbc.url}" /> <property value="${jdbc.username}" /> <property value="${jdbc.password}" /> </bean> <!-- 配置 SqlSessionFactory --> <bean> <!-- 配置 mybatis-config.xml 路径 --> <property value="classpath:mybatis-config.xml"/> <!-- 给 SqlSessionFactory 配置数据源,这里引用上面的数据源配置 --> <property ref="dataSource"/> <!-- 配置 SQL 映射文件 --> <property value="mapper/*.xml"/> </bean> <!-- 配置 MapperScannerConfigurer --> <bean> <!-- 配置 Dao 接口所在的包 --> <property value="xyz.coolblog.dao"/> </bean> </beans>

如上,上面就是将 MyBatis 整合到 Spring 中所需的一些配置。这里,我们将数据源配置到 Spring 配置文件中。配置完数据源,接下来配置 SqlSessionFactory,SqlSessionFactory 的用途大家都知道,不用过多解释了。再接下来是配置 MapperScannerConfigurer,这个类顾名思义,用于扫描某个包下的数据访问接口,并将这些接口注册到 Spring 容器中。这样,我们就可以在其他的 bean 中注入 Dao 接口的实现类,无需再从 SqlSession 中获取接口实现类。至于 MapperScannerConfigurer 扫描和注册 Dao 接口的细节,这里先不说明,后续我会专门写一篇文章分析。

将 MyBatis 配置到 Spring 中后,为了让我们的程序正常运行,这里还需要为 MyBatis 提供一份配置。相关配置如下:

<!-- mybatis-config.xml --> <configuration> <settings> <setting value="true"/> </settings> <typeAliases> <typeAlias alias="Article" type="xyz.coolblog.model.ArticleDO"/> <typeAlias alias="Author" type="xyz.coolblog.model.AuthorDO"/> </typeAliases> <typeHandlers> <typeHandler handler="xyz.coolblog.mybatis.ArticleTypeHandler" javaType="xyz.coolblog.constant.ArticleTypeEnum"/> </typeHandlers> </configuration>

这里的 mybatis-config.xml 和上一节的配置不太一样,移除了数据源和 SQL 映射文件路径的配置。需要注意的是,对于 <settings/> 必须配置在 mybatis-config.xml 中。其他的配置都不是必须项,可放在 Spring 的配置文件中,这里偷了个懒。

到此,Spring 整合 MyBatis 的配置工作就完成了,接下来写点测试代码跑跑看。

@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:application-mybatis.xml") public class SpringWithMyBatisTest implements ApplicationContextAware { private ApplicationContext applicationContext; /** 自动注入 AuthorDao,无需再通过 SqlSession 获取 */ @Autowired private AuthorDao authorDao; @Autowired private ArticleDao articleDao; @Before public void printBeanInfo() { ListableBeanFactory lbf = applicationContext; String[] beanNames = lbf.getBeanDefinitionNames(); Arrays.sort(beanNames); System.out.println(); System.out.println("----------------☆ bean name ☆---------------"); Arrays.asList(beanNames).subList(0, 5).forEach(System.out::println); System.out.println(); AuthorDao authorDao = (AuthorDao) applicationContext.getBean("authorDao"); ArticleDao articleDao = (ArticleDao) applicationContext.getBean("articleDao"); System.out.println("-------------☆ bean class info ☆--------------"); System.out.println("AuthorDao Class: " + authorDao.getClass()); System.out.println("ArticleDao Class: " + articleDao.getClass()); System.out.println("\n--------xxxx---------xxxx---------xxx---------\n"); } @Test public void testOne2One() { ArticleDO article = articleDao.findOne(1); AuthorDO author = article.getAuthor(); article.setAuthor(null); System.out.println(); System.out.println("author info:"); System.out.println(author); System.out.println(); System.out.println("articles info:"); System.out.println(article); } @Test public void testOne2Many() { AuthorDO author = authorDao.findOne(1); System.out.println(); System.out.println("author info:"); System.out.println(author); System.out.println(); System.out.println("articles info:"); author.getArticles().forEach(System.out::println); } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpsyfs.html