【mybatis】各种查询方式 。技能 get

mybatis:一对一实现【扩展类】----》

复杂查询时,单表对应的po类已不能满足输出结果集的映射。所以要根据需求建立一个扩展类来作为resultType的类型。

------

   

 上xml代码:

复制代码
  <select id="findOrderById" parameterType="int" resultType="ordersExt">
        SELECT
            o.*,u.username,u.address
        FROM
            orders o,user u
        WHERE
            o.user_id = u.id
            AND o.id = #{id}
    </select>
复制代码

mybatis:一对一实现【模型里有模型】---》使用association和javaType

需求:要查订单信息里的用户信息。

在order模型里加入一个user模型,再给他get、set方法。

 

 

 

 

在写orderMapper的时候,只需要返回Orders模型即可~

上xml代码:

注意:association标签下的column字段是对应mysql表的字段,而property字段是对应模型类的属性。模型里有模型,使用association标签,javaType表示对应哪个模型,而property表示在orders表里的user属性字段。

复制代码
<!-- =============== 一对一 =================-->
    <!--如果模型里有模型,使用resultMap-->
    <resultMap id="orderRslMap" type="orders">
        <!-- 往orders的模型匹配数据-->
        <id column="id" property="id"></id>
        <id column="note" property="note"></id>
        <id column="number" property="number"></id>
        <id column="createtime" property="createtime"></id>

        <!-- 往orders的user匹配数据
         模型里有模型,使用association来配置-->
        <association property="user" javaType="user">
            <id column="user_id" property="id"></id>
            <id column="username" property="username"></id>
            <id column="address" property="address"></id>
        </association>
    </resultMap>
复制代码

mybatis:一对多实现【模型里有集合】---》使用collection和ofType

需求:根据订单Id查找订单信息、用户信息和订单明细信息

上模型代码:在orders模型里增加 orderDetails 字段,它是一个集合。一个订单里面包含多个订单详情。

复制代码
public class Orders {
    private Integer id;
    private Integer user_id;
    private String note;//备注
    private String number;
    private Date createtime;//写意的创建时间

    private User user;//定单所属的用户

    /* 一对多数据封装*/
    private List<OrderDetail> orderDetails;

    public List<OrderDetail> getOrderDetails() {
        return orderDetails;
    }

    public void setOrderDetails(List<OrderDetail> orderDetails) {
        this.orderDetails = orderDetails;
    }
复制代码

上xml代码:

复制代码
    <!--  ================一对多==================-->
    <resultMap id="orderRslMap3" type="orders">
        <!-- 往orders的模型匹配数据-->
        <id column="id" property="id"></id>
        <id column="note" property="note"></id>
        <id column="number" property="number"></id>
        <id column="createtime" property="createtime"></id>

        <!-- 往orders的user匹配数据
         模型里有模型,使用association来配置-->
        <association property="user" javaType="user">
            <id column="user_id" property="id"></id>
            <id column="username" property="username"></id>
            <id column="address" property="address"></id>
        </association>

        <!-- 一对多匹配: 往orders的orderdetails 匹配数据
        注意:集合里类型使用ofType,而不javaType
        -->
        <collection property="orderDetails" ofType="orderDetail">
            <id column="detail_id" property="id"></id>
            <id column="items_id" property="itemsId"></id>
            <id column="items_num" property="itemsNum"></id>
        </collection>
    </resultMap>

    <select id="findOrderById3" parameterType="int" resultMap="orderRslMap3">
       SELECT
            o.*,
            u.username,
            u.address,
            od.id detail_id,
          od.items_id,
          od.items_num
        FROM
            orders o,
            user u,
            orderdetail od
        WHERE
            o.user_id = u.id
          AND o.id = od.orders_id
            AND o.id = #{id}
    </select>
复制代码

mybatis:多对多实现【模型里有集合,集合里面有模型等等情况都可能】---》使用collection和ofType

需求:查询用户信息和用户购买的商品信息,要求将关联信息映射到主pojo的pojo属性中

 

sql查询结果:

 

 

 sql查询结果:建一等式,查四张表就有三个等式。(user,orders,orderdetail,item四张表)

 

 分析:

 

 上xml代码:

复制代码
   <!-- ==============查询用户信息及用户购买的商品信息============-->
    <resultMap id="userRslMap" type="user">
        <!-- 1.匹配user属性 -->
        <id column="id" property="id"></id>
        <result column="username" property="username"/>
        <result column="password" property="password"/>

        <!--2.匹配user的orderList-->
        <collection property="orderList" ofType="orders">
            <id column="order_id" property="id"></id>
            <result column="number" property="number"/>
            <result column="createtime" property="createtime"/>
            <result column="note" property="note"/>

            <!-- 3.匹配Orders里有orderDetails-->
            <collection property="orderDetails" ofType="orderDetail">
                <id column="detail_id" property="id"></id>
                <result column="items_id" property="itemsId"/>
                <result column="items_num" property="itemsNum"/>

                <!-- 4.配置定单详情的商品信息-->
                <association property="items" javaType="items">
                    <id column="items_id" property="id"/>
                    <result column="name" property="name"/>
                    <result column="price" property="price"/>
                    <result column="detail" property="detail"/>
                </association>
            </collection>
        </collection>
    </resultMap>

    <select id="findUserAndOrderInfo" resultMap="userRslMap">
        SELECT
            u.id,
            u.username,
            u.address,
            o.id order_id,
            o.number,
            o.createtime,
            o.note,
            od.id detail_id,
            od.items_id,
            od.items_num,
            it.name,
            it.price,
            it.detail
        FROM
            user u,
            orders o,
            orderdetail od,
          items it
        WHERE
            o.user_id = u.id
          AND o.id = od.orders_id
          AND od.items_id = it.id
    </select>
复制代码

建测试类模拟查询:

复制代码
  /**
     * 多对多
     * @throws IOException
     */
    @Test
    public void test9() throws IOException {

        UserMapper  mapper =  session.getMapper(UserMapper.class);

        List<User> users = mapper.findUserAndOrderInfo();
        for (User user : users){
            System.out.println("用户信息:" + user);
            for (Orders order : user.getOrderList()){
                System.out.println("定单信息:" + order);
                System.out.println("订单详情:");
                for (OrderDetail od :  order.getOrderDetails()){
                    System.out.println(od + ":" + od.getItems());
                }

                System.out.println("------------------------------");
            }

        }
    }
复制代码

查询结果:

 

posted @   expworld  阅读(327)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示