一、一对一查询(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:\develop\ehcache" />
<!-- 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文件中

MyBatis入门程序之表关联的更多相关文章

  1. Mybatis入门程序

    作为一个java的学习者,我相信JDBC是大家最早接触也是入门级别的数据库连接方式,所以我们先来回忆一下JDBC作为一种用于执行SQL语句的Java API是如何工作的.下面的一段代码就是最基本的JD ...

  2. Mybatis学习——Mybatis入门程序

    MyBatis入门程序 一.查询用户 1.使用客户编号查询用户 (1).创建一个数据表 USE spring; #创建一个名为t_customer的表 CREATE TABLE t_customer( ...

  3. MyBatis入门程序(基于XML配置)

    创建一个简单的MyBatis入门程序,实现对学生信息的增删改查功能(基于XML配置) 一.新建一个Java工程,导入MyBatis核心jar包.日志相关的jar包以及连接Oracle数据库所需驱动包, ...

  4. MyBatis入门程序(1)

    一.入门程序: 1.mybatis的配置文件SqlMapConfig.xml 配置mybatis的运行环境,数据源.事务等. <?xml version="1.0" enco ...

  5. Mybatis入门程序编写

    执行原理 入门程序编写 1.pom.xml 文件 <dependencies> <dependency> <groupId>mysql</groupId> ...

  6. Mybatis入门程序(一)

    1.入门程序实现需求 根据用户id查询一个用户信息 根据用户名称模糊查询用户信息列表 添加用户(二) 更新用户(二) 删除用户(二) 2.引入Mybatis所需 jar 包(Maven工程) < ...

  7. MyBatis入门学习教程-实现关联表查询

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...

  8. 2.Mybatis入门程序(单表的增删改成)

    这里讲的单表的增删改查,是由mapper代理的增删改查,先来看看步骤: 1.jar包的导入 2.配置全局的配置文件 3.建立接口 4.编写mapper.xml 5.测试 工程结构:这个你们自己可以调整 ...

  9. mybatis入门程序-(二)

    1. 添加配置文件 log4j.properties # Global logging configuration #开发环境下日志级别设置成DEBUG,生产环境设置成info或者error log4 ...

随机推荐

  1. tabs 标签样式

    http://www.jq22.com/jquery-info17973 http://www.jq22.com/demo/elementTab201801262311/ 插件描述:基于element ...

  2. 基于octree的空间划分及搜索操作

    (1)  octree是一种用于管理稀疏3D数据的树形数据结构,每个内部节点都正好有八个子节点,介绍如何用octree在点云数据中进行空间划分及近邻搜索,实现“体素内近邻搜索(Neighbors wi ...

  3. HTML5数据推送SSE原理及应用开发

    JavaScript表达行为,CSS表达外观,注意HTML既表达结构(逻辑结构),又表达内容(数据本身)通常需要更新数据时,并不需要更新结构,正是这种不改变组织结构仅改变数据的诉求,推动了数据拉取和数 ...

  4. JQ 获取窗体的高度

    alert($(window).height()); //浏览器时下窗口可视区域高度 alert($(document).height()); //浏览器时下窗口文档的高度 alert($(docum ...

  5. HOW-TO GEEK SCHOOL

    This How-To Geek School class is intended for people who want to learn more about security when usin ...

  6. USB2.0学习笔记连载(十):关于WIN8及以上系统哈希值问题

    笔者上一篇博客讲解了关于驱动的安装,笔者使用的系统是win8.1系统,那么对于win8系统及以上系统,会对外部设备,没有在windows系统中进行签名过的,都是不允许在windows系统中进行安装的, ...

  7. php命令行脚本 mock数据

    <?php $con = mysql_connect("192.168.1.5:3306","root","123"); if (!$ ...

  8. (笔记)Mysql命令mysqladmin:修改用户密码

    mysqladmin命令用于修改用户密码. mysqladmin命令格式:mysqladmin -u 用户名 -p 旧密码 password 新密码 1) 给root加个密码ab12首先在DOS下进入 ...

  9. unity3d-----Collider 组件参考

    Collider 组件参考 点击 属性检查器 下面的 添加组件 按钮,然后从 添加碰撞组件 中选择需要的 Collider 组件,即可添加 Collider组件到节点上. Collider 组件属性 ...

  10. Eclipse的实用插件

    Decompiler PyDev ShellEd AnyEdit SonarLint PropertiesEditor System and Desktop Search 其它实用插件等工作中用到了再 ...