【修真院java小课堂】Mybatis常用标签与动态查询

大家好,我是IT修真院成都分院第18期的学员,一枚正直纯洁善良的java程序员,今天我要分享的是修真院官网java任务二,深度思考中的知识点——Mybatis有哪些常用标签?怎么使用标签来完成动态查询?

背景介绍

Mybatis是ORM(对象关系映射Object Relation Mapping)框架,支持定制化SQL,存储过程,高级映射。 原叫ibatis,在2010年迁移到google code,同年并改名MyBtis,2013年迁移到GItHub。

它的出现更是因为jdbc程序的缺陷: -大量配置信息硬编码    -大量无关业务处理的编码  -扩展优化不便,Mybatis也就有了对应的解决方案,xml配置和注解,POJO对象和数据库记录直接映射,比较完善的文档记录查询。mybatis的优势就是,学习成本较低,通过配置数据库交互的信息,动态SQL处理。

下面的内容不会介绍Mybatis的配置相关内容,直入Mybatis的XML映射文件常用标签和动态SQL语句。

知识剖析

一. XML映射的常用标签。

增删改查(insert,delete,update,select),SQL重用标签。

select查询,查询的演示在下面的编码实战,以下是查询的常用参数解析

id:select和insert,update,delete都有的参数,为当前语句命名,必须与Mapper接口中的方法同名

parameterType:将会传入这条语句的参数的类全限定名或别名。可写可不写,因为Mybatis可以通过类型处理器(TypeHandler)推断传入的参数

resultType:这条语句中返回结果的类全限定名或别名。resultMap可以代替它,两者只能存在一个。

flushCache:清理缓存,默认false;

useCache:缓存本条语句查询内容,select语句默认为true;

statementType默认值:PREPARED,让MyBatis使用PreparedStatement 执行语句。等。

insert,update,delete数据变更语句的参数差不多。放在一起说明。

id,parameterType,flushCache,statementType和上面一样。不同的是:

没有resultType,因为增删改不需要其他类型返回值,统一返回影响的行数。

useGeneratedKeys:insert和update使用,获取数据库的自增主键,搭配keyProperty。

keyProperty:指定能够唯一识别对象的属性

3.SQL这个元素可以用来定义可重用的 SQL 代码片段,以便在其它语句中使用。

二. 动态SQL语句

if,choose (when, otherwise),trim (where, set),foreach。

1.if语句

常见用法<if test=" 条件"></if>加在映射语句的后面, test是判断的条件

2.choose(when,otherwise)语句

当有多个条件判断时,不想使用所有的,只想从多个中选一个使用,类似于java中的Switch语句。

<choose> <when test=" "></when> <when test=" "></when> ... <otherwise></otherwise> </choose>

3.where,trim,set语句

where常与if搭配,只在条件都是动态的情况下使用。

<where> <if test="" ></if> <if test=""></if> ...</where>

trim自定义元素,trim是更灵活的去除多余关键字的标签,以及增加或者替换某块代码。

(1)trim标签有四个属性prefix,prefixOverrides,suffix,suffixOverrides

(2)使用prefix,suffix时,表示在trim标签包裹的前面或者后面增加引号里的内容

(3)prefixOverrides,suffixOverrides 表示删除或者说覆盖。

这儿不理解的看下面的编码实战的案例

set动态更新语句,用在update中。test里是列名判断语句

update tb_name <set> <if test="tr_name !=null"> tr_name = #{trName}</if>...</set> where id=#{id}

4.foreach语句

常见使用场景是对集合进行遍历,批量插入、批量删除,批量查询等。

foreach 元素的属性主要有 item,index,collection,open,separator,close。

item 表示集合中每一个元素进行迭代时的别名

index 指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,类似于数组下标。

open 表示该语句以什么开始,

separator 表示在每次进行迭代之间以什么符号作为分隔 符,

close 表示以什么结束。

collection要注意下,传入的是数组或者List等集合,那么值为array或者list,如果传入的是Map类型。值为Map中自定义的key。可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象作为集合参数传递给 foreach。

foreach

5.bind语句

bind 元素允许你在表达式以外创建一个变量,并将其绑定到当前的上下文。类似于java中定义一个成员变量,然后在方法中引用。下面定义模糊查询的条件为一个变量名pattern

<bind name="item" value="'%' + name+ '%'" />

SELECT * FROM tb_name WHERE title LIKE #{pattern}

常见问题&解决方案

1.在没有熟悉的情况下使用动态语句会出错。下面说明常出错的地方。

解决方案:这篇详细内容会让你更加熟悉Mybatis标签。比如使用了where语句,不能再使用<where>标签;resultType和resultMap参数不能同时使用;当Mapper接口有多个参数传递的时候,要加在接口传参处加@Param(“命名”);foreach的collection属性一定要理解,容易出错,还有就是迭代集合的时候,要用别名.值,即#{item.name},这儿是我自己掉的坑。

2.哪些是常用标签,动态标签我需要每个都要用吗?

解决方案:常用的就CRUD那四个(select,update,insert,delete),根据业务不同和需要,采用动态标签进行实现,不一定在一个项目中都用到,但是要考虑业务的扩展性,最后在设计最初,就考虑多一点,就比如查询全部,也许再以后新增按照名称,时间,状态等条件查询,这些都可以用动态查询补充。

3.if标签与choose标签的区别和选择

解决方案:if条件成立会连接当前语句,并继续执行下一条if,直到最后结束;而choose中,when则相当于从多个中选择一个,when判断成立,就不会继续执行。

编码实战

扩展思考

1.使用foreach语句会影响数据库的性能吗?

例如在执行几万插入时,性能降低的很明显,foreach 的集合越大,解析就越慢。可以选择自己拼接代码,而不再使用 foreach 啦。

参考文献

Mybatis官方文档

更多讨论

详见视频:



【修真院java小课堂】mybatis常用标签与动态查询_腾讯视频

A1: useCache将其设置为 true 后,将会导致本条语句的结果被二级缓存缓存起来,默认值:对 select 元素为 true。二级缓存指的是Mybatis中SqlSessionFactory对象的缓存。由同一个SqlSessionFactory对象创建出的SqlSession对象共享其缓存.缓存都是放在内存中的。

PPT在这里

鸣谢

感谢李邵博师兄,和其他诸位师兄,此教程是在他们之前技术分享的基础上完善而成。

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

进入链接详情http://www.jnshu.com/login/1/41570520

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342