在之前我们分别学习了 Spring、Spring 和 MyBatis 这三部分内容,这三个框架连接起来就是 SSM。
1、SSM 整合的思路
SSM 由三部分组成,所以看起来它们的连接有点复杂,但是 Spring 和 SpringMVC 属于一个生态环境。所以 Spring 和 SpringMVC 可以无缝连接,我们主要将 Spring 和 MyBatis 进行整合。
- 首先我们要先搭建整合的环境
- 然后搭建 Spring 环境
- 再使用Spring整合SpringMVC框架
- 之后使用Spring整合MyBatis框架
2、环境准备
想要创建一个 SSM 项目,我们先要进行一些准备工作,例如数据库的创建,项目的创建,实体类的编写和 dao 层 service 层的编写等等。
-
创建数据库:
-
创建项目后进行实体类的编写:
-
Dao 层的编写:
-
Service 层的编写:
-
Service 层实现类的编写:
我们省略了 Dao 层的实现类,是因为在之后由 MyBatis 的映射文件代替,所以这里直接省略。
3、Spring框架代码的编写
-
引入涉及的 jar 包:SSM 涉及的所有 jar 一次性全部引用,通过在 pow.xml 文件中直接导入 Maven 坐标:
-
修改 Service 层实现类的代码:主要给 Service 层实现类的控制权交给 Spring 框架。
-
编写 Spring 的配置文件 :在resources资源文件中创建 applicationContext.xml 的配置文件,并写入一下内容。配置文件的整合都是在这个文件进行的,会在这个文件内引入其他的配置文件。
4、SpringMVC框架代码的编写
-
修改 Service 层实现类代码:
-
编写 Controller 类代码:
-
编写 SpringMVC 的配置文件:
-
在web.xml中配置前端控制器:DispatcherServlet 前端控制器是 SpringMVC的关键,我们需要在web.xml配置文件中进行配置
-
SpringMVC与Spring整合:将上述所有过程,只是编写了Spring 和 SpringMVC 的代码,并没有将其整合在一起。在 web.xml 配置文件中使用 SpringMVC 提供的监听器类加载 spring 配置文件
-
配置乱码过滤器:在 web.xml 配置 Spring 提供的乱码过滤器。
-
修改 Spring 配置文件:在 applicationContext.xml 配置文件中,配置过组件扫描,扫描的是包下的全部内容,但是为了区分配置文件,我们将 SpringMVC 的包扫描交由 SpringMVC 去配置。
通过上述几个步骤,我们将 SpringMVC与Spring整合已经整合完毕。但是在 SpringMVC 中还可以添加异常处理器,那些配置都需要在 SpringMVC 的配置文件中进行配置。
5、MyBatis框架代码的编写
因为在开始已经引入了全部 jar 包,这里不在引用所需要的资源包。
-
修改 Dao 层接口的名称:将 Dao 层原先以 Dao 为后缀的接口全部改为以 Mapper 为后缀,Dao 层的包名也可以修改。
-
创建 MyBatis 的配置文件:在单独使用 MyBatis 时,MyBatis 的配置文件需要配置很多内容。但是在 ssm 中,很多配置会通过 Spring 配置文件进行配置。
-
创建 MyBatis 的映射文件:
-
在 Spring 中配置数据库连接池:在单独使用 MyBatis 时,我们通过
environments
元素定义数据源,而在 ssm 中,我们可以通过 Spring 的配置文件配置数据源。
-
在Spring 中配置 SqlSessionFactory 工厂:在单独使用 MyBatis 时,我们通过代码创建 SqlSessionFactory 对象,而在 ssm 中,我们可以通过 Spring 的配置文件配置 SqlSessionFactory 对象。
-
在Spring 中配置映射文件地址:在单独使用 MyBatis 时,我们通过
mappers
元素配置映射文件,而在 ssm 中,我们可以通过 Spring 的配置文件配置映射文件。
-
修改 Spring 的配置文件:本来 Spring 和 MyBatis 的整合代码要在 applicationContext.xml 配置文件中编写,但是为了区分 Spring 和 MyBatis 的配置内容,将 MyBatis 的配置内容提取出来。
6、整合过程中的踩雷
ssm 的整合历经近十个小时,遇见各种各样的问题,下面就我遇到的问题做过总结。
<!--配置sessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<!--加载mybatis核心文件-->
<property name="configLocation" value="classpath:conf/mybatis_config.xml"></property>
<!--加载mybatis映射文件-->
<property name="mapperLocations" value="classpath:com/itlong/Mapper/*.xml"/>
</bean>
<!--扫描mapper所在的包 为 mapper 创建实现类-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.itlong.Dao"></property>
</bean>
这段配置主要用于将 Spring 和 MyBatis 进行整合,特别需要注意的是
<property name="configLocation" value="classpath:conf/mybatis_config.xml"></property>
:这段配置主要是指定 MyBatis 的配置文件<property name="mapperLocations" value="classpath:com/itlong/Mapper/*.xml"/>
:这段配置主要是指定 MyBatis 的映射文件<property name="basePackage" value="com.itlong.Dao">
:这段配置是指定 Dao 层接口所在的报名,Dao 层包可能会修改为 Mapper 包名,但是不管怎么修改包名,记住basePackage
属性是定义接口的报名
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itlong.Dao.UserMapper">
<!-- 根据 id 查询用户信息 User selectByID(int id); -->
<select id="selectByID" resultType="user">
select * from user where id = #{id}
</select>
</mapper>
这段代码的映射文件,特别需要注意的是:
namespace="com.itlong.Dao.UserMapper"
:属性值一定要和接口的全限定名一致。例如,假设UserDao(或者 UserMapper)
接口存放在com.XXX.Dao(或者 com.XXX.Mapper)
包下,那么这里的属性值就是一定是com.XXX.Dao.UserDao(或者 com.XXX.Mapper.UserMapper)
。- 映射文件存放的地址:最后在映射文件存放在目标的 resources 资源文件夹下,并将映射文件存放在
com.XXX.Mapper
包下。
在使用 c3p0 数据源时,遇到如下问题:
在解决这个问题时,我查阅了大大小小的博客,最后的解决方案是在jdbc 的资源文件中添加useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=UTC
和每个属性名前添加jdbc.
:
#我们定义一个 jdbc.properties 资源文件
#useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=UTC
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=UTC
jdbc.username=root
jdbc.password=123456
3.2.8
在解决完数据库连接问题,在具体调用映射语句有遇到报错:
这个报错是因为 mysql 驱动和 MyBatis 驱动两个包的版本不匹配,需要寻找对应版本。
上述问题是博主进行整合遇到的问题,一些解决方案只适用于本人。
附具体代码项目资源。