Mybatis知识小汇(10)——复杂查询环境搭建 ( 一对多处理)

一对多处理(比如一个老师对应多个学生)
测试环境搭建
  1. 导入lombok

  2. 实体类Teacher、Student

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Student {
        private int id;
        private String name;
        private int tid;
    }
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Teacher {
        private int id;
        private String name;
        //一个老师对应多个学生
        List<Student> students;
    }
    
  3. 接口TeacherMapper、StudentMapper

  4. 可以通过注解或者xml文件进行测试,看环境是否搭建成

按照结果嵌套处理
  1. TeacherMapper

    public interface TeacherMapper {
        Teacher getTeacher(@Param("tid") int id);
    }
    
  2. TeacherMapper.xml (记得在在核心配置中注册)

    思路:

    • 就直接连表查询
    <?xml version="1.0" encoding="UTF8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.wjq.dao.TeacherMapper">
    
    <!--    按结果查询,连表查询-->
        <select id="getTeacher" resultMap="TeacherStudent">
            select t.id tid, t.name tname, s.id sid, s.name sname
            from student s, teacher t
            where s.tid = t.id and t.id = #{tid};
        </select>
        <resultMap id="TeacherStudent" type="Teacher">
            <result property="id" column="tid"/>
            <result property="name" column="tname"/>
            <!--当是collection时,用ofType表示属性的类型-->
            <collection property="students" ofType="Student">
                <result property="id" column="sid"/>
                <result property="name" column="sname"/>
            </collection>
        </resultMap>
    </mapper>
    
  3. 测试

    public class UserMapperTest {
        @Test
        public void getTeacher(){
            SqlSession sqlSession = MybatisUtils.getSqlSession();
            TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
            Teacher teacher = mapper.getTeacher(1);
            System.out.println(teacher);
            sqlSession.close();
        }
    }
    

在这里插入图片描述

按照查询嵌套处理
  1. TeacherMapper

     Teacher getTeacher2(@Param("tid") int id);
    
  2. TeacherMapper.xml (记得在在核心配置中注册)

    ?xml version="1.0" encoding="UTF8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.wjq.dao.TeacherMapper">
        <!--===========================================================================-->
    <!--    子查询-->
        <select id="getTeacher2" resultMap="TeacherStudent2">
            select * from teacher where id = #{tid}
        </select>
        <resultMap id="TeacherStudent2" type="Teacher">
            <collection property="students" javaType="ArrayList" ofType="Student" select="getStudent" column="id"/>
        </resultMap>
        <select id="getStudent" resultType="Student">
            select * from student where tid = #{tid}
        </select>
    </mapper>
    
  3. 测试

    @Test
    public void getStudentList2(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        List<Student> students = mapper.getStudentList2();
        for (Student student : students) {
            System.out.println(student);
        }
        sqlSession.close();
    }
    

    小结:

    1. 关联-association【多对一】
    2. 集合-collection【一对多】
    3. javaType & ofType
      1. javaType 用来表示属性的返回值类型
      2. ofType用来表示映射对应的pojo中的类型,即泛型或者集合中的约束类型
        上一节—>多对一处理

        如有不对的地方欢迎指出,共同进步!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MyBatis 支持一对多查询,可以通过设置 resultMap 来实现。 下面是一个示例: ``` <resultMap id="orderResultMap" type="Order"> <id column="order_id" property="id"/> <result column="order_number" property="orderNumber"/> <result column="order_date" property="orderDate"/> <association property="items" javaType="List" ofType="Item"> <id column="item_id" property="id"/> <result column="item_name" property="name"/> <result column="item_quantity" property="quantity"/> </association> </resultMap> <select id="getOrderWithItems" resultMap="orderResultMap"> SELECT o.order_id, o.order_number, o.order_date, i.item_id, i.item_name, i.item_quantity FROM orders o LEFT JOIN items i ON o.order_id = i.order_id WHERE o.order_id = #{id} </select> ``` 在上面的示例中,我们定义了一个 resultMap,其中的 association 元素表示一对多的关系,即 Order 类型的对象有一个 items 属性,该属性为一个 Item 对象的列表。 最后,我们可以通过使用 resultMap 的 id 来调用该一对多查询。 ### 回答2: MyBatis 是一个开源的持久层框架,广泛应用于Java语言中的数据访问。在使用MyBatis进行一对多查询时,可以通过以下步骤实现: 1. 配置MyBatis的映射文件:首先,需要创建一个映射文件,该文件定义了数据库表中的列与Java对象的属性之间的映射关系。在映射文件中,需要配置一对多关系的对象关系映射。 2. 定义Java对象:在实现一对多关系查询之前,需要定义相应的Java对象,该对象包含一对多关系的属性。通常情况下,一对多关系会使用一个实体类代表“一”的一方,同时使用一个集合表示“多”的一方。 3. 编写SQL语句:在MyBatis中,可以使用动态SQL语句来处理一对多关系查询。首先,需要编写一个主查询,用于查询"一"方的数据。同时,还需要编写一个子查询,用于查询"多"方的数据。然后,可以通过联合查询或子查询方式将两者连接起来。 4. 在映射文件中定义关联关系:在映射文件中,可以使用`<collection>`元素定义一对多关系。该元素可以指定查询查询结果所映射的Java对象,并关联到“一”方对象的集合属性上。 5. 执行查询:通过MyBatis的`SqlSession`对象执行查询操作,并获取查询结果。在查询结果中,会包含了一方对象及其对应的多方对象的集合属性。 总的来说,使用MyBatis进行一对多查询需要配置映射文件、定义Java对象、编写SQL语句以及通过`<collection>`元素定义关联关系。通过这些步骤,可以实现一对多关系的查询操作。 ### 回答3: MyBatis是一个强大的持久层框架,提供了丰富的数据库访问功能。在MyBatis中,一对多查询通常是通过使用嵌套查询来实现的。 首先,在数据库中创建两个相关联的表,如学生表和课程表,其中一个学生可以对应多个课程。 然后,在MyBatis的mapper文件中,我们需要定义两个resultMap,分别对应学生和课程的实体类。在学生的resultMap中,我们需要使用collection元素来定义与课程的一对多关系。 接下来,我们需要编写一个查询语句,使用嵌套查询来实现一对多查询。首先,我们需要查询学生表,并将结果映射到学生的resultMap中。然后,在该查询语句中,我们需要使用嵌套的select语句来查询学生对应的所有课程,并将结果映射到课程的resultMap中。 最后,我们可以通过调用MyBatis的session.selectOne或session.selectList方法来执行查询,并得到最终的结果。 总结起来,MyBatis一对多查询可以通过定义resultMap和使用嵌套查询来实现。通过合理使用这些功能,我们可以方便地实现复杂一对多查询操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值