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

Spring MVC + Spring + MyBatis (SSM) 整合實戰:Maven 多模塊架構、註解驅動與事務管理

     編輯:Java 綜合教學

項目結構設計

ssm-project/
├── src/main/java
│   └── com.lee.ssm
│       ├── action      # Controller 層
│       ├── bean        # 實體類
│       ├── dao.mapper  # Mapper 接口(動態代理)
│       ├── service     # Service 接口
│       └── service.impl# Service 實現
├── src/main/resources
│   ├── spring/         # Spring 配置
│   │   ├── applicationContext.xml        # 核心:數據源、事務
│   │   ├── applicationContext-dao.xml    # MyBatis 整合
│   │   ├── applicationContext-service.xml# 業務 Bean(可省略,掃描註解)
│   │   └── springmvc.xml                 # MVC 配置
│   ├── mybatis/
│   │   └── SqlMapConfig.xml              # MyBatis 全局配置
│   ├── db.properties                     # 數據庫參數
│   └── log4j.properties                  # 日誌配置
└── src/main/webapp
    └── WEB-INF
        ├── views/        # JSP 視圖
        └── web.xml       # 部署描述符

Maven 核心依賴

<properties>
    <spring.version>3.2.3.RELEASE</spring.version>
    <mybatis.version>3.2.3</mybatis.version>
    <mybatis-spring.version>1.2.3</mybatis-spring.version>
</properties>

<dependencies>
    <!-- Spring Core -->
    <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency>
    <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency>
    <dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency>
    
    <!-- MyBatis -->
    <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>${mybatis.version}</version></dependency>
    <dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>${mybatis-spring.version}</version></dependency>
    
    <!-- 數據庫 -->
    <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.38</version></dependency>
    <dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>1.4</version></dependency>
    <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.18</version></dependency>
    
    <!-- JSON -->
    <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.1.34</version></dependency>
    <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.2.2</version></dependency>
</dependencies>

核心配置文件解析

1. applicationContext.xml:數據源與聲明式事務

<context:property-placeholder location="classpath:db.properties" />

<!-- Druid 數據源(推薦替換 DBCP)-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" 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="${jdbc.maxActive}" />
</bean>

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

<!-- 事務通知:方法名模式匹配傳播行為 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="save*" propagation="REQUIRED" />
        <tx:method name="insert*" propagation="REQUIRED" />
        <tx:method name="update*" propagation="REQUIRED" />
        <tx:method name="delete*" propagation="REQUIRED" />
        <tx:method name="find*" propagation="SUPPORTS" read-only="true" />
        <tx:method name="get*" propagation="SUPPORTS" read-only="true" />
    </tx:attributes>
</tx:advice>

<!-- AOP 織入:切面表達式匹配 Service 實現層 -->
<aop:config>
    <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.lee.ssm.service.impl.*.*(..))" />
</aop:config>

2. applicationContext-dao.xml:MyBatis-Spring 整合

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

<!-- Mapper 掃描器:自動代理註冊 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
    <property name="basePackage" value="com.lee.ssm.dao.mapper" />
</bean>

3. springmvc.xml:註解驅動與視圖解析

<context:component-scan base-package="com.lee.ssm" />
<mvc:annotation-driven />
<mvc:resources mapping="/resources/**" location="/resources/" />

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
</bean>

4. SqlMapConfig.xml:MyBatis 全局配置

<configuration>
    <typeAliases>
        <package name="com.lee.ssm.bean" /> <!-- 批量別名 -->
    </typeAliases>
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true" /> <!-- 下劃線轉駝峰 -->
    </settings>
</configuration>

代碼實現層

實體類

public class User {
    private int id;
    private String username;
    private int age;
    private String sex;
    // getter/setter/toString
}

Mapper 接口與 XML

// UserMapper.java
public interface UserMapper {
    User findUserById(int id);
    int insertUser(User user);
    void deleteUser(int id);
    void updateUser(User user);
}

// UserMapper.xml
<mapper namespace="com.lee.ssm.dao.mapper.UserMapper">
    <select id="findUserById" resultType="User">
        SELECT * FROM user WHERE id = #{id}
    </select>
    <insert id="insertUser" parameterType="User">
        INSERT INTO user(username, sex) VALUES(#{username}, #{sex})
    </insert>
    <update id="updateUser" parameterType="User">
        UPDATE user SET username=#{username}, sex=#{sex} WHERE id=#{id}
    </update>
    <delete id="deleteUser" parameterType="int">
        DELETE FROM user WHERE id=#{id}
    </delete>
</mapper>

Service 與 Controller

@Service("userService")
public class UserServiceImpl implements IUserService {
    @Resource UserMapper userMapper;
    
    @Override
    public User findUserById(int id) {
        return userMapper.findUserById(id);
    }
    
    @Override
    @Transactional // 也可依賴 AOP 配置
    public void displayUser() {
        userMapper.insertUser(new User("Nathan", 18, "女"));
        userMapper.deleteUser(1001);
        userMapper.updateUser(new User("Lee", 22, "男"));
    }
}

@Controller
@RequestMapping("/root")
public class HelloController {
    @Resource IUserService userService;
    
    @RequestMapping("/hello")
    public String home(Model model) {
        User user = userService.findUserById(1);
        model.addAttribute("username", user.getUsername());
        return "home"; // 對應 /WEB-INF/views/home.jsp
    }
}

web.xml 核心配置

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring/applicationContext.xml,classpath:spring/applicationContext-*.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param>
</filter>
<filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

<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/springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

現代化升級建議

  • Spring Boot 2.x/3.x:自動配置、Starter、內嵌容器、Actuator 監控
  • MyBatis-Plus:通用 CRUD、分頁、代碼生成器、條件構造器
  • Druid 替換 DBCP:監控、防火牆、SQL 審計
  • 註解事務 @Transactional 替換 XML AOP
  • 多模塊 Maven:api、service、web 分離,依賴倒置

GitHub 完整代碼:https://github.com/leechenxiang/maven-ssm-hello

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