• MyBatis 一对一查询的实现


    前期工作  

      首先我们建立一张用户表,一张账户表,使用户表和账户表之间实现一对多的关系,用户表我们之前已经创好了是user,现在我们来创账户表,账户表的外键是用户表的id

      然后我们把之前的动态sql项目拷贝一份,dao接口只留这些

      把user实体类的成员名改成和表的列名一样,然后生成他们的get,set方法以及tostring

      然后我们在java中建立账户实体类,同样的生成他们的get,set以及tostring方法

      和user一样,Account我们也要写一个对应的接口,里面写上findAll方法

      现在我们把IUserDao的xml配置拷贝一份放到相同路径,改掉名字信息

      现在我们来写测试类,拷贝之前的测试类,只留下findAll方法并把相关变量名改了。

       因为我们之前在全局配置里用了别名和导包,现在就不用配置可以直接运行了

    一对一查询 方法一

      如果现在要求在查询account的同时,得到当账户的所属用户信息。我们先想想sql语句怎么写,那是不是要根据account的uid,匹配user的id对吧

      可以看到两个表的列名id重复了,我们再来取个别名

      那在在这个表我们想要什么信息呢?因为两个id相同,我们只要一个就行,如果我们还需要用户名和地址,在mybatis怎么写呢?我们现在IAccountDao接口新增一个方法

      因为我们的Account实体类是不带名称和地址信息,所以我们新建一个AccountUser类继承Account,这样就有了父类account的成员变量,我们再手动加上名称和地址即可,需要注意子类的tostring要多加个super.tostring调用父类的tostring

      现在我们可以写xml配置了

       然后我们来写测试类

       run一下我们看看

       我们可以看到它成功输出了account的信息和我们新加的名称和地址,中间的空格是我们tostring加的

    一对一查询 方法二

      上面这种方式在实际开发中是不常见的,因为你要得到其他信息还要多写个子类,很麻烦对不。现在来讲第二种方式。

      从表的关系来看,用户和账户是一对多的,又因为java实体类和表是对应的,所以在实体类里要体现这个一对多关系。我们在account里加点改动,我们在account类里添加主表实体的引用,并添加get和set方法。这意味着得到account信息要同时封装它对应的user信息。

       我们来到account的xml进行改动,复习一下column代表表的列名,property代表实体类的属性名,id是主键的映射,注意javatype指的是返回的类型,因为user有了别名我们就可以直接写user了。

       这样用上这条sql语句,再用上刚定义的resultMap,我们就能进行user的封装

       在测试类我们加上对user的输出

       这样我们就很容易地实现了对user的封装

      

  • 相关阅读:
    Leetcode: Total Hamming Distance
    Leetcode: Hamming Distance
    Leetcode: Valid Word Square
    Leetcode: Sentence Screen Fitting
    Leetcode: Minimum Unique Word Abbreviation
    Leetcode: Design Phone Directory
    Leetcode: Valid Word Abbreviation
    Leetcode: Range Addition
    Leetcode: Find Leaves of Binary Tree
    Leetcode: Design Hit Counter
  • 原文地址:https://www.cnblogs.com/qq2210446939/p/13574053.html
Copyright © 2020-2023  润新知