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:\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入门程序之表关联的更多相关文章
- Mybatis入门程序
作为一个java的学习者,我相信JDBC是大家最早接触也是入门级别的数据库连接方式,所以我们先来回忆一下JDBC作为一种用于执行SQL语句的Java API是如何工作的.下面的一段代码就是最基本的JD ...
- Mybatis学习——Mybatis入门程序
MyBatis入门程序 一.查询用户 1.使用客户编号查询用户 (1).创建一个数据表 USE spring; #创建一个名为t_customer的表 CREATE TABLE t_customer( ...
- MyBatis入门程序(基于XML配置)
创建一个简单的MyBatis入门程序,实现对学生信息的增删改查功能(基于XML配置) 一.新建一个Java工程,导入MyBatis核心jar包.日志相关的jar包以及连接Oracle数据库所需驱动包, ...
- MyBatis入门程序(1)
一.入门程序: 1.mybatis的配置文件SqlMapConfig.xml 配置mybatis的运行环境,数据源.事务等. <?xml version="1.0" enco ...
- Mybatis入门程序编写
执行原理 入门程序编写 1.pom.xml 文件 <dependencies> <dependency> <groupId>mysql</groupId> ...
- Mybatis入门程序(一)
1.入门程序实现需求 根据用户id查询一个用户信息 根据用户名称模糊查询用户信息列表 添加用户(二) 更新用户(二) 删除用户(二) 2.引入Mybatis所需 jar 包(Maven工程) < ...
- MyBatis入门学习教程-实现关联表查询
一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...
- 2.Mybatis入门程序(单表的增删改成)
这里讲的单表的增删改查,是由mapper代理的增删改查,先来看看步骤: 1.jar包的导入 2.配置全局的配置文件 3.建立接口 4.编写mapper.xml 5.测试 工程结构:这个你们自己可以调整 ...
- mybatis入门程序-(二)
1. 添加配置文件 log4j.properties # Global logging configuration #开发环境下日志级别设置成DEBUG,生产环境设置成info或者error log4 ...
随机推荐
- C程序模拟实现银行家算法
C程序模拟实现银行家算法 上周又做操作系统实验,题目是用程序模拟实现银行家算法,写了半天还真有点晕,主要是因为想尽可能符合课本上的描述,所以写出来的程序就比较恶心了,好了,银行家算法就不多说了,不了解 ...
- 再谈git的http服务
因为git服务器搬迁,需要重新安装git服务器,在网上搜索了下,发现之前的方法太复杂,复杂到自己都没彻底弄明白.其实通过git自带的git-http-backend脚本配合apache2的http服务 ...
- 3D引擎Axiom的选择与学习.
经过前面针对OpenGL的一些特性的学习,越发觉得要学的更多,相关如LOD,各种阴影实现,场景管理如BSP与Octree等以及还没听过的各种的实现.有感自学的进度太慢,并且在做一些小DEMO时,心中不 ...
- python的callback函数原理
__getattribute__作用 """ class C(object): a = 'abc' def __getattribute__(self, *args, * ...
- 【转】【Centos】centos 安装libtorrent/rtorrent
1.下载编译时需要的软件 yum install gcc gcc-c++ m4 make automake libtool pkgconfig perl openssl-devel ncurses-d ...
- objective-C 的内存管理之-自动释放池(autorelease pool)
如果一个对象的生命周期显而易见,很容易就知道什么时候该new一个对象,什么时候不再需要使用,这种情况下,直接用手动的retain和release来判定其生死足矣.但是有些时候,想知道某个对象在什么时候 ...
- unity5x --------Music Mixer参数详解
我们一直在致力开发出业界最顶尖水准音频处理功能,而经过很长一段时间的努力,在Unity5.0中,音频处理功能将成为非常重点的一个功能. 要达成这个目标,我们首先重写了很多Unity中音频相关得处理 ...
- Java并发笔记-未完待续待详解
为什么需要并行? – 业务要求 – 性能 并行计算还出于业务模型的需要 – 并不是为了提高系统性能,而是确实在业务上需要多个执行单元. – 比如HTTP服务器,为每一个Socket连接新建一个处理线程 ...
- Cross-Site Scripting XSS 跨站攻击全攻略 分类: 系统架构 2015-07-08 12:25 21人阅读 评论(2) 收藏
原文:http://a1pass.blog.163.com/blog/static/2971373220087295449497/ 题记:这是我在<黑客X档案>08年第5期发表的一篇文章, ...
- idea过期激活
1.进到文件夹中:C:\Windows\System32\drivers\etc ,找到hosts文件,用记事本编辑 2.将“ 0.0.0.0 account.jetbrains.com ”添加到h ...