关于MyBatis
本身的Mapper
机制,请参考文档 MyBatis的Mapper机制
首先,在没有使用MyBatis-Spring
的情况下,我们这么去访问Mapper
public Student findStudentById(int studentId) {
SqlSession sqlSession = MyBatisUtil.getSqlSession();
try {
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
Student student = studentMapper.queryByPrimaryKey(studentId);
return student;
} finally {
sqlSession.close();
}
}
每次都要调用SqlSessionFactory.openSession
方法打开SqlSession
会话。并且用完SqlSession
之后,就需要调用SqlSession.close
。
SqlSession.close
做了什么事情:
① 关闭数据库游标
② 关闭连接,注意:这边说的关闭连接只是调用connection.close
方法,但是如果用连接池,那么connection.close
一般是把连接放回连接池中,而不是直接close
掉。具体要看连接池对connection
的包装。
下面看看使用了MyBatis-Spring
之后的Mapper
是怎么样的。
我们一般会把某个Mapper
以成员变量的形式注入到业务类中。比如:
public class CityCacheServiceImpl implements CityCacheService {
@Autowired
private CityMapper cityMapper;
}
我们都知道这边注入的CityMapper
一般都是单例,是Spring Bean
工场产生的Singleton
。要知道为何CityMapper
能被注入进来,就得看下MyBatis-Spring
的配置了。
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="mapperLocations">
<list>
<value>classpath:mapper/*Mapper.xml</value>
</list>
</property>
<property name="transactionFactory">