本文主讲在spring与MyBatis 整合时关于SqlSessionTemplate的用法和映射器的使用
如若转载请注明出处,谢谢!https://mp.csdn.net/postedit/82257281
首先要知道SqlSessionTemplate是来代替MyBatis中的 SqlSession所以在spring中应用SqlSessionTemplate,而不是SqlSession,
SqlSessionTemplate 怎么来的
1 jar
那么提供SqlSessionTemplate支持的jar 是mybatis-spring-1.2.0.jar
mybatis团队方便开发者在spring中集成使用MyBatis,专门开发的,说白了就是,有了这个jar可以在spring中用MyBatis 可以在GitHub上找到
2 通过SqlSessionFactory实例构造注入到SqlSessionTemplate中可获得SqlSessionTemplate实例
3但是SqlSessionFactory 又是来自注入数据源与MyBatis的文件获得的
得到SQLSessionFactory代码如下:
<!--配置数据源省略-->
<!--配置SQLSessionFactoryBean-->
<bean id =”sqlSessionFactory” class=”org.mybatis.spring.SqlSessionFactoryBean”>
<!--引入数据源-->
<property name=”dataSource” ref=”dataSource”/>
<property name=”configLocation” value=”classpath:mybatis-config.xml”/>
<property name =”mapperLocations” >
<list>
<!--扫描cn.smbms.dao包及其任意层级下的子包的任意名称的xml文件-->
<value> classpath:cn/smbms/dao/**/*.xml</value></list>
</property>
</bean>
开始应用
1 实现dao接口
即dao层的实现类,注意此类里应该添加SqlSessionTemplate属性并set方法可以给spring注入和无参构造,然后配置xml如下
<!--配置SqlSessionTemplate-->
<bean id=”sqlSessionTemplate” class=”org.mybatis.spring.SqlSessionTemplate”>
<constructor-arg name=”sqlSessionFactory” ref=”sqlSessionFactory”/>
</bean>
<!--配置dao组件注入SqlSessionTemplate实例-->
<bean id=”userMapper” class=”cn.smbms.dao.UserMapperImpl”>
<!--这里注入上面刚刚写的属性-->
<property name=”sqlSession” ref=”sqlSessionTemplate”>
</bean>
2第二种继承SqlSessionDaoSupport
让上述的dao层接口的实现类继承SqlSessionDaoSupport ,配置文件直接配置Dap组件省去配置SQLSessionTemplate,原因是SqlSessionDaoSupport提供了setSqlSessionFactory()方法用来注入SqlSessionFactory实例,就会自动生成生成SqlSessionTmeplate,而通过getSqlSession()方法可以获得SqlSessionTemplate实例,所以实现类里不在需要SqlSessionTemplate 属性
<bean id=”userMapper” class=”cn.smbms.dao.UserMapperImpl”>
<property name=”sqlSessionFactroy” value=”sqlSessionFactroy”>
</bean>
3第三种 MapperFactoryBean省去实现类
上面两种都是自行编写映射器的实现类并调用映射器的方法实现的功能,可以预见当映射器增多编写起来会多,而且这个过程都是一样的,都是为了得到SqlSessionTemplate实例去执行getMapper(Class<T> Type)方法或者selectOne,目的执行映射文件,所以如果只是执行SqlSessionTemplate进行基本的数据访问操作,而不包含其他非MyBatis的工作,可以不必手工编码使用SqlSessionTemplate或SqlSessionDaoSupport来实现此类Dao,Mybatis-Spring提供了MapperFactoryBean以配置的方式生成映射器并注入到组件中去
所以现在删除dao层接口的实现类,只保留接口与相应的Sql映射文件
具体配置如下
<!--省略配置数据源信息-->
<!--配置sqlSessionFactoryBean-->
<bean id=”sqlSessionFactory” class=”org.mybatis.spring.SqlSessionFactory”>
<property name=”dataSource” ref=”dataSource”/>
<property name=”configLocation” value=”classpath:mybatis-config.xml”/>
</bean>
<!--配置dao使用MapperFactoryBean-->
<bean id=”userMapper” class=”org.mybatis.spring.mapper.MapperFactoryBean”>
<property name=”mapperInterface” class=”cn.smbms.dao.UserMapper”/>
<property name=”sqlSessionFactory” ref=”sqlSessionFactory”/>
</bean>
MapperFactoryBean 是SqlSessionTemplate的子类,所以也是注入SqlSessionFactory实例通过setSqlSessionFactory ()方法,获得SqlSessionTemplate实例,同时如果sql映射文件与映射器路径同一处,那么该文件可以自动被MapperFactoryBean解析,所以在配置SqlSessionFactoryBean 时可以不用指定文件位置
4第四种 MapperScannerConfigurer
省去sqlSessionFactory注入与MapperFactoryBean
前提条件是:只有一个SqlSessionFactoryBean,原因SqlSessionFactoryBean 会自动装配,如果有两个则配置的时候不能省略
<!--省略配置数据源-->
<!--配置SqlSessionFactoryBean-->
<bean id=”sqlSessionFactory” class=”org.mybatis.spring.mapper.SqlSessionFactoryBean”>
<property name=”dataSource” ref=”dataSource”/>
<property name=”configLocation” value=”classpath:mybatis-config.xml”>
</bean>
<bean class=”org.mybaits.spring.mapper.MapperScannerConfigurer”>
<!--如果有两个则配置的时候不能省略-->
<!--<property name=”sqlSessionFactoryBeanName” value=”sqlSessionFactory”>-->
<property name=”basePackage” value=”cn.smbms.dao”>
</bean>
MapperScannerConfigurer 解决了当映射器多的时候还要配置很多的问题,MapperScannerConfigurer可以批量扫描某包下及其子包下的接口并且当接口在sql映射文件中定义过那么会动态批量注册为MapperFactoryBean,还没完,注册后的映射器应与sql映射文件关联起来!!
这里有两种方法
1通过配置
注册的命名为相应接口的名称并且首字母小写
<bean id=”userService” class=”cn.smbms.serviceImpl”>
<property name=”userMapper” value=”userMapper”>
</bean>
2 通过注解 这个是最常用的
使用@Autowired或@Resource 标注在service层的userMapper属性上,来实现注入
注意:到这里或许蒙为什么要注入到service,原因是我们通过调用的service层中调用到层方法,所以dao层接口的映射器应该注入到service层的userMapper属性中,(userMapper即dao层的接口),最后要加一句扫描注解的代码
<context:component-scan base-package=”cn.smbms.service”>