Mybatis联合查询之一对一(xml版)

Mybatis联合查询之一对一(xml版)

背景:

一张订单表,里边有一个用户记录,但只是记录一个用户的Id,创建订单实体类的时候,里边添加了一个用户的属性,是User类型;要求查询一条订单信息时为User属性赋值,此时的user属性不是Integer类型的user_id,而实User类的对象,解决这个问题,要用到一对一的联合查询

1. 两张表

  • user表

    iduser_nameuser_addressuser_age
    1李阳兰德中心18
    2张三动物园20
  • 订单表

    idorder_nogoodsuser_id
    110001电视机1
    210002显卡2
    310003显示器1
    410004品牌电脑2

2. dao接口

public interface OrderMapper {
    Order findById (Long id);
}

3. orderMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.liyang.springredis.mapper.OrderMapper">
    <resultMap id="orderMap" type="cn.liyang.springredis.pojo.Order">
        <id property="id" column="id"/>
        <result property="orderNo" column="order_no"/>
        <result property="goods" column="goods"/>
        <result property="userId" column="user_id"/>
        <!--告诉这个resultMap 表中不存在的属性user
            这个属性怎么查 :    association                联合其他表去查
            去哪里查       :    select="getUserById"        具体调用那个查询语句
            查的依据       :    column="user_id"            查询的参数是用户的id
        -->
        <association property="user" column="user_id" select="getUserById" ></association>
    </resultMap>
    <select id="findById" resultMap="orderMap" parameterType="java.lang.Long">
        select * from company.order where id = #{id}
    </select>
    <select id="getUserById" parameterType="java.lang.Long" resultType="cn.liyang.springredis.pojo.User">
        select * from company.user where id = #{id}
    </select>
</mapper>

Mybatis联合查询之一对一(注解版)

1. User.java

public class User {

  private long id;
  private String userName;
  private String userAddress;
  private long userAge;
  private Order order
}

2. Order.java

public class Order {
  private long id;
  private long orderNo;
  private String goods;
  private long userId;
  private User user;
}

3. UserMapper.java接口

public interface UserMapper {
    @Select( "select * from user where id=#{id}" )
    User findById (Long id);
}

4. OrderMapper.java接口

public interface OrderMapper {
    @Select( "select * from company.order where id=#{id}" )
    @Results({
            @Result(property = "user" , column = "user_id",one = @One(select = "cn.liyang.springredis.mapper.UserMapper.findById"))
    })
    Order findById (Long id);
}

测试类

    @Autowired
    OrderMapper orderMapper;
    @Test
    public void testOrder(){
        Order order = orderMapper.findById( 1L );
        System.out.println(order);
    }

总结:

  • 无论是xml配置,还是注解都有以下三个关键参数传递
    1. 交代那个属性是表中不存在的,需要联表查询的:user
    2. 用那个查询语句或者那个接口的那个方法:getUserByid/findUserById
    3. 查询的依据参数是哪一个:colunm=“user_id”
    4. 注解: @Result(property = “user” , column = “user_id”,one = @One(select = “cn.liyang.springredis.mapper.UserMapper.findById”))
    5. xml配置: association > property=“user” column=“user_id” select=“getUserById” ></association
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值