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 ...
随机推荐
- BFS-广度优先遍历
#include <iostream> #include <queue> using namespace std; /* 5 4 0 0 1 0 0 0 0 0 0 0 1 0 ...
- 虚拟机安装以及PCL的配置(1)
安装虚拟机 (1) 下载VMware安装(自己百度一下,会有很多可供下载的) (2) 安装方式: 双击,一路点击next,不用更改安装路径(当然你也可以更改),选择安装“典型”即可 接着就有安 ...
- Java零拷贝
1.摘要 零拷贝的“零”是指用户态和内核态间copy数据的次数为零. 传统的数据copy(文件到文件.client到server等)涉及到四次用户态内核态切换.四次copy.四次copy中,两次在用户 ...
- Writing a Reusable Custom Control in WPF
In my previous post, I have already defined how you can inherit from an existing control and define ...
- C/C++文件输入输出操作——FILE*、fstream、windowsAPI
基于C的文件操作在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之. 一.流式文件操作这种方式的文件操作有一个重要的结构FILE,FILE在头文件stdio. ...
- MinGW32和64位交叉编译环境的安装和使用
原文出处: CompileGraphics Magick, Boost, Botan and QT with MinGW64 under Windows 7 64 http://www.kinetic ...
- vb 三种启动模式
正常启动不用说了 就是虚拟机和显示部分在同一个程序里进行 直接关闭程序 就都关闭了 相当于我们普通的电脑, 有主机和显示器无界面启动 也很好理解 ,就是在后台启动虚拟机,如同服务器, 我们只有一个主机 ...
- 【转】【Python】Python3爬虫实现自动登录、签到
工具:Fiddler 首先下载安装Fiddler,这个工具是用来监听网络请求,有助于你分析请求链接和参数. 打开目标网站:http://www.17sucai.com/,然后点击登录 好了,先别急着登 ...
- (笔记)Linux中的终端、控制台、tty、pty
1>tty(终端设备的统称): tty一词源于teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘阅读和发送信息的东西,后来这东西被键盘与显示器 ...
- 第三百三十二节,web爬虫讲解2—Scrapy框架爬虫—Scrapy使用
第三百三十二节,web爬虫讲解2—Scrapy框架爬虫—Scrapy使用 xpath表达式 //x 表示向下查找n层指定标签,如://div 表示查找所有div标签 /x 表示向下查找一层指定的标签 ...