首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

SpringMVC + MyBatis 整合完整配置指南 (Maven、XML、註解版)

     編輯:Java 綜合教學

專案依賴 (pom.xml)

<dependencies>
    <!-- Spring MVC -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>4.3.2.RELEASE</version>
    </dependency>

    <!-- MyBatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>1.3.0</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.1</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.0.BETA-1</version>
    </dependency>

    <!-- Spring 支援 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>4.3.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>4.2.5.RELEASE</version>
    </dependency>

    <!-- 資料庫連線池 Druid -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.0.26</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.25</version>
    </dependency>

    <!-- Web 相關 -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.0.1</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.2</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>

    <!-- 工具庫 -->
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.3</version>
    </dependency>
</dependencies>

Web 部署描述檔 (web.xml)

<web-app>
    <!-- Spring 容器啟動 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-mybatis.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- Spring MVC DispatcherServlet -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
        <async-supported>true</async-supported>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

Spring MVC 配置 (spring-mvc.xml)

<beans xmlns="https://www.springframework.org/schema/beans"
    xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="https://www.springframework.org/schema/context"
    xmlns:mvc="https://www.springframework.org/schema/mvc"
    xsi:schemaLocation="...">

    <!-- 掃描 Controller -->
    <context:component-scan base-package="com.xxx">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
    </context:component-scan>

    <!-- 註解驅動 -->
    <mvc:annotation-driven />

    <!-- 靜態資源處理 (配合 url-pattern: /) -->
    <mvc:default-servlet-handler />
    <mvc:resources mapping="/static/**" location="/static/" />

    <!-- 視圖解析器 -->
    <bean id="defaultViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:order="1">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="contentType" value="text/html"/>
        <property name="prefix" value=""/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!-- 異常處理 -->
    <bean id="exceptionHandlerExceptionResolver" class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver"/>

    <!-- 檔案上傳 -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="UTF-8"/>
    </bean>
</beans>

MyBatis 整合配置 (spring-mybatis.xml)

<beans xmlns="https://www.springframework.org/schema/beans"
    xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="https://www.springframework.org/schema/aop"
    xmlns:tx="https://www.springframework.org/schema/tx"
    xmlns:context="https://www.springframework.org/schema/context"
    xsi:schemaLocation="...">

    <!-- Druid 資料源 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/springtest"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>

    <!-- 事務管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- SqlSessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="mapperLocations" value="classpath:com/xxx/**/mapper/*.xml"/>
    </bean>

    <!-- Mapper 掃描器 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.xxx"/>
        <property name="markerInterface" value="com.xxx.MybatisMapper"/>
    </bean>

    <!-- 事務通知 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="list*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
        </tx:attributes>
    </tx:advice>

    <!-- AOP 事務切面 -->
    <aop:config expose-proxy="true" proxy-target-class="true">
        <aop:pointcut id="txPointcut" expression="execution(* com.xxx.*..service..*+.*(..))"/>
        <aop:advisor id="txAdvisor" advice-ref="txAdvice" pointcut-ref="txPointcut"/>
    </aop:config>
</beans>

關鍵配置解析

1. 雙容器架構

  • 父容器 (ContextLoaderListener):**Service、DAO、DataSource、事務** - spring-mybatis.xml
  • 子容器 (DispatcherServlet):**Controller、ViewResolver、Interceptor** - spring-mvc.xml
  • 子容器可訪問父容器 Bean,父容器不可訪問子容器 Bean

2. MapperScannerConfigurer 兩種模式

<!-- 模式一:標記介面 (推薦,精確控制) -->
<property name="markerInterface" value="com.xxx.MybatisMapper"/>

<!-- 模式二:掃描所有介面 (簡單但可能掃描過多) -->
<property name="basePackage" value="com.xxx.mapper"/>

3. 事務傳播行為對照

方法前綴傳播行為唯讀適用場景
get/find/list*SUPPORTStrue單次查詢、多表聯查只讀
save/update/delete/insert*REQUIREDfalse寫操作、需事務保證
其他 *REQUIREDfalse預設寫操作

4. Druid 連線池優勢

  • 內建監控統計 (SQL 執行時間、慢查詢)
  • 防火牆偵測、連線洩漏偵測
  • 支援 PSCache、PreparedStatement 緩存

常見問題排查

  1. Mapper 找不到:檢查 mapperLocations 路徑、命名空間對應、介面方法簽名
  2. 事務不生效:確認 proxy-target-class="true" (CGLIB 代理)、Service 類非 final、方法非 private
  3. 中文亂碼:web.xml 配置 CharacterEncodingFilter、資料庫 URL 加 characterEncoding=utf8
  4. 循環依賴:@Autowired 建構子注入改為 Setter/Field 注入、或 @Lazy

註解式配置對應 (Java Config)

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.xxx", includeFilters = @Filter(Controller.class))
@EnableTransactionManagement
@MapperScan(basePackages = "com.xxx.mapper", markerInterface = MybatisMapper.class)
public class AppConfig extends WebMvcConfigurerAdapter {
    @Bean public DataSource dataSource() { ... }
    @Bean public SqlSessionFactoryBean sqlSessionFactory() { ... }
    @Bean public DataSourceTransactionManager transactionManager() { ... }
    @Bean public InternalResourceViewResolver viewResolver() { ... }
}

總結

SpringMVC + MyBatis 整合核心在於:**雙容器分層、SqlSessionFactory 整合 DataSource、Mapper 掃描、AOP 宣告式事務**。掌握 XML 配置原理後,可平滑遷移至 Spring Boot 自動配置 (@SpringBootApplication + mybatis-spring-boot-starter) 享受零配置開發體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved