谈谈SqlSessionFactoryBean和MapperScannerConfigurer
这两个类会在我们扫描dao创建接口实现类会用到,如果我们不想创建一个Mapper接口类的实现类的话(通常spring管理Mybatis的mapper对象的时候都需要创建一个接口实现类来做做对数据库的操作,不然没办法访问到Mapper.xml的代理类,这个代理类通常是SqlSession来创建的)
先给出代码
<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<!-- 这里使用的是扫描-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" id="configurer">
<!--这里其实就是在创建一个代理类,也就是接口实现类,并且有属性sqlSessionFactory和sqlSessionTemplate,这样就能完成对数据库的操作了-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<property name="basePackage" value="com.kuang.dao"/>
</bean>
这里的SqlSessionFactoryBean其实就是一个用来创建SqlFactory,它的原理就与Mybatis的工具类原理一样,它里面是有一个SqlSessionFactoryBuilder的,而且有一个读取xml的类,先读取了xml,然后把流交给SqlSessionFactoryBuilder来build()。
然后MapperScannerConfigurer就是一个扫描类,它需要一个
SqlSessionFactoryBean来创建factory和SqlSessionTemplate。然后它根据自己读取到的xml文件和对应的接口来创建一个代理类。这个代理类可以理解为就是我们之前创建的Mapper接口的实现类
Mapper接口的实现类代码:
package com.kuang.dao;
import com.kuang.pojo.Books;
import com.kuang.service.BookService;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import java.util.List;
public class BooksMapperImpl extends SqlSessionDaoSupport implements BooksMapper {
public void insertBook(Books books) {
getSqlSession().getMapper(BooksMapper.class).insertBook(books);
}
public void deleteBook(int id) {
getSqlSession().getMapper(BooksMapper.class).deleteBook(id);
}
public int updateBook(Books books) {
return getSqlSession().getMapper(BooksMapper.class).updateBook(books);
}
public Books getBooksById(int id) {
return getSqlSession().getMapper(BooksMapper.class).getBooksById(id);
}
public List<Books> getBooks() {
return getSqlSession().getMapper(BooksMapper.class).getBooks();
}
}