Spring+SpringMVC+MyBatis(SSM)框架整合

Posted Nothing_doit

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring+SpringMVC+MyBatis(SSM)框架整合相关的知识,希望对你有一定的参考价值。

本博客主要整理了Spring+SpringMVC+MyBatis+c3p0+ehcache在整合过程的一些细节。
框架简介:       Spring是一个轻量级的控制反转(IoC)和面向切面(aop)的容器框架, 同时Spring利用面向AOP的思想对原生web应用的事务处理也提出了优秀的解决方案。       作用:使用Spring的IoC容器来整合其他框架,同时使用Spring来完成web项目中的事务处理             SpringMVC分离了控制器、模型对象、过滤器以及处理程序对象的角色,这样我们就可以随心所欲的配置这些东西。       作用:替代原生web中的Servlet,过滤器等这些交给SpringMVC来进行管理              MyBatis是支持普通SQL查询,存储过程和高级映射的优秀的持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。        作用:将接口的实现通过映射文件来实现,将POJO与数据库记录实现映射             EhCache是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。       作用:解决web项目中的缓存问题             c3p0开源的JDBC连接池。        作用:解决web项目中数据库连接的问题       框架整合步骤:
      环境搭建:               环境基础(工程,jar包,文件):      1.创建一个动态的web工程    
                   2.导入相关jar包                        数据库连接池包和数据库驱动包 mysql-connector-java-5.1.37-bin.jar(驱动包) c3p0-0.9.1.2.jar(c3p0数据库连接池包)
            Spring框架包      IOC容器核心包
spring-beans-4.0.0.RELEASE.jar spring-context-4.0.0.RELEASE.jar spring-core-4.0.0.RELEASE.jar spring-expression-4.0.0.RELEASE.jar      aop相关的包 spring-aop-4.0.0.RELEASE.jar spring-aspects-4.0.0.RELEASE.jar      aop增强包 com.springsource.net.sf.cglib-2.2.0.jar com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar      jdbc连接和事务控制的包 spring-jdbc-4.0.0.RELEASE.jar spring-orm-4.0.0.RELEASE.jar spring-tx-4.0.0.RELEASE.jar      Spring必备的日志包 commons-logging-1.1.3.jar
           SpringMVC包      实现web基础包
spring-web-4.0.0.RELEASE.jar spring-webmvc-4.0.0.RELEASE.jar      在页面写EL表达式的包
jstl.jar standard.jar      使用json所需要的包
jackson-annotations-2.1.5.jar jackson-core-2.1.5.jar jackson-databind-2.1.5.jar      文件上传下载
commons-fileupload-1.2.1.jar commons-io-2.0.jar     验证,异常信息处理包
classmate-0.8.0.jar hibernate-validator-5.0.0.CR2.jar hibernate-validator-annotation-processor-5.0.0.CR2.jar jboss-logging-3.1.1.GA.jar validation-api-1.1.0.CR1.jar              MyBatis包(联合查询和ehcache整合)      MyBatis基础包 mybatis-3.2.8.jar asm-3.3.1.jar cglib-2.2.2.jar
     日志记录包 log4j.jar(MyBatis要用)

     ehcache包(与mybatis整合) ehcache-core-2.6.8.jar mybatis-ehcache-1.0.3.jar      ehcache的日志使用slf4j做的,slf4j是用来整合所有的日志厂商的这样日志的整合就会变得容易了。 slf4j-api-1.6.1.jar slf4j-log4j12-1.6.2.jar

mybatis与spring整合包
mybatis-spring-1.2.2.jar
若要添加其他功能,可以增加一些其他的jar包,直接与框架整合即可。

    3.建立包结构,并在其中放上一些必要的类以作测试使用
        4.创建这几个框架所需要的文件

               新建一个资源包conf,专门用来放这些框架的配置文件
                       Spring的配置文件
                       MyBatis全局配置文件                      SpringMVC配置文件                                   框架整合配置(编写框架环境配置信息和整合所需要的配置):                               注意:彩色区域表示比较重要的配置
     
                 配置Spring环境
                      ①在SpringSpringMVCMyBatis2/WebContent/WEB-INF/web.xml中配置自动初始化容器                
                                                                配置信息 :          
  <!-- 初始化ioc容器 -->   <context-param>       <param-name>contextConfigLocation</param-name>       <!--classpath:表示从类路径下开始,这里只需要将spring配置文件的文件名copy过来即可             配置Spring配置文件所在位置        -->       <param-value> classpath:applicationContext.xml</param-value>   </context-param>   <listener>       <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>   </listener>                         c3p0数据库连接池外部的数据库连接信息

                       配置信息: jdbc.driverClass=com.mysql.jdbc.Driver jdbc.jdbcUrl=jdbc:mysql://127.0.0.1:3306/mybatistest?useUnicode=true&amp;characterEncoding=UTF8 jdbc.user=root jdbc.password=123456
                       ②编写Spring配置文件,设置IoC容器的初始化参数,并在这个配置文件中整合其他框架。                          其中SpringMVC和Spring不需要整合 <?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:tx="http://www.springframework.org/schema/tx"     xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"     xmlns:aop="http://www.springframework.org/schema/aop"     xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd         http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">     <!--         Spring作用,IOC容器,整合其他框架,提供数据源,事务处理      -->     <!-- 开启包扫描,同时来区分Spring和SpringMVC管理的包           自动扫描所有非控制器的组件      -->     <context:component-scan base-package="com.myframe">         <!-- 指出哪些注解不扫描,这些注解修饰的POJO由SpringMVC管理 -->         <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>         <context:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>     </context:component-scan>     <!-- 配置数据源             ①引入外部连接数据库的信息             ②配置这些信息          spring与c3p0整合
    -->     <context:property-placeholder location="classpath:c3p0-config.properties"/>     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">         <!-- 配置数据源 ,使用$键从外部文件中获取相关值-->         <property name="jdbcUrl" value="$jdbc.jdbcUrl"></property>         <property name="driverClass" value="$jdbc.driverClass"></property>         <property name="user" value="$jdbc.user"></property>         <property name="password" value="$jdbc.password"></property>     </bean>     <!-- 使用MyBatis操作数据库,替代以前使用的JdbcTemplate           spring与myBatis整合,给myBatis框架配置执行环境
     -->     <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">         <!-- 设置MyBatis全局配置文件所在的位置 -->         <property name="configLocation" value="classpath:mybatis-config.xml"></property>         <!-- 使用ioc容器管理的数据源 -->         <property name="dataSource" ref="dataSource"></property>     </bean>     <!-- 要想让Spring完成事务控制,必须使用Spring能操作的SqlSession,因此配置下面的SqlSessionTemplate         并使用上边配置好的工厂来获取SqlSessionTemplate对象         这个对象就是openSession拿到的那个对象,可以与数据库建立会话           SqlSessionTemplate和我们openSession拿到的对象功能类似          可以声明为属性,线程安全     -->     <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">         <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactoryBean"></constructor-arg>     </bean>     <!--使用SpringMVC完成事务控制 -->     <!-- 配置事务管理器 -->     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">         <property name="dataSource" ref="dataSource"></property>     </bean>     <!-- 开启基于注解的事务管理 -->     <tx:annotation-driven transaction-manager="transactionManager"/>     <!-- 开启基于注解aop -->     <aop:aspectj-autoproxy></aop:aspectj-autoproxy> </beans>
Spring环境配置完成后:             @Repository @Service注解修饰的都有了小s

                   配置 SpringMVC环境

                          ①web.xml中配置(前端控制器,解决请求响应乱码,配置RestFul编程环境  <!-- 使用SpringMVC框架,配置一个前端控制器来拦截所有请求 -->   <!-- The front controller of this Spring Web application, responsible for handling all application requests -->     <servlet>         <servlet-name>springDispatcherServlet</servlet-name>         <servlet-class> org.springframework.web.servlet.DispatcherServlet</servlet-class>         <init-param>             <param-name>contextConfigLocation</param-name>             <!--设置springMVC配置文件的位置-->             <param-value> classpath:springMVC-config.xml</param-value>         </init-param>         <load-on-startup>1</load-on-startup>     </servlet>     <!-- Map all requests to the DispatcherServlet for handling -->     <servlet-mapping>         <servlet-name>springDispatcherServlet</servlet-name>         <!-- 拦截所有请求,不拦截*.jsp -->          <url-pattern>/</url-pattern>     </servlet-mapping>     <!-- 配置一个Filter来解决请求,响应乱码 (POST请求)GET请求乱码在Servles中server.xml中修改-->     <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>forceEncoding</param-name>             <param-value>true</param-value>         </init-param>     </filter>     <filter-mapping>         <filter-name>CharacterEncodingFilter</filter-name>         <!-- 拦截所有请求,包含*.jsp -->          <url-pattern>/*</url-pattern>     </filter-mapping>     <!--   配置一个支持发送PUT,DELETE请求的filter       适应RestFul风格的编程      -->     <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>                        
                         GET请求乱码解决方式:
                        设置位置: Servers\\ Tomcat v6.0 Server at localhost-config\\server.xml 64行左右,在此处设置红笔 <Connector  URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
                     ②SpringMVC配置文件编写 <?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:mvc="http://www.springframework.org/schema/mvc"     xmlns:context="http://www.springframework.org/schema/context"     xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
    <!-- 开启包扫描主要管理控制,拦截相关的包 -->     <context:component-scan base-package="com.myframe.controller"/>     <!-- 配置视图解析器 -->     <bean id="viewResolver" class=" org.springframework.web.servlet.view.InternalResourceViewResolver">         <property name="prefix" value="/WEB-INF/"></property>         <property name="suffix" value=".jsp"></property>     </bean>      <!--这两个是标配-->     <!-- 启动基于注解的mvc -->      <mvc:annotation-driven/>     <!-- 当这个解析器解析不了的时候使用默认的servlet -->      <mvc:default-servlet-handler/> </beans>
    SpringMVC环境配置完成后 controller包中的POJO加上小s了
                MyBatis配置文件编写(配置MyBatis全局环境,Mapper映射文件的编写在测试的时候演示) <?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">
 <!-- 配置MyBatis的全局设置,当使用Spring整合后,就不需要配置环境了--> <configuration>      <!--开启二级缓存 与EhcachCache整合  -->      <settings>         <setting name="cacheEnabled" value="true"/>     </settings>     <!-- 别名处理器,批量的加别名,这个包下的所有类的别名是它的类名 -->     <typeAliases>         <package name="com.myframe.entities"/>     </typeAliases>     <mappers>        <!--在测试的时候编写接口的映射文件-->
        <!-- 注册映射文件 -->         <mapper resource="com/myframe/mapper/StudentMapper.xml"/>     </mappers>
</configuration>                           配置Ehcache环境(替代MyBatis自己的二级缓存)
                          配置文件 <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">   <!--设置缓存保存在硬盘上的位置-->   <diskStore path="D:\\my\\encache" />  <defaultCache
   maxElementsInMemory="1000"
   maxElementsOnDisk="10000000"    eternal="false"
   overflowToDisk="false"
   timeToIdleSeconds="120"    timeToLiveSeconds="120"
   diskExpiryThreadIntervalSeconds="120"    memoryStoreEvictionPolicy="LRU">  </defaultCache> </ehcache>

        log4j配置文件配置信息

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">  <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">    <param name="Encoding" value="UTF-8" />    <layout class="org.apache.log4j.PatternLayout">     <param name="ConversionPattern" value="%-5p %dMM-dd HH:mm:ss,SSS %m  (%F:%L) \\n" />    </layout>  </appender>  <logger name="java.sql">    <level value="debug" />  </logger>  <logger name="org.apache.ibatis">    <level value="debug" />  </logger>  <root>    <level value="debug" />    <appender-ref ref="STDOUT" />  </root> </log4j:configuration>
            基本配置信息配置好后,框架环境基本搭建完成。

     环境测试(测试环境好使不?)
                 编写StudentMapper接口 package com.myframe.mapper;
import java.util.List; import org.springframework.stereotype.Repository;
import com.myframe.entities.Student; //用于测试环境能不能用 @Repository public interface StudentMapper     //获取所有学生     public List<Student> getAll();

          根据这个接口中的方法, 创建一个映射文件(实现定义接口的具体过程)
演示映射文件的编写(与EhcachCache整合) 在conf中新建一个包conf\\com\\myframe\\mapper专门来保存映射文件 根据上边的StudentMapper   编写配置文件

<?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"> <!--整合EhcacheCache配置信息  --> <mapper namespace="com.myframe.mapper.StudentMapper">     <cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>     <sql id="allFileds">         id, name, score, birth, age     </sql>     <!--对接口的实现-->     <select id="getAll" resultType="Student">         select             <include refid="allFileds"/>         from             tbl_student     </select> </mapper>
               创建一个StudentDao来执行mapper
package com.myframe.dao;
import java.util.List;
import org.apache.ibatis.session.SqlSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository;
import com.myframe.entities.Student; import com.myframe.mapper.StudentMapper; /**  * 在StudentDao中调用mapper,执行操作  * @author LENOVO  *  */ @Repository public class StudentDao     //自动装配SqlSession对象      @Autowired     private SqlSession sqlSession;     public List<Student> getAll()         //获取到映射对象         StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);         //执行映射方法         return mapper.getAll();                        
                          service调Dao
package com.myframe.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.myframe.dao.StudentDao; import com.myframe.entities.Student; @Service public class StudentService     @Autowired     private StudentDao studentDao;     public List<Student> getAll()         return studentDao.getAll();     
                     SpringMVC框架处理请求(控制器) package com.myframe.controller; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping;
import com.myframe.entities.Student; import com.myframe.service.StudentService; @Controller public class TestHandle     @Autowired     private StudentService studentService;     //请求地址     @RequestMapping("/list")     public String getAll(Map<String, Object> map)         List<Student> stus = studentService.getAll();         map.put("list", stus);         return "list";     
                     设置两个页面,实现在浏览器上的简单显示。
                    通过index.jsp页面发送请求 
<%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body>     <a   href="list">查询所有学生</a> </body> </html>                 将响应信息在list.jsp页面显示  
<%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body>     <h1 align="center">显示所有学生</h1>      $requestScope.list </body> </html>
               基本和原生的web项目调用过程一致,只不过用框架替代了一些手写的部分。
激动人心的时刻 1.启动服务器 2.点击查询所有学生
3.完美的显示所有学生
框架基本搭建完成,可以实现基本的功能。

以上是关于Spring+SpringMVC+MyBatis(SSM)框架整合的主要内容,如果未能解决你的问题,请参考以下文章

Spring+SpringMVC+Mybatis+Mysql整合实例

Spring+SpringMVC+Mybatis+Mysql整合实例

SpringMVC——Spring整合Mybatis和SpringMVC

SpringMVC学习--springmvc和mybatis整合

Spring+SpringMVC+MybatisSpring+SpringMVC+Mybatis实现前端到后台完整项目

springmvc+mybatis+oracle