MyBatis-Spring 是將 MyBatis 無縫整合到 Spring 容器中的關鍵橋梁。它負責加載 MyBatis 核心工廠類與 Session 類,支援將 Mapper 接口與 SqlSession 自動注入到業務層 Bean 中,並統一處理事務與異常轉換(將 MyBatis 異常轉為 Spring 的 DataAccessException),最終實現業務代碼對特定框架的零依賴。
為了確保 Spring 4.x 與 MyBatis 3.x 整合順利,首先回顧在 Maven 環境下創建 Web 項目的標準流程。完成後的項目結構如下圖所示:

在 IDE 中選擇 File → New → Other → Maven Project,勾選 Create a simple project(不使用模板),打包方式設為 war。

專案創建後可能報錯,右鍵項目 → Properties → Project Facets,將 Java 版本從 1.5 改為 1.7。

先取消勾選 Dynamic Web Module 使其暫時變為非 Web 項目,再重新勾選並設定版本為 3.0,點擊 Further Configuration available... 生成 web.xml。

將生成的 WebContent/META-INF 與 WEB-INF 複製到 src/main/webapp,刪除 WebContent 目錄,並在 Deployment Assembly 中移除不需部署的路徑(如 src/test/java、src/test/resources、WebContent),新增 src/main/webapp 作為部署根目錄。

在 src/main/webapp 下新建 index.jsp,若報錯提示缺少 JavaEE Server Runtime,右鍵項目 → Properties → Java Build Path → Add Library → Server Runtime 選擇 Tomcat 7.0。

右鍵項目 → Run As → Run on Server,瀏覽器顯示 "Hello World!" 及當前時間即表示環境搭建成功。

在 pom.xml 中引入 MyBatis、MySQL 驅動、Log4j2、JUnit 等核心依賴。建議使用 MySQL Connector/J 5.1.x 版本(MyBatis 3 不支援 6.x)。
<dependencies> <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.38</version></dependency> <dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.6.1</version></dependency> <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.1</version></dependency> <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.10</version></dependency> </dependencies>

創建 booktypes 表並插入測試數據:
CREATE TABLE `booktypes` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '類型編號', `typeName` varchar(100) NOT NULL COMMENT '類型名稱', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

// 實體類 BookType
public class BookType {
private int id;
private String typeName;
// getter/setter 省略
}
// Mapper 接口
public interface BookTypeDAO {
List<BookType> getAllBookTypes();
}
<!-- BookTypeMapper.xml -->
<mapper namespace="com.zhangguo.Spring61.mapping.BookTypeDAO">
<select id="getAllBookTypes" resultType="BookType">
select id, typeName from booktypes
</select>
</mapper>
<!-- MyBatisCfg.xml -->
<configuration>
<properties resource="db.properties"/>
<typeAliases><package name="com.zhangguo.Spring61.entities"/></typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers><mapper resource="com/zhangguo/Spring61/mapping/BookTypeMapper.xml"/></mappers>
</configuration>
封裝 MyBatisUtil 管理 SqlSessionFactory 與 SqlSession,實現 BookTypeDAOImpl 調用 Mapper 完成查詢。
編寫測試用例驗證查詢功能,並在 src 根目錄添加 log4j2.xml 消除日誌警告。
<Configuration status="off" monitorInterval="1800">
<Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></Console></Appenders>
<Loggers><Root level="debug"><AppenderRef ref="Console"/></Root></Loggers>
</Configuration>

引入 mybatis-spring 適配器,在 Spring 容器中統一管理數據源、SqlSessionFactory 與 Mapper Bean,消除硬編碼。
<properties><spring.version>4.3.0.RELEASE</spring.version></properties>
<dependencies>
<!-- 原有依賴保留 -->
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.0</version></dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency>
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.9</version></dependency>
</dependencies>
<beans ...>
<!-- 1. 數據源 -->
<bean id="jdbcDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db2"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<!-- 2. SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="jdbcDataSource"/>
<property name="configLocation" value="classpath:MyBatisCfg.xml"/>
</bean>
<!-- 3. Mapper 接口代理 -->
<bean id="bookTypeDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.zhangguo.swd.mapping.BookTypeDAO"/>
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
<context:component-scan base-package="com.zhangguo"/>
<aop:aspectj-autoproxy proxy-target-class="true"/>
</beans>
@Test
public void test01() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("ApplicationContext.xml");
BookTypeDAO dao = ctx.getBean("bookTypeDao", BookTypeDAO.class);
List<BookType> list = dao.getAllBookTypes();
list.forEach(System.out::println);
assertNotNull(list);
}

小結:此階段完成基礎整合,後續可移除 MyBatisCfg.xml 中的環境配置,改用 Spring 提供的數據源(或引入 C3P0、Druid 等連接池)。
