Result Maps、Auto-mapping、cache

1.  Result Maps

resultMap元素是Mybatis里面最重要的并且功能最强大的一个元素。(The resultMapelement is the most important and powerful element in MyBatis.)与JDBC从ResultSets中取值相比较它可以使用节省大约90%的代码。不过多的说了,下面开始resutMap之旅~

一个最简单的例子

首先XML里面定义个resultMap,如下:

Xml代码  

  1. <resultMap type="com.ggg.henushang.entity.Person" id="personMap">
  2. <id column="id" property="id" />
  3. <result column="name" property="name" />
  4. <result column="age" property="age" />
  5. </resultMap>

然后就可以使用了,如下:

Xml代码  

  1. <select id="getPersonMap" resultMap="personMap">
  2. select * from person
  3. </select>

注意,在这里就没有了resultType这个属性了,而是使用了resultMap

dao中的代码:

Java代码  

  1. Map<String, Object> getPersonMap();

测试代码:

Java代码  

  1. @Test
  2. public void testGetPersonMap(){
  3. Map<String, Object> m = session.selectMap("com.ggg.henushang.dao.PersonDao.getPersonMap", "name");
  4. System.out.println(m);
  5. Assert.assertNotNull(m);
  6. }

打印结果:

Java代码  

  1. {henushang=id:7   name:henushang   age:12, updatename=id:3   name:updatename   age:45}

其实Mybatis官网上面还有个比较复杂的情况,我自己也没有很理解,所以就不在这里误人子弟了

2. Auto-mapping(自动匹配)

当自动匹配结果的时候,Mybatis会获取列名,并且查找一个相同的属性(忽略大小写)。这意味着命名为ID的列和命名为id的属性被查找到的时候,Mybatis将会把列ID的值赋给属性id。

通常数据库列名命名的时候使用大写和下划线并且Java属性常常依据驼峰命名法。为了保证在他们之间的自动匹配要设置属性 mapUnderscoreToCamelCase 为 true。

甚至当有个特定的result Map的时候也可以使用自动匹配。在这时候,对于每一个result map,所有的在ResultSet中有的并且没有被手动匹配的列将会被自动的先匹配,然后手动设置的匹配才会被执行(本人注:其实就是手动配置的优先级更好,最终结果将会以手动配置为准)。在下面的例子中,id和useName列将会被自动匹配,并且hashed_password列也将会被匹配。

Xml代码  

  1. <select id="selectUsers" resultType="User">
  2. select
  3. user_id             as "id",
  4. user_name           as "userName",
  5. hashed_password
  6. from some_table
  7. where id = #{id}
  8. </select>
  9. <resultMap id="userResultMap" type="User">
  10. <result property="password" column="hashed_password"/>
  11. </resultMap>

Mybatis有三层匹配级别:

  • NONE - 禁止自动匹配,只有手工配置的才会被匹配。
  • PARTIAL - 将会自动的匹配出除在内部(joins)内部嵌套的所有属性
  • FULL - 自动匹配所有的

默认是PARTIAL。(官网还解释了原因,不再详细介绍)

 3. cache(缓存)

除了局部的 session 缓存,可以增强变现而且处理循环 依赖也是必须的外,Mybatis 默认情况下是没有开启缓存的。要开启二级缓存,你需要在你的 SQL 映射文件中添加一行:

Xml代码  

  1. <cache/>

字面上看就是这样。这个简单语句的效果如下:

  • 映射语句文件中的所有 select 语句将会被缓存。
  • 映射语句文件中的所有 insert,update 和 delete 语句会刷新缓存。
  • 缓存会使用 Least Recently Used(LRU,最近最少使用的)算法来收回。
  • 根据时间表(比如 no Flush Interval,没有刷新间隔), 缓存不会以任何时间顺序 来刷新。
  • 缓存会存储列表集合或对象(无论查询方法返回什么)的 1024 个引用。
  • 缓存会被视为是 read/write(可读/可写)的缓存,意味着对象检索不是共享的,而 且可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。

所有的这些属性都可以通过缓存元素的属性来修改。比如:

Xml代码  

  1. <cache
  2. eviction="FIFO"
  3. flushInterval="60000"
  4. size="512"
  5. readOnly="true"/>

中间省略几百字。。。。。参考官方网站的文档吧

自定义缓存:

除了这些自定义缓存的方式, 你也可以通过实现你自己的缓存或为其他第三方缓存方案 创建适配器来完全覆盖缓存行为。

<cache type="com.domain.something.MyCustomCache"/>

参照缓存:

回想一下上一节内容, 这个特殊命名空间的唯一缓存会被使用或者刷新相同命名空间内 的语句。也许将来的某个时候,你会想在命名空间中共享相同的缓存配置和实例。在这样的 情况下你可以使用 cache-ref 元素来引用另外一个缓存。

<cache-ref namespace="com.someone.application.data.SomeMapper"/>
时间: 2024-12-19 22:04:27

Result Maps、Auto-mapping、cache的相关文章

mybatis报错:A query was run and no Result Maps were found for the Mapped Statement、、Property [login_ip] not found on type [com.thinkgem.jeesite.common.permission.entity.PremissUser]问题解决

今天在做ssm项目的时候出现了: 先是出现 了错误: mybatis报错:A query was run and no Result Maps were found for the Mapped Statement 这是因为Dao.xml中的select标签中必须指定要返回的值的类型(注意:是返回值的单个类型,即如果你是返回一个List<User>的话,需要指定的是User) 具体的这种错误的解决办法见:https://www.cnblogs.com/isme-zjh/p/11757155.h

Nginx/tengine做cache时缓存机制—存不存、存多久、用不用方法论(图自画)

Nginx/tengine(后面名称只写nginx了)单纯做cache性能比不过ats,特别是在磁盘处理方面,不过论综合能力nginx就是大拿了,他集web服务器.负载均衡.cache三种能力于一身,可以说是非常综合性的选手.比如说一个中型网站的场景选型,前端是负载,后端托着一堆apache服务器,现在该到前端负载选型的了,虽然lvs和ha单纯从负载的性能要比nginx好一些,但我还是会选nginx,因为nginx在做负载的同时,可以将热点的静态内容cache一遍,做一次加速,无形间减轻了后端w

Android Preference存储、res/raw、asset、openFileOutput、sdcard存储、Cache详解

*res/raw.assets.其它存储的相同点: 两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制. 两者都是只读,是不能存储数据的目录. 相同都可以放文件. *res/raw.assets.其它存储的不同点: res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename:assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类. res/raw不可以有目录结构,而assets则可以有目

iOS 8 Auto Layout界面自动布局系列5-自身内容尺寸约束、修改约束、布局动画

首先感谢众多网友的支持,最近我实在是事情太多,所以没有写太多.不过看到大家的反馈和评价,我还是要坚持挤出时间给大家分享我的经验.如果你对我写的东西有任何建议.意见或者疑问,请到我的博客留言: http://blog.csdn.net/pucker 好了,言归正传.本系列的前几篇文章讲解了自动布局的原理,以及如何添加约束.这篇文章主要介绍以下内容: 某些用户控件具有自身内容尺寸约束 使用视图调试工具在运行时查看和调试程序界面视图层次.尺寸和自动布局约束 创建约束的对象关联 通过修改约束的常量值.删

Windows Phone本地数据库(SQLCE):7、Database mapping(翻译)

这是“windows phone mango本地数据库(sqlce)”系列短片文章的第七篇. 为了让你开始在Windows Phone Mango中使用数据库,这一系列短片文章将覆盖所有你需要知道的知识点. 我将谈谈在数据库中映射类到表中,也就是说,在你的对象模型和数据库模式之间映射. 1.Database mapping是什么 为了创建一个本地数据库,第一,你必须定义实体类.这些类定义了你的对象模型和它到数据库模式上的映射.LINQ to SQL的对象关系能力取决于映射的详细信息,以此来创建一

共享池之八:软解析、硬解析、软软解析 详解一条SQL在library cache中解析涉及的锁

先来张大图: 结合上图来说明一下解析的各个步骤涉及的锁. 软解析.硬解析.软软解析区别的简单说明: 为了将用户写的sql文本转化为oracle认识的且可执行的语句,这个过程就叫做解析过程. 解析分为硬解析和软解析,SQL语句第一次解析时必须进行硬解析 一句话说明硬解析与软解析的区别是: 硬解析=需要生成执行计划   软解析=不需要生成执行计划 在Oracle中存在两种类型的SQL语句,一类为DDL语句,不共享使用,也就是每次执行都需要进行硬解析.还有一类就是DML语句,会进行硬解析或软解析. 硬

C++ 11 Lambda表达式、auto、function、bind、final、override

接触了cocos2dx 3.0,就必须得看C++ 11了.有分享过帖子:[转帖]漫话C++0x(四) —- function, bind和lambda.其实最后的Lambda没太怎么看懂. 看不懂没关系,会用就行.可惜是连用都要思考半天.其实,查找根源是定义没有搞明白. 以后买东西,用之前,先看说明书才是必要的. ---------------------------------开始正文粘贴----------------------------------------- 一.Lambda表达式

c语言修饰符总结const、static、volatile、auto、extern、register

写在前面 今天下午一个同事问「register」关键字是什么作用?噢,你说的是「register」啊,它的作用是--脑袋突然断片儿,我擦,啥意思来着,这么熟悉的陌生感.做C语言开发时间也不短了,不过好像没有用到过「register」,但作用还是知道的,一下子想不起来了,一万个草泥马飞奔过来. 其实C语言中除了register外,还包含常见的const.static.volatile.auto.extern等修饰符,现在一起再总结一下好了. register 修饰符 register,寄存器变量,

如何在Dev-Cpp中使用C++11中的函数:stoi、to_string、unordered_map、unordered_set、auto

如果想要在Dev-Cpp里面使用C++11特性的函数,比如刷算法中常用的stoi.to_string.unordered_map.unordered_set.auto这些,需要在设置里面让dev支持c++11-需要这样做- 在工具-编译选项-编译器-编译时加入这个命令“-std=c++11”: 然后就可以愉快的用这些好用到飞起的C++11函数啦啦啦啦啦啦--- 原文地址:https://www.cnblogs.com/Mingusu/p/11979904.html