手把手教你搭建与整合SSM框架(文末附源码)(Spring MVC + Spring + MyBatis)

版权声明:转载注明出处 https://blog.csdn.net/czr11616/article/details/83861736

目录

1.导入jar包

2.项目目录总览

3.配置Spring IoC容器

4.连接数据库配置

5.集成mybatis环境

5.1配置映射器 

5.2创建Mapper接口

5.3创建数据库表和实体类

6.整合Spring MVC

6.1配置 dispatcherServlet

扫描二维码关注公众号,回复: 4409255 查看本文章

6.2创建控制器controller

6.3创建视图

7.SSM测试

8.源码地址


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的驱动包:

这里有几点需要注意:

  1. 要特别注意jar包的版本,不同版本的jar包之间可能会有版本冲突问题,例如mytatis-3.4.2和mybatis-spring-1.2.5会有冲突,不注意到后面报错会很难排查,建议读者先按博主的jar包版本下载。
  2. 还是jar包的版本,mysql驱动包6版本之前连接数据库会有不同,后面会有提到,还是建议读者和博主版本一致。
  3. 细心的读者可能会发现myBatis的jar包怎么会有两个?这是因为在spring3发布的时候,myBatis3还没有完成,所以spring并不支持myBatis3,故MyBatis社区就自己开发了MyBatis-Spring项目用以支持spring。
  4. 在本例中除去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 

欢迎留言讨论指正......^_^...... 

猜你喜欢

转载自blog.csdn.net/czr11616/article/details/83861736