Mybatis一对一与一对多查询

关联查询

  • 一个项目一般存在多个表
  • 单表对单表,单表对多表,多表对多表
  • 查询表数据要使用多表查询,Mybatis中重点掌握resultType与resultMap
    用户表
    订单表
    分别是用户表与订单表,在用户表,一个记录可以对应多个订单,站在订单,一个记录只能使一个对应的用户,这就是所谓一对一,一对多

关联(一对一)

  • 在用户表,一个记录可以对应多个订单,站在订单,一个记录只能使一个对应的用户,这就是所谓一对一,一对多
  • 数据两个表则需要连接查询
  • 查询结果进行封装,有两种封装方式

测试

@Test
    public void test01(){

        //ResultType=>类
        SqlSession session = MySessionUtils.getSession();
        //update  insert delete find
        OrderDao orderDao =  session.getMapper(OrderDao.class);
        List<OrderUer> list=orderDao.findAllOrderUser();
        System.out.println(list);
        //关闭资源
        session.commit();
        session.close();

    }

定义接口方法

 /*
    select o.id as oid,
	o.user_id ,
	o.number,
	o.createtime,
	o.note,
	u.id as uid,
	u.username,
	u.birthday,
	u.sex,
	u.address
     from  `order` o left join `user` u
     on o.user_id=u.id;
     */
    List<OrderUer> findAllOrderUser();

resultmap的作用与使用

  • 建立查询字段与实体类成员变量的映射关系
 <!--
        id:ResultMap标识,标签语句中 resultMap的值必须和该id一致
        type:指定你要映射哪一个JavaBean
        如果字段名和成员名一样,则可以不用指定映射关系
   -->

   <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>

配置映射

<select id="queryOrderAndUser" resultType="OrderUser">
    SELECT
        o.id ,user_id userId,number,createtime,note,u.id uid,username,birthday,sex,address
    FROM orderx o LEFT JOIN USER u
    ON o.user_id = u.id;
</select>
public class OrderUser {
    // 订单id
    private int id;
    // 用户id
    private Integer userId;
    // 订单号
    private String number;
    // 订单创建时间
    private Date createtime;
    // 备注
    private String note;

    private int uid;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

关联查询(一对多)

  • 分析下属性
    从用户表的角度看,一个用户可以多次购买,产生多个订单。使用左连接查询每个用户的订单。
  • 查询结果如何转换成JavaBean?
    User {
    List orders;
    }
<!--3:查询每个用户下的多个订单: 一对多-->

    <resultMap id="userOrderMap" type="User" autoMapping="true">
        <!--1:指定User类的字段和属性之间的映射关系-->
        <id column="uid" property="id"></id>

        <!--2:指定User类中的Order字段和属性之间的映射关系-->
        <collection property="orders" javaType="list" ofType="Order" autoMapping="true">
            <id column="id" property="id"></id>
            <result column="user_id" property="userId"></result>
        </collection>
    </resultMap>

    <select id="queryOrdersOfUser" resultMap="userOrderMap">
        SELECT
            u.id uid,u.username,u.birthday,u.sex,u.address,o.id ,o.user_id ,o.number,o.createtime,o.note
        FROM  USER u INNER JOIN orderx o
        ON o.user_id = u.id;
    </select>




    //3:查询每个用户下的多个订单: 一对多
    public List<User> queryOrdersOfUser();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值