关于ssm:超全的SSM三大框架整合教程SpringSpringMVCMyBatis

28次阅读

共计 15828 个字符,预计需要花费 40 分钟才能阅读完成。

这次,说说 三大框架整合过程。集体认为应用框架并不是很难,要害要了解其思维,这对于咱们进步编程程度很有帮忙。不过,如果用都不会,谈思维就变成夸夸其谈了!!!先技术,再思维。实际出真知。上面就一起学习!!!

无关 SSM 整合不懂得能够观看此视频教程:https://www.bilibili.com/video/BV1Ug4y1i7W7

一、基本概念

1、Spring

Spring 是一个开源框架,Spring 是于 2003 年衰亡的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著述 Expert One-On-One J2EE Development and Design 中论述的局部理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创立的。Spring 应用根本的 JavaBean 来实现以前只可能由 EJB 实现的事件。然而,Spring 的用处不仅限于服务器端的开发。从简略性、可测试性和松耦合的角度而言,任何 Java 利用都能够从 Spring 中受害。简略来说,Spring 是一个轻量级的管制反转(IoC)和面向切面(AOP)的容器框架。

2、SpringMVC

Spring MVC 属于 SpringFrameWork 的后续产品,曾经交融在 Spring Web Flow 外面。Spring MVC 拆散了控制器、模型对象、分派器以及处理程序对象的角色,这种拆散让它们更容易进行定制。

3、MyBatis

MyBatis 本是 apache 的一个开源我的项目 iBatis, 2010 年这个我的项目由 apache software foundation 迁徙到了 google code,并且改名为 MyBatis。MyBatis 是一个基于 Java 的长久层框架。iBATIS 提供的长久层框架包含 SQL Maps 和 Data Access Objects(DAO)MyBatis 打消了简直所有的 JDBC 代码和参数的手工设置以及后果集的检索。MyBatis 应用简略的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,一般的 Java 对象)映射成数据库中的记录。

二、开发环境搭建

三、Maven Web 我的项目创立

四、SSM 整合

上面次要介绍三大框架的整合,至于环境的搭建以及我的项目的创立,参看下面的博文。这次整合我分了 2 个配置文件,别离是 spring-mybatis.xml,蕴含 spring 和 mybatis 的配置文件,还有个是 spring-mvc 的配置文件,此外有 2 个资源文件:jdbc.propertis 和 log4j.properties。残缺目录构造如下:

应用框架都是较新的版本:

Spring 4.0.2 RELEASE

Spring MVC 4.0.2 RELEASE

MyBatis 3.2.6

1、Maven 引入须要的 JAR 包

为了不便前面说的时候不须要引入 JAR 包,我这里 间接给出所有须要的 JAR 包,这都是根本的 JAR 包,每个包的是干什么的都有正文,就不再多说了。

pom.xml

<properties>
    <!-- spring 版本号 -->
    <spring.version>4.0.2.RELEASE</spring.version>
    <!-- mybatis 版本号 -->
    <mybatis.version>3.2.6</mybatis.version>
    <!-- log4j 日志文件治理包版本 -->
    <slf4j.version>1.7.7</slf4j.version>
    <log4j.version>1.2.17</log4j.version>
  </properties>
 
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <!-- 示意开发的时候引入,公布的时候不会加载此包 -->
      <scope>test</scope>
    </dependency>
    <!-- spring 外围包 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring.version}</version>
    </dependency>
 
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-oxm</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>${spring.version}</version>
    </dependency>
 
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</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-aop</artifactId>
      <version>${spring.version}</version>
    </dependency>
 
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>${spring.version}</version>
    </dependency>
 
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!-- mybatis 外围包 -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>${mybatis.version}</version>
    </dependency>
    <!-- mybatis/spring 包 -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.2.2</version>
    </dependency>
    <!-- 导入 java ee jar 包 -->
    <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-api</artifactId>
      <version>7.0</version>
    </dependency>
    <!-- 导入 Mysql 数据库链接 jar 包 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.30</version>
    </dependency>
    <!-- 导入 dbcp 的 jar 包,用来在 applicationContext.xml 中配置数据库 -->
    <dependency>
      <groupId>commons-dbcp</groupId>
      <artifactId>commons-dbcp</artifactId>
      <version>1.2.2</version>
    </dependency>
    <!-- JSTL 标签类 -->
    <dependency>
      <groupId>jstl</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>
    <!-- 日志文件治理包 -->
    <!-- log start -->
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>${log4j.version}</version>
    </dependency>
    
    
    <!-- 格式化对象,不便输入日志 -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.1.41</version>
    </dependency>
 
 
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>${slf4j.version}</version>
    </dependency>
 
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>${slf4j.version}</version>
    </dependency>
    <!-- log end -->
    <!-- 映入 JSON -->
    <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-mapper-asl</artifactId>
      <version>1.9.13</version>
    </dependency>
    <!-- 上传组件包 -->
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.1</version>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.4</version>
    </dependency>
    <dependency>
      <groupId>commons-codec</groupId>
      <artifactId>commons-codec</artifactId>
      <version>1.9</version>
    </dependency>
    
    
  </dependencies>

2、Spring 与 MyBatis 的整合

所有须要的 JAR 包都引入当前,首先进行 Spring 与 MyBatis 的整合,而后再进行 JUnit 测试,先看一个我的项目结构图:

1)建设 JDBC 属性文件

jdbc.properties(文件编码批改为 utf-8)


driver=com.mysql.jdbc.Driver
url=jdbc:mysql://10.221.10.111:8080/db_zsl
username=demao
password=demao
#定义初始连接数
initialSize=0
#定义最大连接数
maxActive=20
#定义最大闲暇
maxIdle=20
#定义最小闲暇
minIdle=1
#定义最长等待时间
maxWait=60000

2)建设 spring-mybatis.xml 配置文件

这个文件就是用来实现 spring 和 mybatis 的整合的。这外面也没多少行配置,次要的就是 主动扫描,主动注入,配置数据库。正文也很具体,大家看看就明确了。

spring-mybatis.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:p="http://www.springframework.org/schema/p"
  xmlns:context="http://www.springframework.org/schema/context"
  xmlns:mvc="http://www.springframework.org/schema/mvc"
  xsi:schemaLocation="http://www.springframework.org/schema/beans  
  http://www.springframework.org/schema/beans/spring-beans-3.1.xsd  
  http://www.springframework.org/schema/context  
  http://www.springframework.org/schema/context/spring-context-3.1.xsd  
  http://www.springframework.org/schema/mvc  
  http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
  <!-- 主动扫描 -->
  <context:component-scan base-package="com.cn.hnust" />
  <!-- 引入配置文件 -->
  <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="${driver}" />
    <property name="url" value="${url}" />
    <property name="username" value="${username}" />
    <property name="password" value="${password}" />
    <!-- 初始化连贯大小 -->
    <property name="initialSize" value="${initialSize}"></property>
    <!-- 连接池最大数量 -->
    <property name="maxActive" value="${maxActive}"></property>
    <!-- 连接池最大闲暇 -->
    <property name="maxIdle" value="${maxIdle}"></property>
    <!-- 连接池最小闲暇 -->
    <property name="minIdle" value="${minIdle}"></property>
    <!-- 获取连贯最大等待时间 -->
    <property name="maxWait" value="${maxWait}"></property>
  </bean>
 
  <!-- spring 和 MyBatis 完满整合,不须要 mybatis 的配置映射文件 -->
  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <!-- 主动扫描 mapping.xml 文件 -->
    <property name="mapperLocations" value="classpath:com/cn/hnust/mapping/*.xml"></property>
  </bean>
 
  <!-- DAO 接口所在包名,Spring 会主动查找其下的类 -->
  <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.cn.hnust.dao" />
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
  </bean>
 
  <!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
  <bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
  </bean>
 
</beans>

3)Log4j 的配置

为了不便调试,个别都会应用日志来输入信息,Log4j 是 Apache 的一个凋谢源代码我的项目,通过应用 Log4j,咱们能够管制 日志 信息输送的目的地是 控制台、文件、GUI 组件,甚至是套接口服务器、NT 的事件记录器、UNIX Syslog 守护过程等;咱们也能够管制每一条日志的输入格局;通过定义每一条日志信息的级别,咱们可能更加粗疏地管制日志的生成过程。

上面给出配置文件目录:

# 定义 LOG 输入级别
log4j.rootLogger=INFO,Console,File
#定义日志输入目的地为控制台
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
#能够灵便地指定日志输入格局,上面一行是指定具体的格局
log4j.appender.Console.layout = org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%c] - %m%n
 
#文件大小达到指定尺寸的时候产生一个新的文件
log4j.appender.File = org.apache.log4j.RollingFileAppender
#指定输入目录
log4j.appender.File.File = logs/ssm.log
#定义文件最大大小
log4j.appender.File.MaxFileSize = 10MB
# 输入所以日志,如果换成 DEBUG 示意输入 DEBUG 以上级别日志
log4j.appender.File.Threshold = ALL
log4j.appender.File.layout = org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n

4)JUnit 测试

通过以上步骤(到 4.2.2,log4j 不配也没影响),咱们 曾经实现了 Spring 和 mybatis 的整合,这样咱们就能够编写一段测试代码来试试是否胜利了。

创立测试用表
既然咱们须要测试,那么咱们就须要建设在数据库中建设一个测试表,这个表建的很简略,SQL 语句为:

DROP TABLE IF EXISTS `user_t`;
 
CREATE TABLE `user_t` (`id` int(11) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(40) NOT NULL,
  `password` varchar(255) NOT NULL,
  `age` int(4) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
 
/*Data for the table `user_t` */
 
insert  into `user_t`(`id`,`user_name`,`password`,`age`) values (1,'测试','sfasgfaf',24);
  • 利用 MyBatis Generator 主动创立代码

    这个可依据表主动创立实体类、MyBatis 映射文件以及 DAO 接口,当然,我 习惯将生成的接口名改为 IUserDao,而不是间接用它生成的 UserMapper。如果不想麻烦就 能够不改。实现后将文件复制到工程中。如图

  • 建设 Service 接口和实现类

目录构造:

上面给出具体的内容:

IUserService.java

package com.cn.hnust.service;
 
import com.cn.hnust.pojo.User;
 
public interface IUserService {public User getUserById(int userId);
}

UserServiceImpl.java

package com.cn.hnust.service.impl;
 
import javax.annotation.Resource;
 
import org.springframework.stereotype.Service;
 
import com.cn.hnust.dao.IUserDao;
import com.cn.hnust.pojo.User;
import com.cn.hnust.service.IUserService;
 
@Service("userService")
public class UserServiceImpl implements IUserService {
  @Resource
  private IUserDao userDao;
  @Override
  public User getUserById(int userId) {
    // TODO Auto-generated method stub
    return this.userDao.selectByPrimaryKey(userId);
  }
 
}
  • 建设测试类

    测试类 在 src/test/java 中建设,上面测试类中 正文掉的局部是不应用 Spring 时,个别状况下的一种测试方法;如果应用了 Spring 那么就能够应用注解的形式来引入配置文件和类,而后再将 service 接口对象注入,就能够进行测试了。

    如果测试胜利,示意 Spring 和 Mybatis 曾经整合胜利了。输入信息应用的是 Log4j 打印到控制台。

package org.zsl.testmybatis;
 
import javax.annotation.Resource;
 
import org.apache.log4j.Logger;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
import com.alibaba.fastjson.JSON;
import com.cn.hnust.pojo.User;
import com.cn.hnust.service.IUserService;
 
@RunWith(SpringJUnit4ClassRunner.class)   // 示意继承了 SpringJUnit4ClassRunner 类
@ContextConfiguration(locations = {"classpath:spring-mybatis.xml"})
 
public class TestMyBatis {private static Logger logger = Logger.getLogger(TestMyBatis.class);
//  private ApplicationContext ac = null;
  @Resource
  private IUserService userService = null;
 
//  @Before
//  public void before() {//    ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//    userService = (IUserService) ac.getBean("userService");
//  }
 
  @Test
  public void test1() {User user = userService.getUserById(1);
    // System.out.println(user.getUserName());
    // logger.info("值:"+user.getUserName());
    logger.info(JSON.toJSONString(user));
  }
}

测试后果:

至此,实现 Spring 和 mybatis 这两大框架的整合,上面在持续进行 SpringMVC 的整合。

3、整合 SpringMVC

下面曾经实现了 2 大框架的整合,SpringMVC 的配置文件独自放,而后在 web.xml 中配置整合。

1)配置 spring-mvc.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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd  
    http://www.springframework.org/schema/context  
    http://www.springframework.org/schema/context/spring-context-3.1.xsd  
    http://www.springframework.org/schema/mvc  
    http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
    <!-- 主动扫描该包,使 SpringMVC 认为包下用了 @controller 注解的类是控制器 -->
    <context:component-scan base-package="com.cn.hnust.controller" />
    <!-- 防止 IE 执行 AJAX 时,返回 JSON 呈现下载文件 -->
    <bean id="mappingJacksonHttpMessageConverter"
        class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>text/html;charset=UTF-8</value>
            </list>
        </property>
    </bean>
    <!-- 启动 SpringMVC 的注解性能,实现申请和注解 POJO 的映射 -->
    <bean
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="mappingJacksonHttpMessageConverter" />   <!-- JSON 转换器 -->
            </list>
        </property>
    </bean>
    <!-- 定义跳转的文件的前后缀,视图模式配置 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 这里的配置我的了解是主动给前面 action 的办法 return 的字符串加上前缀和后缀,变成一个 可用的 url 地址 -->
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>
    
    <!-- 配置文件上传,如果没有应用文件上传能够不必配置,当然如果不配,那么配置文件中也不用引入上传组件包 -->
    <bean id="multipartResolver"  
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
        <!-- 默认编码 -->
        <property name="defaultEncoding" value="utf-8" />  
        <!-- 文件大小最大值 -->
        <property name="maxUploadSize" value="10485760000" />  
        <!-- 内存中的最大值 -->
        <property name="maxInMemorySize" value="40960" />  
    </bean> 
 
</beans>

2)配置 web.xml 文件

这里面对 spring-mybatis.xml 的引入以及配置的 spring-mvc 的 Servlet 就是为了实现 SSM 整合,之前 2 框架整合不须要在此处进行任何配置。配置一样有具体正文,不多解释了。

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_3_0.xsd"
  version="3.0">
  <display-name>Archetype Created Web Application</display-name>
  <!-- Spring 和 mybatis 的配置文件 -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-mybatis.xml</param-value>
  </context-param>
  <!-- 编码过滤器 -->
  <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <async-supported>true</async-supported>
    <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>
  <!-- Spring 监听器 -->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <!-- 避免 Spring 内存溢出监听器 -->
  <listener>
    <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
  </listener>
 
  <!-- Spring MVC servlet -->
  <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-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <async-supported>true</async-supported>
  </servlet>
  <servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <!-- 此处能够能够配置成 *.do,对应 struts 的后缀习惯 -->
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>/index.jsp</welcome-file>
  </welcome-file-list>
 
</web-app>

3)测试

至此曾经实现了 SSM 三大框架的整合了,接下来测试一下,如果胜利了,那么祝贺你,如果失败了,持续调试吧,作为程序员就是不停的与 BUG 做奋斗!

  • 新建 jsp 页面

showUser.jsp 此页面仅输入一下用户名,实现一个 残缺的简略流程。

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <title> 测试 </title>
  </head>
  
  <body>
    ${user.userName}
  </body>
</html>
  • 建设 UserController 类

UserController.java 控制器

package com.cn.hnust.controller;
 
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
 
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
 
import com.cn.hnust.pojo.User;
import com.cn.hnust.service.IUserService;
 
@Controller
@RequestMapping("/user")
public class UserController {
  @Resource
  private IUserService userService;
  
  @RequestMapping("/showUser")
  public String toIndex(HttpServletRequest request,Model model){int userId = Integer.parseInt(request.getParameter("id"));
    User user = this.userService.getUserById(userId);
    model.addAttribute("user", user);
    return "showUser";
  }
}
  • 部署我的项目

输出地址:localhost:8080/ 项目名称 /user/showUser?id=1

至此,SSM 三大框架的整合就实现了,在此基础上可再增加其余性能。

正文完
 0