目录
1.导入jar包
为了使初学者减少不必要的学习阻碍,本例采用手动导入jar包(不使用maven),在你的web工程的WEB-INF/lib目录下导入如下jar包
这里给出各jar包的下载地址:
spring和spring-mvc:https://repo.spring.io/release/org/springframework/spring/
myBatis:https://github.com/mybatis/mybatis-3/releases
mybatis-spring:https://github.com/mybatis/spring/release
如果不想在官网找的话,其他jar包均可以在mvn仓库中搜索到,地址:https://mvnrepository.com/,例如mysql的驱动包:
这里有几点需要注意:
- 要特别注意jar包的版本,不同版本的jar包之间可能会有版本冲突问题,例如mytatis-3.4.2和mybatis-spring-1.2.5会有冲突,不注意到后面报错会很难排查,建议读者先按博主的jar包版本下载。
- 还是jar包的版本,mysql驱动包6版本之前连接数据库会有不同,后面会有提到,还是建议读者和博主版本一致。
- 细心的读者可能会发现myBatis的jar包怎么会有两个?这是因为在spring3发布的时候,myBatis3还没有完成,所以spring并不支持myBatis3,故MyBatis社区就自己开发了MyBatis-Spring项目用以支持spring。
- 在本例中除去log4j日志包以外都是必须包!
2.项目目录总览
在这里先给出整个ssm整合与测试的结构图,目的是为了使读者能够全局的有一个大概印象,也方便在后续的搭建过程中能够回到这里查漏补缺,读者这里不需要知道每个文件含义,之后都会说明,如下图:
3.配置Spring IoC容器
IoC(Inversion of Control ),即控制反转,是spring的核心。什么是控制反转呢?简单来说就是原来由你自己创建并控制的java对象现在交由spring内的容器来控制并管理,即控制权被反转了,而这个容器就是IoC容器。
而配置IoC容器,就是往这个容器中提前放入我们项目中可能会用到的各种对象,什么时候用,什么时候再取出来(是不是很方便???),通常我们有两种方式来配置,一个是xml文件配置,一个是注解配置。对于第三方的类,我们通常通过xml配置,对于我们自己创建的类,我们通常通过注解进行配置。
在src的根目录下新建applicationContext.xml文件(重要部分均做了注释)
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd"> <!-- 引入jdbc配置文件 --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="classpath:jdbc.properties"/> </bean> <!-- 配置数据库连接池 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.mysql.driver}"/> <property name="url" value="${jdbc.mysql.url}"/> <property name="username" value="${jdbc.mysql.username}"/> <property name="password" value="${jdbc.mysql.password}"/> <property name="initialSize" value="${jdbc.initialSize}"/> <property name="minIdle" value="${jdbc.minIdle}"/> <property name="maxIdle" value="${jdbc.maxIdle}"/> <property name="maxActive" value="${jdbc.maxActive}"/> <property name="maxWait" value="${jdbc.maxWait}"/> <property name="defaultAutoCommit" value="${jdbc.defaultAutoCommit}"/> <property name="removeAbandoned" value="${jdbc.removeAbandoned}"/> <property name="removeAbandonedTimeout" value="${jdbc.removeAbandonedTimeout}"/> <property name="testWhileIdle" value="${jdbc.testWhileIdle}"/> <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}"/> <property name="numTestsPerEvictionRun" value="${jdbc.numTestsPerEvictionRun}"/> <property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}"/> </bean> <!-- 集成mybatis环境 --> <bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 关联数据库连接池 --> <property name="dataSource" ref="dataSource"/> <!-- 指定mybatis配置文件 --> <property name="configLocation" value = "classpath:sqlMapConfig.xml"/> </bean> <!-- 启用扫描机制,并指定扫描对应的包 --> <context:annotation-config/> <context:component-scan base-package="com.ssm.*"/> <!-- 采用自动扫描方式创建mapper bean操作数据库 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="SqlSessionFactoryBeanName" value="SqlSessionFactory"/> <property name="basePackage" value="com.ssm.mapper"/> <!-- 指定标注才扫描成为mapper bean--> <property name="annotationClass" value="org.springframework.stereotype.Repository"/> </bean> <!-- 配置数据源事务管理器 --> <bean id ="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 使用注解定义事务--> <tx:annotation-driven transaction-manager="transactionManager"/> </beans>
4.连接数据库配置
观察IoC容器的配置我们发现引入了jdbc配置文件,文件中对数据库连接的一些属性进行了设置。
这里需要注意的是,从mysql-connector-java-6开始,驱动的名称变成了“com.mysql.cj.jdbc.Driver”,并且数据库连接地址也需要加上时区(serverTimezone)和useSSL属性。
在src根目录下新建jdbc.properties文件,如下:
jdbc.properties
#============================================================================
# MySQL
#============================================================================
jdbc.mysql.driver=com.mysql.cj.jdbc.Driver
jdbc.mysql.url=jdbc:mysql://127.0.0.1:3306/ssm?characterEncoding=utf-8&serverTimezone=UTC&useSSL=false
jdbc.mysql.username=root
jdbc.mysql.password=123
jdbc.initialSize=5
jdbc.minIdle=5
jdbc.maxIdle=20
jdbc.maxActive=100
jdbc.maxWait=100000
jdbc.defaultAutoCommit=false
jdbc.removeAbandoned=true
jdbc.removeAbandonedTimeout=600
jdbc.testWhileIdle=true
jdbc.timeBetweenEvictionRunsMillis=60000
jdbc.numTestsPerEvictionRun=20
jdbc.minEvictableIdleTimeMillis=300000
我们观察IoC配置文件,在引入了jdbc配置文件后,开始进行了数据库连接池的配置,其中<property>标签的value值是从引入的jdbc配置中得到的。连接数据库配置的目的是为了之后整合myBatis框架。
5.集成mybatis环境
继续回到IoC配置文件,配置完数据库连接池以后开始集成mybatis,首先需要关联之前配置的数据库连接池,之后引入mybatis配置文件。
在src根目录下新建文件sqlMapConfig.xml,如下:
sqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!-- 这个配置使全局的映射器启用或禁用缓存 -->
<setting name="cacheEnabled" value="true"/>
<!-- 允许jdbc支持生成的键 -->
<setting name="useGeneratedKeys" value="true"/>
<!-- 配置默认的执行器 -->
<setting name="defaultExecutorType" value="REUSE"/>
<!-- 全局启用或禁用延迟加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 设置超时时间,它决定驱动等待一个数据库响应的时间 -->
<setting name="defaultStatementTimeout" value="25000"/>
</settings>
<!-- 别名配置 -->
<typeAliases>
<typeAlias alias="role" type="com.ssm.pojo.Role"/>
</typeAliases>
<!-- 指定映射器路径 -->
<mappers>
<mapper resource="com/ssm/sqlMapper/RoleMapper.xml"/>
</mappers>
</configuration>
5.1配置映射器
观察sqlMapConfig.xml配置文件,我们发现在最后引入了映射器配置文件,映射器的作用是创建实体类与数据库表之间的一种映射关系,同时在映射器中写入操作数据库的sql语句。
新建com/ssm/sqlMapper包,在包下新建RoleMapper.xml配置文件,如下:
RoleMapper.xml
<?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.ssm.mapper.RoleMapper">
<select id="getRole" parameterType="long" resultType="role">
SELECT id,role_name as roleName,note FROM t_role WHERE ID = #{id}
</select>
<insert id="insertRole" useGeneratedKeys="true" keyProperty="id">
insert into t_role (role_name,note)
values (#{roleName},#{note})
</insert>
<update id="updateRole">
update t_role set
role_name = #{roleName},
note = #{note}
where id = #{id}
</update>
<delete id="deleteRole">
delete from t_role where id = #{id}
</delete>
</mapper>
5.2创建Mapper接口
有了映射器还不够,mybatis操作数据库还需要接口
新建com.ssm.mapper包,新建接口RoleMapper,如下:
接口com.ssm.mapper.RoleMapper
package com.ssm.mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import com.ssm.pojo.Role;
@Repository
public interface RoleMapper {
public int insertRole(Role role);
public int deleteRole(@Param("id") Long id);
public int updateRole(Role role);
public Role getRole(@Param("id") Long id);
}
5.3创建数据库表和实体类
至此mybatis的配置已经全部完成,但要操作数据库我们还需要实体类和数据库表
实体类(角色):com.ssm.pojo.Role
package com.ssm.pojo;
public class Role {
private Long id;
private String roleName;
private String note;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
}
}
数据库表:t_role
6.整合Spring MVC
如果你的web项目使用的是servlet3.0标准,那么你的项目WEB-INF/目录下是没有web.xml配置文件的,这时你要手动在WEB-INF/目录下创建web.xml配置文件,如下
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<!-- 配置spring ioc配置文件路径 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/classes/applicationContext.xml</param-value>
</context-param>
<!-- 配置contextLoaderListener用以初始化spring ioc容器 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!-- 配置dispatcherServlet -->
<servlet>
<!-- 注意:spring mvc框架会根据servlet-name配置,找到/WEB-INF/dispatcher-servlet.xml作为配置文件载入web工程中 -->
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 使得dispatch在服务器启动的时候就初始化 -->
<load-on-startup>2</load-on-startup>
</servlet>
<!-- servlet拦截配置 -->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
观察以上配置文件发现引入了我们之前配置的IoC配置文件,使得项目启动的时候能初始化IoC容器,同时配置文件中引入了dispatcherServlet配置文件 ,dispathcerServlet是spring mvc的核心,对到来的请求进行处理和调度。
6.1配置 dispatcherServlet
在WEB-INF/目录下新建dispatcher-servlet.xml配置文件
dispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<!-- 使用注解驱动 -->
<mvc:annotation-driven/>
<!-- 定义扫描装载的包 -->
<context:component-scan base-package="com.*"/>
<!-- 定义视图解析器 -->
<!-- 找到web工程/WEB-INF/jsp文件夹,且文件结尾为.jsp的文件作为映射 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/>
<!-- 开启注解事务-->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
转发器配置文件中主要配置了解析器,根据你的请求分发到指定目录的视图进行解析。
6.2创建控制器controller
新建包com.ssm.controller,新建java类RoleController.class:
package com.ssm.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import com.ssm.pojo.Role;
import com.ssm.service.RoleService;
@Controller
//请求在"/role"路径下才执行此控制器
@RequestMapping("/role")
public class RoleController {
@Autowired
private RoleService roleService = null;
//请求在getRole路径下此方法才执行
@RequestMapping(value="/getRole",method=RequestMethod.GET)
public ModelAndView getRole(@RequestParam("id") Long id) {
Role role = roleService.getRole(id);
ModelAndView mv = new ModelAndView();
mv.setViewName("roleDetails");
mv.addObject("role", role);
return mv;
}
}
控制器接受请求参数取出role存入模型中并转发到指定视图(这里是roleDetails)进行解析。
6.3创建视图
根据视图解析器的配置,我们在WEB-INF/目录下新建文件夹jsp,同时新建jsp页面roleDetails.jsp:
roleDetails.jsp
<%@ page pageEncoding="utf-8"%>
<html>
<head>
<meta charset="UTF-8">
<title>ssm框架测试</title>
</head>
<body>
<b>角色名称:</b><span>${role.roleName}</span><br/>
<b>角色描述:</b><span>${role.note}</span>
</body>
</html>
jsp页面中我们通过el表达式对数据进行展示。
7.SSM测试
到这里ssm的整合就全部完成了,我们开始进行测试,从数据库中取出角色信息返回到jsp页面中进行展示
新建com.ssm.service和com.ssm.service.impl包,分别创建RoleService接口和RoleServiceImpl实现类:
RoleService接口
package com.ssm.service;
import com.ssm.pojo.Role;
public interface RoleService {
public Role getRole(Long id);
}
RoleServiceImpl实现类
package com.ssm.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.ssm.mapper.RoleMapper;
import com.ssm.pojo.Role;
import com.ssm.service.RoleService;
@Service//表示此类将自动注册到spring容器中去(前提是已经在xml配置文件中启用了扫描)
public class RoleServiceImpl implements RoleService {
@Autowired
private RoleMapper roleMapper = null;
@Override
public Role getRole(Long id) {
return roleMapper.getRole(id);
}
}
到这里启动tomcat服务器,输入请求:http://localhost:8080/project-181107-ssm/role/getRole.do?id=1,得到页面:
执行成功,ssm整合成功!!!!
在这里我简单梳理一下这个测试的整个执行流程:
页面发出请求,通过dispatcherServlet分发到指定的controller进行响应,controller接收请求参数,根据参数,通过service到数据库中取出对应id的Role,之后控制器将得到的Role对象装进ModelAndView(模型与视图)中,之后将ModelAndView对象返回给指定的视图(jsp页面),页面通过EL表达式得到Role对象的信息并展示出来。
controller中的RoleService内部是通过我们之前配置的RoleMapper接口去数据库中取出数据的,同时我们把数据库操作的Mapper接口都放入了Spring IoC容器中,至此整个SSM框架都联通起来了。
8.源码地址
链接:https://pan.baidu.com/s/1lpkIf_PSQbY4lJvGX-hZ1A
提取码:mj2r
欢迎留言讨论指正......^_^......