基本流程

实现目标

一个基于 SSM 整合的 CRUD,并使用 Mybatis-Generator 自动生成数据库代码。bootstrap 和 jQuery 作为前端框架。

导入包

  1. 三大框架的核心包 Spring-Core Spring-WebMVC Mybatis

  2. 用于自动分页的 Pagehelper ,生成代码的 Mybatis-Generator-Core

  3. 数据库原生的 Mysql-Connector-Java 数据库连接池 c3p0

  4. 实现 jsp 中 JSTL 标签语言的 JSTL 库

Spring 和 SpringMVC 配置

Spring

在 Web.xml 中配置一启动服务器就创建 Spring 容器的 Listener 和指定 Spring 配置文件位置的 context-param 。

1
2
3
4
5
6
7
 <context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

contextLoaderListener 监听启动后执行内容:

Initialize Spring’s web application context for the given servlet context, using the application context provided at construction time, or creating a new one according to the “contextClass” and “contextConfigLocation” context-params.

配置杂七杂八

  1. Filter 字符编码 CharacterEncodingFilter 设置初始参数,encoding=utf-8,forceRequestEncoding 和 forceResponseEncoding 都设置为 true 。拦截路径为全路径 /*
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!--字符编码过滤器-->
<filter>
<filter-name>characterEncodingFilter</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>
<init-param>
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
  1. Filter REST 风格,HiddenHttpMethodFilter,拦截路径为全路径 /*
1
2
3
4
5
6
7
8
9
<!--REST风格实现过滤器-->
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

关于两个容器分工问题

Spring 的容器是一个父容器,SpringMVC 的容器是子容器。子容器可以访问父容器而父容器不能访问子容器

所以这就决定了用于自动注入的对象必须放入 Spring 容器中(放入到 SpringMVC 容器 Spring 访问不到),而又因为 Spring 并没有区分四大组件: @Controller @Service @Component @Repository 的功能,所以虽然 SpringMVC 可以访问到 Spring 的容器,但是却无法找到 Controller 的实例。

总之就是 Controller 必须放到 SpringMVC 的容器中,其他的组件可以随意放置两个容器中。

但是一般来说我们会把其他的组件都放到 Spring 的容器中,因为 Spring 可以轻易和其他框架进行整合。

整合 Mybatis

SqlSessionFactory

整合 Mybatis 的核心就是将 SqlSessionFactory 以及 Mybatis 自动生成的 DAO 接口实现实例交给 IOC 容器进行管理。Mybatis 有和 Spring 的整合包: Mybatis-Spring.jar。

Spring 中配置实现了 BeanFactory 接口的 SqlSessionFactoryBean 实例加入 IOC 容器中,负责获取 SqlSessionFactory。

1
2
3
4
5
6
<!--实现了BeanFactory,调用getBean() 返回 sqlSessionFactory 用于获取连接-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:Mybatis-config.xml" />
<property name="dataSource" ref="pooledDataSource" />
<property name="mapperLocations" value="classpath:space.xorex.SSM_CRUD.DAO*" /> <!--将Mapper和映射文件放到同级目录下面-->
</bean>

DAO 接口实现

MapperScannerConfigurer 扫描 DAO 中规定的接口,并加入 IOC 容器中。

1
2
3
4
5
<!-- 将Mybatis生成的DAO接口实现类加入 IOC 容器中-->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--扫描所有 DAO 接口的实现-->
<property name="basePackage" value="space.xorex.SSM_CRUD.DAO"/>
</bean>

事务控制

基于命名空间

这里使用 Spring 的 tx 包和 aop 功能实现事务的控制,

首先使用 tx 注解进行配置确定对于被标注使用 AOP 功能的方法中,哪些是需要进行事务管理的。

1
2
3
4
5
6
7
8
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 选择控制事务的方法 -->
<tx:method name="*"/>
<!-- 搞个 get 优化 -->
<tx:method name="get*" read-only="true" />
</tx:attributes>
</tx:advice>

然后就是配置 AOP 的切入点表达式,声明哪些包下面的哪些类的哪些方法需要进行 AOP 管理,其实就是 DAO 包下面所有接口的所有方法,同时将事务管理配置的 AOP 配置进行一个整合。

1
2
3
4
5
6
<aop:config>
<!--配置切入点表达式-->
<aop:pointcut id="txPoint" expression="execution(public * space.xorex.SSM_CRUD..*(..))"/>
<!--配置事务增强,也就是将 AOP 和 TX 所选择的方法进行一个整合-->
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"/>
</aop:config>

基于注解

直接无脑标注 @Trancational 即可。

然后在 Spring 中进行扫描,真的是方便极了!!!

1
<tx:annotation-driven transaction-manager="transactionManager"/>

增删查改

决定自己写 SQL,来锻炼对 MyBatis 和 SQL 语句的熟练程度!!!