【学习笔记】Mybatis【ResultMap多表查询】

ResultMap手动映射

在使用ResultType时,我们需要pojo类中的字段与数据表一一对应,如果不一样我们需要手动映射
在这里插入图片描述
使用方法:

   <!--
         id:ResultMap标识,标签语句中 resultMap的值必须和该id一致
         type:指定你要映射哪一个JavaBean
         如果字段名和成员名一样,则可以不用指定映射关系,需要开启autoMapping
    -->

    <resultMap id="resultMap1" type="com.wzx.pojo.Order">
        <!--在这里要指定数据库表字段和JavaBean成员变量之前的映射关系-->
        <!--先指定主键字段和成员之间的映射关系-->
        <id column="id" property="id"></id>

        <!--先指定非主键字段和成员之间的映射关系
          column:字段名
          property:成员变量名
        -->
        <result column="user_id" property="userId"></result>
        <result column="number" property="number"></result>
        <result column="createtime" property="createtime"></result>
        <result column="note" property="note"></result>
    </resultMap>


    <select id="queryAllOrders" resultMap="resultMap1">
        SELECT id,user_id,number,createtime,note FROM orderx
    </select>

多表查询

如果使用ResultType,我们需要每次都要新建一个多表对应的pojo类,这里我们使用ResultMap来实现。

ResultMap使用笔记:

问题:mybatis一对多查询时有查询到多条记录但是集合中只有一条数据:
解决方法:User表和Oder表中有重复的列名,此时需要在select语句中给重复的列起别名
在这里插入图片描述

mybatis的ofType和javaType使用情境
一对一中使用association标签来的时候javatype用来指定连接的令一个表所对应的pojo类
在这里插入图片描述
一对多中使用collection标签,用oftype来指定集合中的元素类型
在这里插入图片描述

使用范例:

一对一
resultMap与association 配置映射:订单与用户属于一对一的关系

  1. 在需要使用实现多表查询的pojo类中添加另外一个pojo类
    在这里插入图片描述

接口

public interface OrderDao {
    List<Order> findOrder();
}

使用

</select>
<!--  一对一关系,一个订单对应的用户数据-->
<resultMap id="order_user" type="com.glc.bean.Order">

        <!--先指定Order类中User类属性和字段之间的映射关系
        property:表示Order类中User类对象的名字
        javaType:表示Order类中包含的User类的全路径名
        autoMapping:表示如果字段名和属性名一致,则自动映射
        -->
    <id property="id" column="id"></id>
    <association property="user" javaType="com.glc.bean.user" autoMapping="true">
        <id property="id" column="id"></id>
    </association>
</resultMap>
<select id="findOrder" resultMap="order_user">
        select * from `order` left join user on user.id=`order`.user_id
</select>

测试类

@org.junit.Test
public void TestFindOrder(){
    //获得session对象

    SqlSession sqlsessio = MySessionUtils.getSession();
    OrderDao mapper = sqlsessio.getMapper(OrderDao.class);
    List<Order> orderList=  mapper.findOrder();
    System.out.println(orderList);
    //调用getMapper
    sqlsessio.commit();
    sqlsessio.close();
    //查询订单
    //关闭连接
}

一对多
resultMap与collection配置映射:通过用户id查找到所有的用户订单
pojo类

public class user {
    private int id;
    private String username;
    private Date birthday;
    private int sex;
    private String address;
    private List<Order> orders;

接口

public interface UserDao {
    user findUserOrder(int user_id);    
}

配置文件

<resultMap id="UserOrder" type="com.glc.bean.user" autoMapping="true">
    <id property="id" column="id" ></id>
    <collection property="orders" ofType="com.glc.bean.Order" autoMapping="true">
        <id property="id" column="`order`.id"></id>
        <result column="user_id" property="userid"></result>
    </collection>
</resultMap>
<select id="findUserOrder" resultMap="UserOrder">
        select * from user  left join `order`  on user.id=`order`.user_id where user.id =#{user_id}
</select>

测试类

    public void TestFindUserOrder(){
        //获得session对象

        SqlSession sqlsessio = MySessionUtils.getSession();
        UserDao mapper = sqlsessio.getMapper(UserDao.class);
        user user=  mapper.findUserOrder(1);
        System.out.println(user);

        //调用getMapper
        sqlsessio.commit();
        sqlsessio.close();
        //查询订单
        //关闭连接
    }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值