JavaEE简单实例——MyBatis一对多关联映射的嵌套结果集查询

简单介绍:

在之前的章节,我们简单介绍了MyBatis中的一对一的关联查询,使用了嵌套查询和嵌套结果集两种方式进行讲解,但是在实际的使用中,我们常用的是嵌套结果集的查询方式,所以在一对多的查询中,我们也只针对嵌套结果集的查询方式进行讲解。嵌套结果集映射的核心思想就是通过一条SQL语句查询两个表,然后把两个表中查询出来的字段自定义映射到两个实体类中,最后实体类再进行嵌套。

如果之前已经熟练掌握或者能理解一对一查询中的各个标签的使用,在一对多的查询中的原理也是基本一样的,只不过是将配置一对一查询中的<association>标签换成了<collection>标签,并且增加了一个新的属性叫做ofType,这个属性的值就是我们List列表中的属性的类,关于这个属性我们会在后面使用的时候进行详细的演示。

我们首先来复习一下一对多的数据表查询结构:

那么,对应到SQL语句中就是下面这样: 

查询结果如下: 

  简单地说,就是一张表中的一列数据可以对应另一张表的多行数据,就像这个查询结果一样,张三的信息可以查询出两条订单信息,但是每一条订单信息的只属于张三一个人。

对应到Java类中的效果如下:

查询出多条信息对应就是B类的集合,而B类的每一条信息只能对应一个A类。

使用方法:

<!--    配置一对多的查询-->
    <select id="one_more_select" resultMap="one_more_mappers" parameterType="int">
        select u.id , u.name , u.sex , u.order_id uoid , o.order_id ooid , o.order_information 
        from user u,orders o 
        where u.order_id = o.order_id and u.id = #{id}
    </select>
    <resultMap id="one_more_mappers" type="User">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="sex" column="sex"/>
        <collection property="ListOrder" ofType="Orders" javaType="java.util.List">
            <result property="order_id" column="ooid"/>
            <result property="order_information" column="order_information"/>
        </collection>
    </resultMap>

在实现一对多的嵌套结果集映射中, 我们需要使用一个新的标签:<collection>,使用这个标签配置一对多的嵌套结果集查询,使用一个特殊的属性,ofType:这个属性的含义是指出我们需要填充进List集合中的反省的类型,也就是B类的类型:

只要掌握了这个标签和属性的使用之后,剩下的就和之前的嵌套结果集查询的写法是一样的了,接下来我们来进行完整的代码演示。 

代码实现:

数据库内的数据:

  

SQL映射文件:

<?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">
<!--        接口式开发有两个规范: -->
<!--1.接口中方法的名称必须与SQL语句的唯一标识,也就是id的值保持一致,resultType就是接口中返回值的类型,parameterType就是接口中方法的参数的类型-->
<!-- 2.mapper标签的namespace属性必须是接口的全路径,否则在运行的时候会无法找到接口对象的SQL映射文件 -->
<mapper namespace="mappers.one_more_select">
    <!--    根据id查询单条数据-->
    <select id="selectOne" resultType="user" parameterType="int">
        select *
        from user
        where id = #{id};
    </select>
    <!--    查询所有的数据-->
    <select id="selectAll" resultType="user">
        select *
        from user;
    </select>
<!--    配置一对多的查询-->
    <select id="one_more_select" resultMap="one_more_mappers" parameterType="int">
        select u.id , u.name , u.sex , u.order_id uoid , o.order_id ooid , o.order_information 
        from user u,orders o 
        where u.order_id = o.order_id and u.id = #{id}
    </select>
    <resultMap id="one_more_mappers" type="User">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="sex" column="sex"/>
        <collection property="ListOrder" ofType="Orders" javaType="java.util.List">
            <result property="order_id" column="ooid"/>
            <result property="order_information" column="order_information"/>
        </collection>
    </resultMap>
</mapper>

接口文件:

package mappers;

import com.mybatis.POJO.User;

import java.util.List;

public interface one_more_select {
    public User selectOne(int i);
    public List<User> selectAll();
    public List<User> one_more_select(int i);
}

实体类:

package com.mybatis.POJO;

import java.util.List;

public class User{
    private int id;
    private String name;
    private String sex;
    private List<Orders> ListOrder;

    public User() {
    }

    public User(int id, String name, String sex, List<Orders> listOrder) {
        this.id = id;
        this.name = name;
        this.sex = sex;
        ListOrder = listOrder;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public List<Orders> getListOrder() {
        return ListOrder;
    }

    public void setListOrder(List<Orders> listOrder) {
        ListOrder = listOrder;
    }

    @Override
    public String toString() {
        return "com.mybatis.POJO.User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", ListOrder=" + ListOrder +
                '}';
    }
}
package com.mybatis.POJO;

public class Orders {
    private int order_id;
    private String order_information;

    public Orders() {
    }

    public Orders(int order_id, String order_information) {
        this.order_id = order_id;
        this.order_information = order_information;
    }

    public int getOrder_id() {
        return order_id;
    }

    public void setOrder_id(int order_id) {
        this.order_id = order_id;
    }

    public String getOrder_information() {
        return order_information;
    }

    public void setOrder_information(String order_information) {
        this.order_information = order_information;
    }

    @Override
    public String toString() {
        return "orders{" + '\n' +
                "order_id=" + order_id +
                ", order_information='" + order_information + '\'' +
                '}'+'\n';
    }
}

测试类:

package mappers;

import com.mybatis.POJO.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.InputStream;

public class one_more_selectTest {
    SqlSession session = null;
    one_more_select mapper = null;

    @Before
    public void setUp() throws Exception {
        InputStream stream = Resources.getResourceAsStream("mybatis.xml");
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(stream);
        session = build.openSession(true);
        mapper = session.getMapper(one_more_select.class);
    }
    @Test
    public void testSelectOne() {
        User user = mapper.selectOne(1);
        System.out.println(user);
    }
    @Test
    public void testSelectAll() {
        for (User user : mapper.selectAll()) {
            System.out.println(user.toString());
        }
    }
    @Test
    public void testOne_more_mappers() {
        for (User oneMoreMapper : mapper.one_more_select(2)) {
            System.out.println(oneMoreMapper.toString());
        }
    }
}

注意点:

在这个案例中我们需要注意的是A类和B类的嵌套关系一定要清楚,以及ofTyoe的类型一定是B类的属性值,最后就是在自定义映射规则的时候一定要确定规则的正确,对应好每一个列和属性的映射关系。如果发现自己最后的查询结果和自己预期的不一致,首先去检查映射规则是否配置正确。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
MyBatis是一个开源的持久层框架,它可以帮助我们简化JavaEE应用程序中的数据库访问操作。在MyBatis中,一对多嵌套查询是指在查询结果中包含了一个对象和该对象所关联的多个子对象。 在JavaEE中使用MyBatis进行一对多嵌套查询的步骤如下: 1. 定义实体类:首先需要定义两个实体类,一个是主对象的实体类,另一个是子对象的实体类。主对象实体类中需要包含一个子对象的合属性。 2. 编写Mapper接口:创建一个Mapper接口,其中定义了查询方法,使用@Results和@Result注解来映射查询结果到实体类中。 3. 编写Mapper XML文件:在Mapper XML文件中编写SQL语句,使用嵌套查询的方式来获取主对象和子对象的数据,并通过resultMap将查询结果映射到实体类中。 4. 调用Mapper接口:在Java代码中调用Mapper接口的方法来执行查询操作,获取一对多嵌套查询的结果。 下面是一个示例代码,演示了如何使用MyBatis进行一对多嵌套查询: 1. 定义主对象实体类: ```java public class Order { private int id; private String orderNo; private List<OrderItem> orderItems; // 省略getter和setter方法 } ``` 2. 定义子对象实体类: ```java public class OrderItem { private int id; private String productName; // 省略getter和setter方法 } ``` 3. 编写Mapper接口: ```java public interface OrderMapper { @Results(id = "orderResultMap", value = { @Result(property = "id", column = "id"), @Result(property = "orderNo", column = "order_no"), @Result(property = "orderItems", column = "id", javaType = List.class, many = @Many(select = "com.example.mapper.OrderItemMapper.findByOrderId")) }) @Select("SELECT * FROM orders WHERE id = #{id}") Order findById(int id); } ``` 4. 编写Mapper XML文件: ```xml <mapper namespace="com.example.mapper.OrderMapper"> <resultMap id="orderResultMap" type="com.example.entity.Order"> <id property="id" column="id"/> <result property="orderNo" column="order_no"/> <collection property="orderItems" ofType="com.example.entity.OrderItem"> <id property="id" column="id"/> <result property="productName" column="product_name"/> </collection> </resultMap> <select id="findById" resultMap="orderResultMap"> SELECT * FROM orders WHERE id = #{id} </select> </mapper> ``` 5. 调用Mapper接口: ```java public class Main { public static void main(String[] args) { SqlSessionFactory sqlSessionFactory = ...; // 初始化SqlSessionFactory try (SqlSession sqlSession = sqlSessionFactory.openSession()) { OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class); Order order = orderMapper.findById(1); System.out.println("订单号:" + order.getOrderNo()); System.out.println("订单项:"); for (OrderItem orderItem : order.getOrderItems()) { System.out.println("商品名称:" + orderItem.getProductName()); } } } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值