4.1 映射器的主要元素

4.2 select元素

4.2.2 简易数据类型的例子

例如,我们需要统计一个姓氏的用户数量。应该把姓氏作为参数传递,而将结果设置为整型返回给调用者,如:

4.2.3 自动映射

当参数autoMappingBehaviour不设置为NONE的时候,MyBatis会提供自动映射的功能,只要返回的SQL列名和JavaBean的属性一致,MyBatis就会帮助我们回填这些字段而无需任何配置。比如:

4.2.4 传递多个参数

4.2.4.1 使用Map传递参数:

对于RoleDao接口,我们提供一个方法:

然后输入上面的代码就可以使用这个方法了:

这个方法虽然简单易用,但是有一个弊端:这样设置的参数使用了Map,而Map需要键值对应,由于业务关联性不强,你需要深入到程序中看代码,造成可读性下降。

4.2.4.2 使用注解方式传递参数

使用iBatis的参数注解@Param(org.apache.ibatis.annotations.Param)来实现想要的功能,把RoleDao接口修改为下面的形式:

再把映射器的XML修改为无需定义参数类型,如:

可读性虽然大大提高,但是如果一条SQL拥有10个参数的查询,如果我们都使用@Param方式,那么参数将十分复杂。

4.2.4.3 使用JavaBean传递参数

在参数过多的情况下,MyBatis允许组织一个JavaBean,通过简单的setter和getter方法设置参数。首先,定一个RoleParams的JavaBean,如:

用JavaBean改写一下传递参数的例子:

同样我们要在RoleDao接口提供一个方法:

4.2.4.4 总结

4.2.5 使用resultMap映射结果集

某些时候,我们需要处理更为复杂的映射,resultMap为我们提供了这样的模式。我们需要在映射器中定义resultMap,这也是常见的场景:

4.3 insert元素

4.3.1 概述

4.3.2 主键回填和自定义

可以使用keyProperty属性指定哪个是主键字段,同时使用useGeneratedKeys属性告诉MyBatis这个主键是否使用数据库内置策略生成。

上面指定了id列是主键,自增字段。但是实际工作往往需要根据一些特殊的关系设置主键id的值,假设我们取消表t_role的id自增规则,要求是:如果表t_role没有记录,则我们需要设置id=1,否则我们就取最大id加2来设置新的主键。这个时候可以使用selectKey元素处理,如:

4.4 update元素和delete元素

4.5 参数

需要强调的一点是:定义参数属性的时候,MyBatis不允许换行!

4.5.1 参数配置

可以传入一个简单的参数,比如int,double,也可以传入JavaBean。有时候需要处理一些特殊的情况,可以指定特定的类型,以确定使用哪个typeHandler处理它们,以便我们进行特殊处理:

4.5.2 存储过程支持

对于存储过程而言,存在3中参数,输入参数(IN)、输出参数(OUT)、输入输出参数(INOUT)。通过指定mode属性来确定是哪一种参数,选项有3种:IN、OUT、INOUT。

4.5.3 特殊字符串替换和处理(#和$)

转载--MyBaits中的#和$的区别

4.6 sql元素

我们可以定义一串SQL语句的组成部分,其他的语句可以通过引用来使用它,从而避免重复的SQL语句。如:

4.7 resultMap结果映射集

作用是定义映射规则,级联的更新,定制类型转化器等。

4.7.1 resultMap元素的构成

4.7.2 使用map存储结果集

4.7.3 使用POJO存储结果集

POJO是我们最常用的方式,使用前需要配置resultMap,如:

接着我们在映射文件的select元素里面做如下的配置便可以使用了:

4.7.4 级联

rsultMap的级联分为3种:association、collection和discriminatior。

4.7.4.4 性能分析和N+1问题

4.4.7.5 延迟加载

意义在于,一开始并不取出级联数据,只有当使用它才发送SQL去取回数据。在MyBatis的配置中有两个全局的参数lazyLoadingEnabled和aggressiveLazyLoading。LazyLoadingEnabled的含义是是否开启延迟加载,aggressivaLazyLoading的含义是对任意延迟属性的调用会使带有延迟加载属性的对象完整加载,反之,每种属性将按需加载。

4.8 缓存cache

4.8.1 系统缓存(一级缓存和二级缓存)

没有配置的默认情况下,只开启一级缓存。所以在参数和SQL完全一样的情况下,我们使用同一个SqlSession对象调用同一个Mapper的方法,往往值执行一次SQL,因为第一次的查询结果会放在缓存中,如果没有声明需要刷新,并且缓存没有超时的情况下,SqlSession都只会取出当前缓存的数据,而不会再次发送SQL到数据库。一级缓存在各个SqlSession是相互隔离的,为了克服这个问题,我们往往需要配置二级缓存,使得缓存在SqlSessionFactory层面上能够提供给各个SqlSession。实现二级缓存的时候,MyBatis要求返回的POJO必须是可序列化的。配置的方法很简单,只需要在映射XML文件配置就可以开启了。

4.8.2 自定义缓存

系统缓存是MyBatis应用机器上的本地缓存,但是在大型服务器上,会使用各类不同的缓存服务器,这个时候我们可以定制缓存,比如Redis缓存。我们需要实现MyBatis为我们提供的接口org.apache.ibatis.cache.Cache,缓存接口简介如下:

可以配置SQL层面上的缓存规则,决定是否需要或者刷新缓存:


 5.1 动态SQL概述

MyBatis的动态SQL包括以下几种元素:

5.2 if元素

5.3 choose、when、otherwise元素

5.4 tirm、where、set元素

5.5 foreach元素、test的属性、bind元素

《深入浅出MyBatis技术原理与实战》——4. 映射器,5. 动态SQL的更多相关文章

  1. 《深入浅出MyBatis技术原理与实战》——6. MyBatis的解析和运行原理

    MyBatis的运行分为两大部分,第一部分是读取配置文件缓存到Configuration对象,用以创建SqlSessionFactory,第二部分是SqlSession的执行过程. 6.1 涉及的技术 ...

  2. 《深入浅出MyBatis技术原理与实战》——3. 配置

    要注意的是上面那些层次是不能够颠倒顺序的,否则MyBatis在解析文件的时候就会出现异常. 3.1 properties元素 properties是一个属性配置元素,让我们能在配置文件的上下文中使用它 ...

  3. 《深入浅出MyBatis技术原理与实战》——1.简介,2.入门

    1. 简介 Java程序都是通过JDBC连接数据库,但是只定义了接口规范,具体的实现交给各个数据库厂商去实现,因为每个数据库都有其特殊性.所以JDBC是一种桥接模式. 这里为什么说JDBC是一种桥接模 ...

  4. 深入浅出MyBatis技术原理与实战

    第1 章 MyBatis 简介..................................................................................... ...

  5. 《深入浅出MyBatis技术原理与实战》——7. 插件

    在第6章讨论了四大运行对象的运行过程,在Configuration对象的创建方法里我们看到了MyBatis用责任链去封装它们. 7.1 插件接口 在MyBatis中使用插件,我们必须使用接口Inter ...

  6. 深入浅出Mybatis技术原理与实战(杨开振)(带详细书签) PDF 下载 高清 完整版+源码

    (杨开振) 源码 IDE eclipse 建表语句也在里面 电子书+源码地址

  7. 2017.2.9 深入浅出MyBatis技术原理与实践-第八章 MyBatis-Spring(二)-----配置文件详解

    深入浅出MyBatis技术原理与实践-第八章 MyBatis-Spring(二) ------配置文件详解 8.2 MyBatis-Spring应用 8.2.1 概述 本文主要讲述通过注解配置MyBa ...

  8. 2MyBatis入门--深入浅出MyBatis技术原理与实践(笔记)

    什么是 MyBatis ? MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis ...

  9. 3MyBatis配置--深入浅出MyBatis技术原理与实践(笔记)

    XML 映射配置文件 configuration 配置 properties 属性 settings 设置 typeAliases 类型命名 typeHandlers 类型处理器 objectFact ...

随机推荐

  1. React高阶组件总结

    在多个不同的组件中需要用到相同的功能,这个解决方法,通常有Mixin和高阶组件. Mixin方法例如: //给所有组件添加一个name属性 var defaultMixin = { getDefaul ...

  2. 【极值问题】【CF1063B】 Labyrinth

    传送门 Description 给你一个\(n~\times~m\)的矩阵,一开始你在第\(r\)行第\(c\)列.你的上下移动不受限制,向左最多移动\(x\)次,向右最多移动\(y\)次.求你最多能 ...

  3. 用Apache Spark和TensorFlow进行的深度学习

    原文:https://databricks.com/blog/2016/01/25/deep-learning-with-apache-spark-and-tensorflow.html by Tim ...

  4. rem自适应js代码

    以后懒得写,直接复制了 var computedFz = (function(){ var designWidth = 375, rem2px = 100; function computedFz() ...

  5. [洛谷P1941] 飞扬的小鸟

    洛谷题目链接:飞扬的小鸟 题目描述 Flappy Bird是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了 ...

  6. [洛谷P2261] [CQOI2007]余数求和

    洛谷题目链接:[CQOI2007]余数求和 题目背景 数学题,无背景 题目描述 给出正整数n和k,计算G(n, k)=k mod 1 + k mod 2 + k mod 3 + - + k mod n ...

  7. 【C++ STL】Vector

    1.结构 vector模塑出一个动态数组,因此,它本身是“将元素置于动态数组中加以管理”的一个抽象概念.vector将其元素复制到内部的dynamic array中.元素之间总存在某种顺序,所以vec ...

  8. 苹果API常用英语名词---iOS-Apple苹果官方文档翻译

    本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 苹果API常用英语名词0. indicating 决定1.in order to 以便 ...

  9. Morley's Theorem (计算几何基础+向量点积、叉积、旋转、夹角等+两直线的交点)

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  10. web_一些常用的线上脚本地址记录(个人使用)

    1.jquery <script src="http://code.jquery.com/jquery-1.4.1.min.js"></script> 2. ...