mybatis-spring学习总结

为了解决mybatis与spring的兼容问题,mybatis推出了mybatis-spring的jar包以实现兼容

该jar包可以从maven上面获取 网址:http://mvnrepository.com/artifact/org.mybatis/mybatis-spring

为了确保程序运行,还需加入spring的相关jar包

根据mybatis,sqlSession,sqlSessionFactory是其关键接口,相关的mapper是其起作用的关键dao接口,为此mybatis-spring有相对应的构建方案

为了构建sqlSession去执行相应的mapper,在单独的mybatis项目里面需要先创建sqlSessionFactory;而在mybatis-spring项目里面,构建产生sqlSession的类成为了SqlSessionTemplate。为什么是他?,我又是怎么会知道的?当然我还是个小渣渣,仅根据源码就能推知项目如何构建,所以还是需要浏览mybatis-spring的官网查阅得知,或者mybatis的相关书籍,但是随着学习的深入,我想总有一天根据源码和类图就能推测如何使用!

查看sqlSessionTemplate类源码,查看如何构建sqlSessionTemplate

观察源码得知,构建sqlSessionTemplate需要sqlSessionFactory,或者再加上ExecutorType,该执行器类型在基础的mybatis版本里面见识过,不再多说,至于为什么会在这出现,考虑到所有相关的mybatis配置均会在mybatis配置文件中提及,在这再出现一遍我也不是很了解

创建sqlSessionTemplate需要sqlSessionFactory,很正常,没毛病。

因为需要一个sqlSessionFactory

在基础的mybatis中,sqlSessionFactory是通过sqlSessionFactoryBuilder创建的,在mybatis-spring中怎么创建呢,根据前面有默认的

DefaultSqlSessionFactory实现可选,在这里直接通过bean创建就好

与此同时,mybatis-spring给予了一种更有用的写法,通过SqlSessionFactoryBean去实现

首先查看mybatis源码,看看SqlSessionFactoryBean类需要什么

需要配置的包含以上部分,这与基础的SqlSessionFactory配置大致相同,其中关键的是DataSource,ConfigLocation(也就是mybatis的配置文件所在地),需要用这两个去构建基础的sqlSessionFactoryBean

但DataSource怎么去构建呢,mybatis-spring给出了相应的实现:DriverManagerDataSource,那我怎么知道需要用这个呢,事实上,在这个地方只要是DataSource的实现类就可以。可以查看DataSource的实现类,通过IDEA查看很方便,在DataSource接口声明的地方,右键选择go to,里面就能查看implmentations ,其中spring-jdbc有相应的实现,oracle的ojdbc包也有,只要是dataSource的实现就行!!!!!在这里不妨选择spring提供的实现:

<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
    <property name="username" value="wukang"/>
    <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
    <property name="password" value="147258"/>
</bean>

接着配置configLocation是String就行,为什么? 查看Resource源码得知

其实现就是已是一个字符串代表的路径

因此sqlSessionFactoryBean的配置如下:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="datasource"/>
    <property name="configLocation" value="classpath:resources/META-INF/spring/mybatis-config.xml"/>
</bean>

其中sqlSessionFactory的其他配置项就可以通过mybatis的配置文件去配置,在这里我想不通的是,明明之前配置SqlSessionFactory的时候,可以将全部配置都放在配置文件里面,也就是说关于数据库的连接配置也可以放在配置文件里面,但是我试过放在配置文件里面去声明,结果是不行的,想不通为什么要这么设计。。。

当时我在这里边犯迷糊,明明sqlSessionTemplate需要的是sqlSessionFactory,为什么需要去构建sqlSessionFactoryBean呢,两者不同啊,转念一想,或许是spring的FactoryBean接口,一看果然是,对此mybatis-spring也给予了解释。如下:

Note that SqlSessionFactoryBean implements Spring's FactoryBean interface (see section 3.8 of the Spring documentation). This means that the bean Spring ultimately creates is not the SqlSessionFactoryBean itself, but what the factory returns as a result of the getObject() call on the factory. In this case, Spring will build an SqlSessionFactory for you at application startup and store it with the name sqlSessionFactory . In Java, the equivalent code would be:

SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
SqlSessionFactory sessionFactory = factoryBean.getObject();

问题释然!

很简单!

 其实配置到这儿,sqlSessionTemplate已经能用了可以产生sqlSession了,但是mybatis-spring仍然给出了很多方便编程的办法

1.要是不能将mapper也放进spring容器进行管理,那还是跟没有一样啊,如何解决?

(1)使用MapperFactoryBean,顾名思义,该bean跟上面的一样

  (2) 使用MapperScannerConfigurer ,这是推荐的办法,配置如下:

<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer" >
    <property name="basePackage" value="Helison.mapperInterfaces"/>
    <property name="annotationClass" value="org.springframework.stereotype.Repository"/>
    <property name="sqlSessionTemplateBeanName" value="sqlSessionTemplate"/>
</bean>

至于为什么这么配置,根据前面的例子慢慢查mybatis-spring官方文档或者相关书籍或者源码吧。。。。 到此mybatis-spring配置结束

总结:

在mybatis-spring项目配置过程中,首先我是看的深入浅出MyBatis技术原理与实战这本书,总的来说这本书毕竟是国内少有的讲解mybatis的,讲的还凑合,但是其中很多关键性的地方并没有解释,比方说,为什么需要配置factoryBean而不直接配置factory,

为什么那么多配置项却仅仅是配置少数几个,如配置sqlSessionFactoryBean的时候仅仅配置datasource,cpnfigLocation,datasource为什么不配置在mybatis配置文件中而配置在spring的配置文件中,以至于为什么单独配置datasource时出错等等一系列问题

当然还有很多问题没有列出,随着学习的深入我想我会慢慢就知道的,同时也掌握了一种学习方法,即当想学某种框架时,首先阅读相关的书籍,在里面列出想不透的问题,在查看相关源码解释,当想的差不多的时候,查看官方文档,配合官方文档再进一步查看源码会有更深入的理解,官方文档永远是最准确的解释。没有之一

最后推荐大家一款mybatis插件

使用方法:https://mp.baomidou.com/#/mybatisx-idea-plugin

猜你喜欢

转载自blog.csdn.net/WK_SDU/article/details/81168318
今日推荐