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文件中

原文地址:https://www.cnblogs.com/hujiapeng/p/7112433.html