mybatis框架中有个很核心的对象SqlSession,那么Spring整合mybatis时我们如何来获取使用SqlSession对象?mybatis-spring官网提供了SqlSessionTemplate和SqlSessionDaoSupport两种使用方式。下面将分别简单介绍这两种方式的使用。
Spring一种更加灵活的方式来整合mybatis,通过Mapper.xml映射文件要比注解来做SQL映射配置更加具有灵活性,配置文件的方式也是推荐。下面配置SqlSessionFactory
<!-- 配置mybatis SqlSessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 配置mybatis主配置 settings 和 typeAliases --> <property name="configLocation" value="classpath:conf/mybatis/mybatis_core.xml"></property> <!-- 配置映射文件的路径 --> <property name="mapperLocations" value="classpath*:conf/mybatis/mapper/**/*.xml" /> </bean>
Spring整合mybatis之后,mybati.xml主配置文件可以进行简化只要保留<settings>和<typeAliases>两部分。另外需要注意配置SqlSessionFactory的configLocation要使用classpath,而不要使用classpath*,因为后者会报错,笔者文件首先mybatis.xml主配置文件只有一个,不存在多个问题,而且要明确指出路径,不能使用通配符,但是配置mapperLocations是要配置多个映射文件使用了通配符这里要使用classpath*。
<bean id="musicDao" class="org.lian.dao.impl.MusicDaoImpl"> <property name="sqlSession" ref="sqlSession"/> </bean>
简而言之 configLocation --->classpath mapperLocations --->classpath*
SqlSessionTemplate
Spring中配置SqlSessionTemplate
<!--配置 sqlSession --> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory" /> <!-- 如果要使用批处理 可以选择下面配置 通常不用写 --> <!-- <constructor-arg index="1" value="BATCH" /> --> </bean>
接下来就是如何在Dao层中使用,下面采用通过配置的方式将sqlSession注入到Dao中
<bean id="musicDao" class="org.lian.dao.impl.MusicDaoImpl"> <property name="sqlSession" ref="sqlSession"/> </bean>
Dao实现类
public class MusicDaoImpl implements MusicDao { private SqlSession sqlSession; public void setSqlSession(SqlSession sqlSession) { this.sqlSession = sqlSession; } @Override public Music selectMusicById(String id) { StringBuilder statement = new StringBuilder(); statement.append(NAMESPACE).append("selectMusic"); Music music = sqlSession.selectOne(statement.toString(), id); return music; } }
SqlSessionDaoSupport
SqlSessionDaoSupport有个两个属性sqlSessionFactory 和 sqlSessionTemplate 将这两个对象注入到Dao中就可以使用了。这里以注入sqlSessionFactory为例。
通过配置文件来注入SqlSessionFactory
<bean id="musicDao2" class="org.lian.dao.impl.MusicDao2Impl"> <property name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean>
使用配置文件注入的时候Dao实现类写的特别简单
public class MusicDao2Impl extends SqlSessionDaoSupport implements MusicDao { @Override public Music selectMusicById(String id) { System.out.println(this.getClass().getName()); StringBuilder statement = new StringBuilder(); statement.append(NAMESPACE); statement.append("selectMusic"); Music music = getSqlSession().selectOne(statement.toString(), id); return music; } }
如果要使用Spring注解的方式来注入SqlSessionFactory可以采用下面的一种方式
@Repository("musicDao2") public class MusicDao2Impl extends SqlSessionDaoSupport implements MusicDao { @Autowired public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) { super.setSqlSessionFactory(sqlSessionFactory); } @Override public Music selectMusicById(String id) { System.out.println(this.getClass().getName()); StringBuilder statement = new StringBuilder(); statement.append(NAMESPACE); statement.append("selectMusic"); Music music = getSqlSession().selectOne(statement.toString(), id); return music; } }
sqlSession关闭交给Spring来管理,因此不用再代码中显式进行关闭。