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 # 部署描述符
<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>
<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>
<!-- 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>
<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>
<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
}
// 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("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
}
}
<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>
@Transactional 替換 XML AOPGitHub 完整代碼:https://github.com/leechenxiang/maven-ssm-hello