透過 Spring 管理 SqlSessionFactory、封裝樣板程式碼(獲取/關閉 Session、事務),並將 DAO/Mapper 注入容器實現解耦。
SqlSessionFactory。SqlSessionFactory 建立 SqlSession。建立 Java 專案,匯入 MyBatis、Spring、資料庫驅動、DBCP 等 JAR。
applicationContext.xml<!-- 載入屬性檔 -->
<context:property-placeholder location="classpath:db.properties" />
<!-- DBCP 資料源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="maxActive" value="10" />
<property name="maxIdle" value="5" />
</bean>
<!-- SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="mybatis/SqlMapConfig.xml" />
<property name="dataSource" ref="dataSource" />
</bean>
實作類別繼承 SqlSessionDaoSupport,Spring 自動注入 sqlSessionFactory:
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
@Override
public User findUserById(int id) throws Exception {
SqlSession sqlSession = getSqlSession(); // 模板方法獲取
return sqlSession.selectOne("user.findUserById", id);
}
}
配置:
<bean id="userDao" class="com.example.dao.UserDaoImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
MapperFactoryBean<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.example.mapper.UserMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
MapperScannerConfigurer(推薦)<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
約定:Mapper 介面與 XML 同名、同目錄,可省略 SqlMapConfig.xml 手動配置。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring/applicationContext.xml")
public class MyBatisSpringTest {
@Autowired private UserMapper userMapper;
@Test
public void testFindUserById() {
User user = userMapper.findUserById(10);
System.out.println(user);
}
}