<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.1.1</version>
</dependency>
整合後,數據源、事務管理交給 Spring,MyBatis 配置僅保留別名與映射檔:
<configuration>
<typeAliases>
<typeAlias alias="Message" type="com.cn.imooc.entity.Message"/>
</typeAliases>
<mappers>
<mapper resource="com/cn/mappers/message.xml"/>
</mappers>
</configuration>
<beans ...>
<!-- 1. 數據源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/weixin?useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<!-- 2. SqlSessionFactoryBean -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:MybatisConfiguration.xml"/>
<!-- 若 MyBatis 配置未掃描映射檔,可在此指定 -->
<!-- <property name="mapperLocations" value="classpath:com/cn/mappers/*.xml"/> -->
</bean>
<!-- 3. MapperFactoryBean:為單個介面創建代理 -->
<bean id="messageMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.cn.inter.IMessageOperation"/>
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
</beans>
SqlSessionFactoryBean:替代原生 SqlSessionFactoryBuilder,整合 Spring 數據源與事務。configLocation:指定 MyBatis 核心配置文件。mapperLocations:批量掃描映射檔(Ant 路徑),若 MyBatis 配置已包含則可省略。MapperFactoryBean:為每個 Mapper 介面顯式定義 Bean,適用於少量 Mapper。public class TestSpringAndMybatis {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("spring-application.xml");
IMessageOperation mapper = ctx.getBean("messageMapper", IMessageOperation.class);
Message msg = mapper.selectMessageById("2");
System.out.println(msg);
}
}
手動為每個 Mapper 寫 MapperFactoryBean 過於繁瑣。Spring 提供掃描器自動掃描包下所有介面並註冊代理:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.cn.inter"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
basePackage:掃描的基礎包,所有介面自動成為 Mapper Bean(Bean 名稱 = 介面簡名首字母小寫)。MapperFactoryBean。annotation 指定註解過濾。<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
Service 層加 @Transactional 即可聲明式事務。
MyBatis-Spring 整合核心三步:
DataSource。SqlSessionFactoryBean 關聯數據源與 MyBatis 配置。MapperScannerConfigurer 自動掃描註冊 Mapper 代理。此方式實現了數據源統一管理、事務無縫整合、Mapper 零配置註冊,是企業級應用標準做法。