• MyBatis(七)SSM 整合:MyBatisSpringSpringMVC 整合


    一、前提

      1、查看不同 MyBatis 版本整合 Spring 时使用的适配包

        http://www.mybatis.org/spring/

      2、下载整合适配包

        https://github.com/mybatis/spring/releases

        

      3、官方整合示例  jpetstore

        https://github.com/mybatis/jpetstore-6

    二、搭建环境

      1、使用 Maven 创建一个 web 项目;

      2、导入需要添加的依赖

        (1)导入 SSM 需要使用的 jar 包(Spring,SpringMVC,MyBatis);

        (2)导入整合适配包

        (3)导入其他技术的一些支持包,如连接池,数据库驱动,日志等……

        (4)导入第三方支持的包:log4j,pageHelper,AspectJ,jackson,jstl

      3、依赖文件

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <spring-version>4.0.0.RELEASE</spring-version>
    </properties>
    
    
    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <!-- ehcache 相关包-->
        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache-core</artifactId>
            <version>2.6.8</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.caches</groupId>
            <artifactId>mybatis-ehcache</artifactId>
            <version>1.0.3</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.6.2</version>
        </dependency>
    
        <!-- mybatis-spring 相关包-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.1</version>
        </dependency>
        <!-- spring 相关包-->
        <!-- IOC-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>${spring-version}</version>
        </dependency>
    
        <!-- AOP -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring-version}</version>
        </dependency>
    
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>${spring-version}</version>
        </dependency>
    
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.13</version>
        </dependency>
    
    
        <!-- 数据库相关 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</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-orm</artifactId>
            <version>${spring-version}</version>
        </dependency>
        
        <!-- springMVC 相关-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring-version}</version>
        </dependency>
    
        <!--JSTL-->
        <dependency>
            <groupId>org.apache.taglibs</groupId>
            <artifactId>taglibs-standard-impl</artifactId>
            <version>1.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.taglibs</groupId>
            <artifactId>taglibs-standard-spec</artifactId>
            <version>1.2.1</version>
        </dependency>
    
        <!--日志相关-->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.3</version>
        </dependency>
    
        <!--数据库连接池-->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.2.1</version>
        </dependency>
    
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
    
    </dependencies>
    
    
    
    <build>
        <plugins>
            <!-- jetty 插件 -->
            <plugin>
                <groupId>org.mortbay.jetty</groupId>
                <artifactId>maven-jetty-plugin</artifactId>
                <version>6.1.25</version>
                <configuration>
                    <!-- 热部署,每10秒扫描一次 -->
                    <scanIntervalSeconds>10</scanIntervalSeconds>
                    <!-- 可指定当前项目的站点名 -->
                    <contextPath>/ssm</contextPath>
                    <connectors>
                        <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
                            <!-- 设置启动的端口号 -->
                            <port>9090</port>
                        </connector>
                    </connectors>
                </configuration>
            </plugin>
    
    
            <!-- Tomcat插件 -->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.1</version>
                <configuration>
                    <port>8080</port>   <!-- 设置启动的端口号 默认8080 -->
                    <path>/ssm</path>  <!-- 项目的站点名,即对外访问路径 -->
                    <uriEncoding>UTF-8</uriEncoding>    <!-- 字符集编码 默认:ISO-8859-1 -->
                    <server>tomcat7</server>    <!-- 服务器名称 -->
                </configuration>
            </plugin>
        </plugins>
    </build>

    三、SpringMVC 配置

      1、配置 web.xml

        (1)字符编码过滤器

        (2)REST 风格的过滤器:HiddenHTTPMethodFilter

        (3)核心控制器(前端控制器):DispatcherServlet

        配置文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
    
      <display-name>SSM项目整合</display-name>
    
      <!--Spring 配置文件-->
      <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
      </context-param>
    
      <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
    
      <!--SpringMVC 的配置-->
      <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
      </servlet>
    
      <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>
    
    </web-app>

      2、springMVC 配置文件

        在 WEB-INF 目录创建 spring-servlet.xml进行 springMVC 的配置

        (1)扫描控制层组件

        (2)视图解析器

        (3)默认的Servlet:Default Servlet

        (4)MVC 驱动

        (5)可选:MultipartResolver、拦截器

        配置文件 spring-servlet:

    <?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:mvc="http://www.springframework.org/schema/mvc"
           xsi:schemaLocation="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.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
        <!--SpringMVC 只是控制网站跳转逻辑 -->
        <!--只扫描控制器-->
        <context:component-scan base-package="com.njf.mybatis" use-default-filters="false">
            <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>
    
        <mvc:annotation-driven></mvc:annotation-driven>
        <mvc:default-servlet-handler></mvc:default-servlet-handler>
    
        <!-- 视图解析器-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/pages/"></property>
            <property name="suffix" value=".jsp"></property>
        </bean>
    
    </beans>

        配置文件的名称为web.xml中DispatcherServlet的name加上 -servlet 拼接而成。

      3、整合 SpringMVC 和 Spring

        在web.xml 中

          (1)实例化 Spring 容器的监听器:ContextLoaderListener 

          (2)配置 context-param,指定spring 配置文件的位置

    四、Spring 配置

      在 resources 目录下创建 application.xml 配置文件:

      (1)扫描组件(排除控制层)

      (2)事务管理器

      (3)配置连接池

      (4)配置数据源

       配置文件:

    <?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-sprin="http://mybatis.org/schema/mybatis-spring"
           xsi:schemaLocation="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.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd">
    
        <!--  Spring 希望管理所有的业务逻辑组件,等  -->
        <context:component-scan base-package="com.njf.mybatis" use-default-filters="true">
            <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>
    
    
        <!--引入数据库的配置文件-->
        <context:property-placeholder location="classpath:dbconfig.properties" />
    
        <!--  Spring 控制业务逻辑,数据源、事务控制,aop  -->
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="jdbcUrl" value="${jdbc.url}"/>
            <property name="driverClass" value="${jdbc.driver}"/>
            <property name="user" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </bean>
    
        <!--spring 事务管理器-->
        <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        </bean>
    
        <!--开启基于注解的事务-->
        <tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
    
    
    </beans>

      数据库连接信息 db-config.xml:

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/mybatis?allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
    jdbc.username=root
    jdbc.password=root

    五、引入 MyBatis

      1、核心(全局)配置文件 mybatis-config.xml

      2、mapper 接口和 mapper 映射文件

    六、Spring 整合 MyBatis

      在 application.xml 中进行配置:

       (1)properties 文件的引入
            (2)DataSource 数据源的配置
            (3)事务管理器
            (4)开启事务驱动
            (5)MyBatis 的 SqlSession 的创建:SqlSessionFactoryBean:管理 Sqlsession
            (6)MyBatis 的 Mapper 接口的代理实现类:MapperScannerConfigurer
      最终的配置文件:
    <?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-sprin="http://mybatis.org/schema/mybatis-spring"
           xsi:schemaLocation="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.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd">
    
        <!--  Spring 希望管理所有的业务逻辑组件,等  -->
        <context:component-scan base-package="com.njf.mybatis" use-default-filters="true">
            <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>
    
    
        <!--引入数据库的配置文件-->
        <context:property-placeholder location="classpath:dbconfig.properties" />
    
        <!--  Spring 控制业务逻辑,数据源、事务控制,aop  -->
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="jdbcUrl" value="${jdbc.url}"/>
            <property name="driverClass" value="${jdbc.driver}"/>
            <property name="user" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </bean>
    
        <!--spring 事务管理器-->
        <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        </bean>
    
        <!--开启基于注解的事务-->
        <tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
    
        <!--
            整合 mybatis
            目的:
                1、spring 管理所有组件,mapper 的实现类
                    service ===》Dao @Autowired 自动注入的 mapper
                2、spring 用来管理事务,声明式事务
        -->
    
        <!--
            创建出 SqlSessionFactory 对象
        -->
        <bean id="sessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource" />
            <property name="typeAliasesPackage" value="com.njf.mybatis.bean"/>
            <property name="typeAliases">
                <array>
                    <value>com.njf.mybatis.bean.Employee</value>
                    <value>com.njf.mybatis.bean.Department</value>
                </array>
            </property>
            <!-- configLocation 指定全局配置文件的位置-->
            <property name="configLocation" value="classpath:mybatis-config.xml" />
            <!-- 指定mapper 文件的位置   -->
            <property name="mapperLocations" value="classpath:mybatis/mapper/*.xml"/>
        </bean>
    
        <!--
            扫描所有的mapper接口的实现,让这些 mapper 能够自动注入
            base-package:指定mapper接口的包名
        -->
        <!--<mybatis-sprin:scan base-package="com.njf.mybatis.dao"></mybatis-sprin:scan>-->
    
        <!--老版格式-->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="com.njf.mybatis.dao"/>
        </bean>
    
    
    
    </beans>
     
       最终 mybatis-config.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"/>
            <setting name="mapUnderscoreToCamelCase" value="true"/>
            <setting name="jdbcTypeForNull" value="NULL"/>
            <setting name="lazyLoadingEnabled" value="true"/>
            <!--
                aggressiveLazyLoading:侵入延迟加载,当使用任一属性,所有的属性都会加载;禁用的话,只有用到该属性才会加载,即按需加载
            -->
            <setting name="aggressiveLazyLoading" value="false"/>
        </settings>
    
        <databaseIdProvider type="DB_VENDOR">
            <!--  为不同的数据库厂商起别名      -->
            <property name="MySQL" value="mysql"/>
            <property name="SQL Server" value="sqlserver"/>
            <property name="DB2" value="db2"/>
            <property name="Oracle" value="oracle" />
        </databaseIdProvider>
    
    </configuration>
     
      其实mybatis中的配置信息都可以配置在 SqlSessionFactoryBean 中,而这个类实现了FactoryBean,就可以由 Spring 来管理。
      org.mybatis.spring.SqlSessionFactoryBean 类的信息:

       部分源码:

    public class SqlSessionFactoryBean implements FactoryBean<SqlSessionFactory>, InitializingBean, ApplicationListener<ApplicationEvent> {
        private static final Log LOGGER = LogFactory.getLog(SqlSessionFactoryBean.class);
        private Resource configLocation;
        private Configuration configuration;
        private Resource[] mapperLocations;
        private DataSource dataSource;
        private TransactionFactory transactionFactory;
        private Properties configurationProperties;
        private SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        private SqlSessionFactory sqlSessionFactory;
        private String environment = SqlSessionFactoryBean.class.getSimpleName();
        private boolean failFast;
        private Interceptor[] plugins;
        private TypeHandler<?>[] typeHandlers;
        private String typeHandlersPackage;
        private Class<?>[] typeAliases;
        private String typeAliasesPackage;
        private Class<?> typeAliasesSuperType;
        private DatabaseIdProvider databaseIdProvider;
        private Class<? extends VFS> vfs;
        private Cache cache;
        private ObjectFactory objectFactory;
        private ObjectWrapperFactory objectWrapperFactory;
    }
     
      可以看到 mybatis 的大部分配置信息都被封装成了 SqlSessionFactoryBean 的属性,所以可以在 Spring 的配置文件中接替 mybatis 的配置。
     

    七、最终测试

      1、dao 层

    public interface EmployeeMapper {
    
        public Employee getEmpById(Integer id);
    }

        映射文件:

    <?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.njf.mybatis.dao.EmployeeMapper">
    
        <!--
            public Employee getEmpById(Integer id);
        -->
        <select id="getEmpById" resultType="Employee">
            select * from tbl_employee
            where id = #{id}
        </select>
    
    
    </mapper>

      2、service 层

    @Service
    public class EmployeeServiceImpl implements EmployeeService {
    
        @Autowired
        private EmployeeMapper employeeMapper;
    
        @Override
        public Employee getEmpById(Integer id) {
            return employeeMapper.getEmpById(id);
        }
    }

      3、controller 层

    @Controller
    public class EmployeeController {
    
        @Autowired
        private EmployeeService employeeService;
    
        @RequestMapping("emps")
        public String getEmployee(Map<String, Object> map) {
            Employee emp = employeeService.getEmpById(1);
            map.put("emp", emp);
            return "list";
        }
    }

      4、视图层

        index.jsp

    <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <html>
    <head>
        <title>SSM测试</title>
    </head>
    <body>
    
    <a href="emps">查询员工</a>
    <a href="dept">查询部门</a>
    </body>
    </html>

        list.jsp

    <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <head>
        <title>
            员工信息
        </title>
    </head>
    <body>
    
        员工信息:
        ${emp}
        ${emp.id}
        ${emp.lastName}
    
        <br>
        请求域
        ${requestScope.emp}
        <%=request.getAttribute("emp") %>
    
        <hr>
        部门信息
        ${dept}
        <%=request.getAttribute("dept") %>
    
    </body>
    </html>
  • 相关阅读:
    Wireshark抓取iPhone的数据包
    AVSpeechSynthesizer
    NSData,Byte,NSString 转换
    app 国际化
    带颜色日志
    swift生成二维码
    CocosPods安装和导入第三方框架
    多线程总结
    计算机系统导论——读书笔记——第六章 存储器层次结构
    数据结构与算法——编程作业——内排序&外排序
  • 原文地址:https://www.cnblogs.com/niujifei/p/15251006.html
Copyright © 2020-2023  润新知