Mybatis 杂记 (一)

本贴最后更新于 2447 天前,其中的信息可能已经时移世易

Mybatis 杂记:

当数据库涉及到一对一时 Mybatis 的处理方法:

  • 例如在 bean 类中定义如下两个类(Hus 和 Wife 类),在国内还是一夫一妻制的吧,2333(逃。。。)
    然后需要做的就是在 Hus 和 Wife 类中各自写上另一方的引用!
public class Hus { private long id; private String name; private int age; private Wife wife; //Getter and Setter //toString //Constuctor } public class Wife { private long id; private String name; private int age; private Hus hus; //Getter and Setter //toString //Constuctor }
  • Mapper 类中定义如下方法:
List<Hus> findHus_Wife();
  • 重点就落在了 XXXMapper.XML 文件的编写上:

有 5 种编写的方式:
1.定义 select 标签,然后写好 SQL 语句:

<select id="findHus_Wifes" resultMap="hus_wife_model"> select a.ID,a.NAME,a.AGE, b.id ids,b.NAME names,b.AGE ages from HUS a,WIFE b where a.id=b.hus_id </select>

注意: Hus 表和 Wife 表具有相同的列名 id 和 name,age,如不采用别名,Mybatis 会认为这里的参数为相同,故需要立别名来保证 Mybatis 查找到 Wife 表的内容!

定义 ResultMap:
注意:其中 hus 和 wife 经过别名处理,请在 mybatis-config.xml 中定义别名!或在 type 内些上 bean 类的全限定名尚可。

<resultMap id="hus_wife_model" type="hus"> <id property="id" column="id"></id> <result property="name" column="name"/> <result property="age" column="age"/> <result property="wife.id" column="ids"/> <result property="wife.name" column="names"/> <result property="wife.age" column="ages"/> </resultMap>

idnameage 都是查询到的 Hus 表中的三个数据,当设计到 Wife 表时,第一后边的 column 属性要变成上方 SQL 语句中 idsnamesages,第二 property 属性内要写成 wife.id 形式,wife 是 Hus 类中对 Wife 引用名,即第四条属性(Mybatis 会自动去搜寻 getWife()方法,并将其以去掉 get,并取后面字段小写的方式来获取属性名),获取到对象以后,.后写的就是 Wife 内的属性,取属性方式同理。


2.select 语句同上,重写 ResultMap:

先写一个 type 为 Wife 的 ResultMap:

<resultMap id="wife_model1" type="wife"> <id property="id" column="ids"></id> <result property="name" column="names"/> <result property="age" column="ages"/> </resultMap>

再写 type 为 Hus 的 ResultMap:
<association> 标签就可以用来关联一对一的映射关系,property 属性指向引用变量 wife,ResultMap 属性内填写的是 wife 的模板,也就是先为 Hus 类中第四个属性 wife 的引用书写模板,后在定义 Hus 的模板过程中再将刚才定义的 wife 的模板通过 association 标签引入,这样就达到了一对一关联的目的!

<resultMap id="hus_model2" type="hus"> <id property="id" column="id"></id> <result property="name" column="name"/> <result property="age" column="age"/> <association property="wife" resultMap="wife_model1"/> </resultMap>

3.select 语句同上,重写 ResultMap

<resultMap id="mod1_hus" type="hus"> <id property="id" column="id"></id> <result property="name" column="name" /> <result property="age" column="age" /> <association property="wife" javaType="wife"> <id property="id" column="ids"/> <result property="name" column="names" /> <result property="age" column="ages"/> </association> </resultMap>

这次不同的是用了同一个 ResultMap 来定义模板,在 association 标签中写入的是 wife 内的三个属性,总的来讲和 2 中使用的方法类似,相当于把两个模板合二为一!


4.select 继续不变化,再次变化 resultMap

<resultMap id="mod3_hus" type="hus"> <id property="id" column="id"></id> <result property="name" column="name"/> <result property="age" column="age"/> </resultMap> <resultMap id="mod3_hus_wife" type="hus" extends="mod3_hus"> <result property="wife.id" column="ids"/> <result property="wife.name" column="names"/> <result property="wife.age" column="ages"/> </resultMap>

先定义一个 hus 的 resultMap,然后再定义一个 resultMap 继承它!extends 表示从某个模板中把属性配置继承过来,类型一致。这样 mod3_hus_wife 中就有了继承的 hus 属性和新增的 wife 属性,也达到了我们所要的效果!


5.转变思想:

  • 先编写一个 select,作用是基于 hus_id 在 wife 表查询一行记录
<select id="selectWifeByhus_id" parameterType="Long" resultType="wife"> select id,name,AGE from WIFE where HUS_ID=#{id} </select>
  • 然后编写一个 resultMapassociationcolumnselect 填的是上面编写的 select 和他需要传入的参数值,相当于取当前的 id 属性(即 hus 的 id 属性 hus_id)说去上面定义的 select 中通过 hus_Id 查询到对应的 wife 属性,然后将其填入 <association> 的子标签中!
<resultMap id="mod2_hus" type="hus"> <id property="id" column="id"></id> <result property="name" column="name"/> <result property="age" column="age"/> <!-- column 表示基于该属性去查询 --> <association property="wife" column="id" select="selectWifeByhus_id"> <id property="id" column="id"></id> <result property="name" column="name"/> <result property="age" column="age"/> </association> </resultMap>

这样我们的主 select 的作用就是从 Hus 中取出对应的值就好了!

<select id="findHus_Wife3" resultMap="mod2_hus"> select id,name,age from HUS </select>
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    173 引用 • 414 回帖 • 365 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖 • 5 关注
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    53 引用 • 190 回帖 • 1 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 26 关注
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    91 引用 • 59 回帖 • 2 关注
  • 浅吟主题

    Jeffrey Chen 制作的思源笔记主题,项目仓库:https://github.com/TCOTC/Whisper

    1 引用 • 28 回帖 • 1 关注
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    86 引用 • 165 回帖
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    23 引用 • 32 回帖 • 2 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖 • 1 关注
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    372 引用 • 1857 回帖
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    173 引用 • 414 回帖 • 365 关注
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    413 引用 • 3590 回帖
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    291 引用 • 4495 回帖 • 662 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 99 关注
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    134 引用 • 1127 回帖 • 109 关注
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4601 回帖 • 712 关注
  • CodeMirror
    2 引用 • 17 回帖 • 168 关注
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 260 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    32 引用 • 99 回帖
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    284 引用 • 248 回帖
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    115 引用 • 318 回帖
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 9 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 403 关注
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    98 引用 • 367 回帖
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    54 引用 • 37 回帖
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3455 回帖 • 151 关注
  • 音乐

    你听到信仰的声音了么?

    62 引用 • 512 回帖