Mybatis 杂记 (一)

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

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。

    170 引用 • 414 回帖 • 388 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • 工具

    子曰:“工欲善其事,必先利其器。”

    288 引用 • 734 回帖
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 63 关注
  • CongSec

    本标签主要用于分享网络空间安全专业的学习笔记

    1 引用 • 1 回帖 • 15 关注
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 632 关注
  • danl
    146 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 538 关注
  • PWL

    组织简介

    用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖
    用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/

    用爱发电组织的核心驱动力:

    • 遵守开源守则,体现开源&贡献精神:以分享为目的,拒绝非法牟利。
    • 自我保护:使用适当的 License 保护自己的原创作品。
    • 尊重他人:不以各种理由、各种漏洞进行未经允许的抄袭、散播、洩露;以礼相待,尊重所有对社区做出贡献的开发者;通过他人的分享习得知识,要留下足迹,表示感谢。
    • 热爱编程、热爱学习:加入组织,热爱编程是首当其要的。我们欢迎热爱讨论、分享、提问的朋友,也同样欢迎默默成就的朋友。
    • 倾听:正确并恳切对待、处理问题与建议,及时修复开源项目的 Bug ,及时与反馈者沟通。不抬杠、不无视、不辱骂。
    • 平视:不诋毁、轻视、嘲讽其他开发者,主动提出建议、施以帮助,以和谐为本。只要他人肯努力,你也可能会被昔日小看的人所超越,所以请保持谦虚。
    • 乐观且活跃:你的努力决定了你的高度。不要放弃,多年后回头俯瞰,才会发现自己已经成就往日所仰望的水平。积极地将项目开源,帮助他人学习、改进,自己也会获得相应的提升、成就与成就感。
    1 引用 • 487 回帖 • 2 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 673 关注
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖 • 1 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 653 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖 • 1 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 401 关注
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    12 引用 • 54 回帖 • 159 关注
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 75 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    178 引用 • 997 回帖 • 1 关注
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    86 引用 • 122 回帖 • 627 关注
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    17 引用 • 53 回帖 • 139 关注
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    8 引用 • 26 回帖
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    55 引用 • 85 回帖
  • Sym

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

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

    524 引用 • 4601 回帖 • 699 关注
  • abitmean

    有点意思就行了

    28 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    545 引用 • 672 回帖
  • 脑图

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

    30 引用 • 96 回帖
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 5 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1706 回帖