zoukankan      html  css  js  c++  java
  • MyBatis入门程序之表关联

    一、一对一查询(ResultType比较简单,只需要指向扩展的类;ResultMap逐个匹配比较麻烦,可以配置属性autoMapping="true",还可以可以实现延迟加载)

      1、ResultType方式: 根据需要扩展Pojo类,如查询订单对应的用户,可以写订单扩展类继承订单类,如下图

      

      2、ResultMap方式: Pojo类中包含另一个类,mapper配置中使用association标签关联另一个类

      

        

      或者

      

    二、一对多查询 (在ResultMap中使用collection实现一对多映射,ResultMap可以继承,但是要求,resultMap的type指向一致)

    三、多对多查询

      多对多表关系其实就是变相的一对多;一对一关联在ResultMap中用association,一对多关联在ResultMap中用collection;关联可以多层嵌套association或collection

     四、延迟加载(懒加载)

    1、首先要在全局sqlMapConfig.xml中配置settings(lazyLoadingEnabled、aggressiveLazyLoading)

    2、延迟加载需要使用resultMap的,在association或collection中配置select属性指向要加载的statementq,property为要加载类在当前类中的属性变量,column为要加载的statement中需要当前statement中传递的字段

    如要查询一对一中,订单中的用户,由于订单和用户不在一个mapper中,所以select要带上namespace

    假如用户表中还有用户其他信息这个对象,如下

    也就是要实现,订单对象中有用户对象,用户对象中有用户其他信息集合,那么修改usermapper.xml,如下(可以不用在接口中写getUserOtherMsg方法)

    五、查询缓存

    1、一级缓存,SqlSession级别的缓存属于一级缓存,默认开启,在通过session获取到当前对象后,如果中间没有增删改操作,一直到session关闭,缓存一直存在,中间如果执行了增删改操作,一级缓存会在commit后清空

    2、二级缓存,mapper级别的缓存属于二级缓存,默认不开启;需要首先在全局下配置开启,然后在相应mapper.xml文件中配置cache,如下

    注意,做二级缓存,创建的pojo类要实现序列化接口Serializable

    开启二级缓存后,即使session关闭,如果没有到缓存时间或者没有执行增删改操作,缓存一直存在

    可以单独设置某个statement禁用缓存,设置如下,当然,如果想设置使用二级缓存,可以修改useCache为true,默认也为true,此时二级缓存的全局配置和mapper缓存配置不能删除

    刷新二级缓存flushCache:select语句默认为false;insert、update、delete默认为true

    刷新二级缓存就是每次查询都去数据库查新的

    替换二级缓存为其他插件,如ehcache、memcache、redis等

    Mybatis为二级缓存提供了Cache接口,只要实现该接口即可

    如整合ehcahe,

    1)引入ehcache jar包及mybatis-ehcache jar包

    2)在mapper.xml文件中配置cache中type为cache接口实现类

    3)在classpath下添加ehcache.xml文件并进行相应配置

    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
        <!-- 缓存数据要存放的磁盘地址 -->
        <diskStore path="F:developehcache" />
        <!-- diskStore:指定数据在磁盘中的存储位置。defaultCache:当借助CacheManager.add("demoCache")创建Cache时,EhCache便会采用<defalutCache/>指定的的管理策略 
            以下属性是必须的:  maxElementsInMemory - 在内存中缓存的element的最大数目  maxElementsOnDisk 
            - 在磁盘上缓存的element的最大数目,若是0表示无穷大 eternal - 设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断 
             overflowToDisk - 设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上 以下属性是可选的:  timeToIdleSeconds 
            - 当缓存在EhCache中的数据前后两次访问的时间超过timeToIdleSeconds的属性取值时,这些数据便会删除,默认值是0,也就是可闲置时间无穷大 
             timeToLiveSeconds - 缓存element的有效生命期,默认是0.,也就是element存活时间无穷大 diskSpoolBufferSizeMB 
            这个参数设置DiskStore(磁盘缓存)的缓存区大小.默认是30MB.每个Cache都应该有自己的一个缓冲区.  diskPersistent 
            - 在VM重启的时候是否启用磁盘保存EhCache中的数据,默认是false。  diskExpiryThreadIntervalSeconds 
            - 磁盘缓存的清理线程运行间隔,默认是120秒。每个120s,相应的线程会进行一次EhCache中数据的清理工作 memoryStoreEvictionPolicy 
            - 当内存缓存达到最大,有新的element加入的时候, 移除缓存中element的策略。默认是LRU(最近最少使用),可选的有LFU(最不常使用)和FIFO(先进先出) -->
    
        <defaultCache maxElementsInMemory="1000"
            maxElementsOnDisk="10000000" eternal="false" overflowToDisk="false"
            timeToIdleSeconds="120" timeToLiveSeconds="120"
            diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU">
        </defaultCache>
    </ehcache>
    ehcache.xml

    在实际应用中,可以把需要做缓存的单独放到指定mapper.xml文件中

  • 相关阅读:
    HTML框架
    HTML链接
    kzalloc 函数详解(转载)
    LCD接口(转载)
    S3C2440上RTC时钟驱动开发实例讲解(转载)
    PHP 真值与空值
    http chunked 理解
    c# 基础
    美式音标注意事项
    groovy 闭包
  • 原文地址:https://www.cnblogs.com/hujiapeng/p/7112433.html
Copyright © 2011-2022 走看看