Mybatis 杂记 (一)

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

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 回帖 • 431 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    51 引用 • 226 回帖
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    915 引用 • 931 回帖
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    77 引用 • 1741 回帖
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖 • 2 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 67 关注
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 596 关注
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    6498 引用 • 29198 回帖 • 248 关注
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖 • 1 关注
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    139 引用 • 441 回帖
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 132 关注
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 603 关注
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 439 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖 • 1 关注
  • ZeroNet

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

    1 引用 • 21 回帖 • 592 关注
  • Pipe

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

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

    131 引用 • 1114 回帖 • 149 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    205 引用 • 357 回帖
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 426 关注
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 695 关注
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • Swagger

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

    26 引用 • 35 回帖 • 12 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 437 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖 • 1 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 745 关注
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 43 关注
  • 资讯

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

    53 引用 • 85 回帖