• spring 和 mybatis 整合过程 (包含分页)


    1.spring-mybatis.xml  : 配置 SqlSessionFactory 和  MapperScannerConfigurer 

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactory">
      <!-- 指定数据源 -->
      <property name="dataSource" ref="dataSoucre" />
      <!-- 指定 mybatis-config.xml 配置文件 -->
      <property name="configLocation" value="classpath:mybatis-config.xml" />
      <!-- 用来指定 MyBatis 的 XML 映射器文件的位置 -->
      <property name="mapperLocations" value="classpath:com/shulipeng/mol/mapper/**/*Mapper.xml" />
    </bean>
    
    <!-- sqlSessionFactory会扫描所有接口,然后创建各自接口的动态代理类 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
      <property name="basePackage" value="com.shulipeng.mol.dao" />
      <property name="sqlSessionFactory" ref="sqlSessionFactory" />
    </bean>

    扩展: MapperScannerConfigurer 介绍(摘选自 : https://www.2cto.com/kf/201409/331321.html)

             MapperScannerConfigurer 是 spring 和 mybatis 整合的 mybatis-spring.jar 包中提供的一个类

             首先,要了解该类的作用,就得先了解 MapperFactoryBean , MapperFactoryBean 的出现是为了代替手工使用 SqlSessionDaoSupport

             或 SqlSessionTemplate 编写数据访问对象(DAO)的代码,使用动态代理实现。

         官方的一个配置如下:

                    <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">

                        <property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />

                <property name="sqlSessionFactory" ref="sqlSessionFactory" />

             </bean>

              org.mybatis.spring.sample.mapper.UserMapper 是一个接口,我们创建一个 MapperFactoryBean 实例,

               然后注入这个接口和 sqlSessionFactory(mybatis 中提供的sqlSessionFactory 接口,MapperFactoryBean 会使用 SqlSessionFactory 创建

               SqlSession)这两个属性, 之后想使用这个 UserMapper 接口的话,直接通过 spring 注入这个 bean,然后就可以直接使用了,spring 内部

               会创建一个这个接口的动态代理。

          当发现要使用多个 MapperFactoryBean 的时候,一个一个定义肯定非常麻烦,于是 mybatis-spring 提供了 MapperScannerConfigurer 这个

               类,它将会查找类路径的映射器并且自动将它们创建成 MapperFactoryBean。


     2.mybatis-config.xml  : 配置 mybatis 参数,加入分页插件

    <?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>
        <!-- 配置mybatis的缓存,延迟加载等等一系列属性 -->
        <settings>
            <!-- 全局映射器启用缓存 -->
            <setting name="cacheEnabled" value="true" />
            <!-- 查询时,关闭关联对象即时加载以提高性能 -->
            <setting name="lazyLoadingEnabled" value="true" />
            <!-- 设置关联对象加载的形态,此处为按需加载字段(加载字段由SQL指 定),不会加载关联表的所有字段,以提高性能 -->
            <setting name="aggressiveLazyLoading" value="false" />
            <!-- 对于未知的SQL查询,允许返回不同的结果集以达到通用的效果 -->
            <setting name="multipleResultSetsEnabled" value="true" />
            <!-- 允许使用列标签代替列名 -->
            <setting name="useColumnLabel" value="true" />
            <!-- 允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值),数据表的PK生成策略将被覆盖 -->
            <!-- <setting name="useGeneratedKeys" value="true" /> -->
            <!-- 给予被嵌套的resultMap以字段-属性的映射支持 -->
            <setting name="autoMappingBehavior" value="FULL" />
            <!-- 配置和设定执行器,SIMPLE 执行器执行其它语句。REUSE 执行器可能重复使用prepared statements 语句,BATCH执行器可以重复执行语句和批量更新(有缺陷)。 -->
            <setting name="defaultExecutorType" value="SIMPLE" />
            <!-- 数据库超过25000秒仍未响应则超时 -->
            <setting name="defaultStatementTimeout" value="25000" />
    
            <setting name="logImpl" value="LOG4J" />
        </settings>
      
       <!-- 全局别名设置,在映射文件中只需写别名,而不必写出整个类路径 -->
       <typeAliases>
       </typeAliases>
       
       <!-- 分页插件 -->
       <plugins>
           <!-- com.github.pagehelper为PageHelper类所在包名,详细配置使用方法 https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/en/HowToUse.md -->
           <plugin interceptor="com.github.pagehelper.PageHelper">
               <!-- 4.0.0以后版本可以不设置该参数 -->
               <!-- 该参数默认为false -->
               <!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->
               <!-- 和startPage中的pageNum效果一样 -->
               <property name="offsetAsPageNum" value="true" />
               <!-- 该参数默认为false -->
               <!-- 设置为true时,使用RowBounds分页会进行count查询 -->
               <property name="rowBoundsWithCount" value="true" />
               <!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 -->
               <!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型) -->
               <property name="pageSizeZero" value="true" />
               <!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 -->
               <!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 -->
               <!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 -->
               <property name="reasonable" value="false" />
               <!-- 3.5.0版本可用 - 为了支持startPage(Object params)方法 -->
               <!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 -->
               <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值 -->
               <!-- 不理解该含义的前提下,不要随便复制该配置 -->
               <property name="params" value="pageNum=start;pageSize=limit;" />
           </plugin>
        </plugins>
      
    </configuration>

    扩展:1. mybatis-config.xml 如何使用本地的 mybatis-3-config.dtd ?

               答:添加 mybatis-3-config.dtd 置 WebRoot 目录下,

             并且更改 mybatis-config.xml 的  "http://mybatis.org/dtd/mybatis-3-config.dtd" 为 “mybatis-3-config.dtd”;

              2. mybatis 执行 update/delete 语句返回行数是负值?

              答 :是由于在配置文件中为了提高批量操作的性能,设置 defaultExecutorType 为 BATCH,

             缺陷就是无法获取update、delete返回的行数,修改为 SIMPLE 即可

              3. 分页插件的使用方法?

              答:最为常见的使用方式是 PageHelper.startPage 静态方法调用,

            在你需要进行分页的 MyBatis 查询方法前调用 PageHelper.startPage 静态方法即可,

                    紧跟在这个方法后的第一个MyBatis 查询方法会被进行分页。代码如下, 更多方式点击此链接 

    //获取第1页,10条内容,默认查询总数count
    PageHelper.startPage(1, 10);
    //紧跟着的第一个select方法会被分页
    List<Country> list = countryMapper.selectAll();
    //用PageInfo对结果进行包装
    PageInfo page = new PageInfo(list);
    //测试PageInfo全部属性
    //PageInfo包含了非常全面的分页属性
    assertEquals(1, page.getPageNum());
    assertEquals(10, page.getPageSize());
    assertEquals(1, page.getStartRow());
    assertEquals(10, page.getEndRow());
    assertEquals(183, page.getTotal());
    assertEquals(19, page.getPages());
    assertEquals(1, page.getFirstPage());
    assertEquals(8, page.getLastPage());
    assertEquals(true, page.isFirstPage());
    assertEquals(false, page.isLastPage());
    assertEquals(false, page.isHasPreviousPage());
    assertEquals(true, page.isHasNextPage());
    View Code

      

                       

    -- 整理于网络,加上自己的理解,大家一起学习,进步就好
  • 相关阅读:
    垂直margin为什么会重叠
    forEach()和for/in循环的缺点与for-of循环
    使用CleanWebpackPlugin插件报错原因:CleanWebpackPlugin is not a constructor
    Vue中常用的组件库
    Vue中使用keep-alive优化网页性能
    Vue中router路由异步加载组件-优化性能
    面试题-JS中的作用域相关问题
    JS中的垃圾回收机制
    【转】 SpringMVC详解(三)------基于注解的入门实例
    【转】 SpringMVC详解(二)------详细架构
  • 原文地址:https://www.cnblogs.com/shulipeng/p/7507520.html
Copyright © 2020-2023  润新知