mybatis一对一查询功能

  

所谓的一对一查询,就是说我们在查询一个表的数据的时候,需要关联查询其他表的数据。

  

  

首先说一个使用一对一查询的小需求吧:假设我们在查询某一个订单的信息的时候,需要关联查询出创建这个订单对应的用户信息。表模型如下(

  

 mybatis一对一查询功能

  

  

<强> sql语句的书写
  

  

首先,我们要对我们的需求进行分析。1。我们需要确定这个需求需要涉及到哪两张表,其中哪个是主表,哪个是关联表。具体怎么确定,还是看需求,我们的需求是说,在查询订单的时候,顺带着查出创建这个订单的用户。那么,已经很显然了。我们的主表是订单表(订单)。而我们的关联表则是用户表(用户)。

  

这个时候,我们就可以写出来如sql语下句了:

        从订单选择* 之前      

这个时候,我们就应该考虑这个问题了:我们在关联查询的时候应该使用内链接?还是外链接?对于搞不清内链接外链接的区别的同学,我这里先简单的介绍一下,等以后有时间了,再详细写一篇博客说明:内连接是只显示满足条件的,外链接分为左外和右外链接:左连接显示左边全部的再加上右边与左边相同的;右连接显示右边全部的和左边与右边相同的。

  

我们的需求是通过订单去关联用户,而由于在订单表中有一个外键(userId)。通过外键的去查关联表用户表的数据时,用户id是用户表的主键。这时,只能查到一条用户的信息,而这条记录不会导致我们的主查询结果发生改变,所以,我们选择内链接查询。这时候,我们的sql语句是这样的:

        从订单选择*,用户订单。user_id=user.id      

查询完成后,出现结果如下:

  

 mybatis一对一查询功能

  

这时,问题来了,我们发现,这个时候出现了两个id,这就会导致我们的数据在输出的时候封装到对象时会出现问题。而且,User_id这一列和我们的用户id数据是重复的。我们需要改造我们的sql。怎么改造呢?

  

因为我们的主表数据是要全部查询的,而用户表我们只需要用户名、性别、地址这三个信息(这里是假设,没必要纠结需要的是啥信息)。那么我们就需要手动指定我们的sql语句的查询字段了:

        选择   订单。*,   USER.username,   USER.sex,   USER.address   从   订单,   用户   在订单。user_id=user.id      

前面的这些都是在我们的sql链接工具上进行查询的,当可以显示我们需要的数据库后,我们的sql语句就确定了。这时我们该开始下一步了:

  

,<>强创建pojo

  

我们需要将查询到的结果,通过mybatis框架将数据封装到对应的对象。那么,问题来了,这个查询到的数据由谁来接收?我们如果要将上边sql查询的结果映射到pojo中,pojo中必须包括所有查询列名。但是不管是原来的订单类还是用户类,都没有办法映射全部的字。这段时,我们有一个很简单的解决办法:根据返回的字段,专门写一个类,让它包含所有的查询结果,然后让这个类去接收这个返回的结果集。

  

这时有个小技巧,我们的新的pojo中,不需要将所有的字段全部都写上,我们可以让新pojo去继承我们的包含结果集中查询字段较多的一个类,然后将其他需要的数据写到这个子类中即可。

  

 mybatis一对一查询功能

  

创建pojo完成后,我们就需要根据规范去创建我们的映射文件和写对应的接口中的方法:

  

mapper.xml   

 mybatis一对一查询功能

  

mapper.java中的接口:

  

 mybatis一对一查询功能

  

  

sql语句上,resultType和resuleMap实现的方式一样,这里就直接跳过了。

  

<强>使用resultMap映射的思路

  

我们知道,使用pojo的时候,我们可以将一些数据封装到pojo的对象属性中,他的属性可以是简单类型,也可以是另外一个pojo。这时,我们可以这么做:

mybatis一对一查询功能