mybatis之入门到开发(五)之 关联查询 一对一 和一对多

一:一对一查询
1、商品订单数据模型
这里写图片描述
2、一对一查询,需求:查询一个订单信息,关联查询下单用户信息。【这里的表结构会打包打给大家】
3、开发步骤:
3.1、在navicat中写sql语句,验证一下语句是否正确。
这里写图片描述
3.2、引入podo
这里写图片描述

这里写图片描述
3.3、在UserMapper中写映射文件。当然你可以新建一个OrdersMapper.xml,我觉得麻烦就写在一起了
注意了:返回的结果集必须是resultMap。这是因为在Order中有关联对象user,但是数据库不会知道user_id–>找到user对象—>映射到user里面去。所以需要手动映射。手动映射跟之前的映射方法是一样的。我们这里主要学习一对一的映射使用的是< association >标签。其实到末尾总结的时候,你会发现,一对已映射,跟一对多映射我们只需要掌握两个标签

<!-- 
    //一对一关联 查询  以订单为中心 关联用户
    public List<Orders> selectOrders();
     -->
<resultMap type="orders" id="ordersOne">
        <!--这里你需要映射的字段都不能省略,一个个都必须写出来-->
        <id column="id" property="id"/>
        <result column="number" property="number"/>
        <result column="createtime" property="createtime"/>
        <result column="user_id" property="userId"/>
        <!-- 以下是一对一的映射,采用的是association标签配置 -->
        <association property="user" javaType="user">
            <!--这里你需要映射的字段都不能省略,一个个都必须写出来-->
            <id column="user_id" property="id"/>
            <result column="username" property="username"/>
            <result column="address" property="address"/>
        </association>
    </resultMap>
    <!-- 测试1对1查询 -->
    <select id="selectOrdersByUserId" parameterType="int" resultMap="ordersOne">
        select o.id,
               o.number,
               o.user_id,
               o.createtime,
               u.username,
               u.address
        from orders o 
        LEFT JOIN user u 
        on o.user_id = u.id 
        where o.id = #{id}
    </select>

4.4 、在UserMapper接口中,配置该方法

public Orders selectOrdersByUserId(Integer id);

4.5、写测试用例

@Test
    public void selectOrdersByUserId(){
        SqlSessionFactory sqlSessionFactory = MybatisUtilsForMe.getSqlSessionFactory();
        SqlSession session = sqlSessionFactory.openSession();
        UserMapper ordersMapper = session.getMapper(UserMapper.class);

        Orders orders = ordersMapper.selectOrdersByUserId(3);
        System.out.println("===========");
        System.out.println("orders 的id = "+orders.getId());
        System.out.println("orders 的userId = "+orders.getUserId());
        System.out.println("orders 的number = "+orders.getNumber());
        System.out.println("orders 的createtime = "+orders.getCreatetime());
        System.out.println("-------------------");

        System.out.println("user 的username = "+orders.getUser().getUsername());
        System.out.println("user 的address = "+orders.getUser().getAddress());
        System.out.println("user 的id = "+orders.getUser().getId());
        System.out.println("===========");

        session.commit();
        session.close();
    }

4.6、测试结果如下
这里写图片描述
4.7、自此,我们就学会了一对一映射
二:一对多的查询
1、商品订单数据模型
这里写图片描述
2、需求:查询所有用户信息及用户关联的订单信息。一个用户有多个订单,也就是一对多
3、开发步骤
3.1、在navicat中写sql语句,验证一下语句是否正确。

//查询用户id为1的订单,下述查询出来有两个订单哦

这里写图片描述
3.2、引入podo,podo跟上面是一样的,但是在User.podo中添加一个List< Orders >,如图
这里写图片描述
3.3、在UserMapper中写映射文件。当然你可以新建一个OrdersMapper.xml,我觉得麻烦就写在一起了 。注意了:返回的结果集必须是resultMap。这是因为在User中有关联对象orders,但是数据库不会知道u.id –>找到orders对象—>映射到user里面去。所以需要手动映射。手动映射跟之前的映射方法是一样的。我们这里主要学习一对一的映射使用的是< collection >标签。其实到末尾总结的时候,你会发现,一对一映射,跟一对多映射我们只需要掌握两个标签

<!-- 
        //一对多关联
    public List<User> selectUserList(); -->
    <resultMap type="user" id="userOne">
        <id property="id" column="id"/>
        <result property="username" column="username"/>
        <result property="address" column="address"/>
        <!-- 一对多 -->
        <collection property="ordersList" javaType="list" ofType="orders">
            <id property="id" column="oid"/>
            <result column="createtime" property="createtime"/>
            <result column="number" property="number"/>
        </collection>
    </resultMap>
    <select id="selectUserList" parameterType="int" resultMap="userOne">
        select   
               u.id,
               u.username,
               u.address,   
               o.number,
               o.createtime,
               o.id as oid  
        from user u 
        LEFT JOIN orders o 
        on o.user_id = u.id 
        where u.id = #{id}
    </select>

3.4 、在UserMapper接口中,配置该方法

public User selectUserList(Integer id);

3.5、写测试用例

@Test
    public void selectUserList(){
        SqlSessionFactory sqlSessionFactory = MybatisUtilsForMe.getSqlSessionFactory();
        SqlSession session = sqlSessionFactory.openSession();
        UserMapper ordersMapper = session.getMapper(UserMapper.class);

        User user = ordersMapper.selectUserList(1);
        System.out.println("---打印user信息");
        System.out.println("user 的id = "+user.getId());
        System.out.println("user 的 username = "+user.getUsername());
        System.out.println("user 的 address = "+user.getAddress());
        System.out.println("--------------");
        List<Orders> ordersList = user.getOrdersList();
        for (Orders orders : ordersList) {
            System.out.println("订单的id = "+orders.getId()+"--订单编码 = "+orders.getNumber());
        }

        session.commit();
        session.close();
    }

3.6、测试结果如下
这里写图片描述
3.7 、自此,我们就学会了一对多映射


【总结:】其实上述的代码跟前面写的代码没有什么区别,只是需要学习两个新的标签。一对多跟多对多的配置标签而已。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值