`

MyBatis3一对多关系映射

阅读更多
1. MyBatis3关系映射,一对多关系

创建t_grade数据表
create table t_grade(
id int(11) NOT NULL AUTO_INCREMENT,
gradeName varchar(20) DEFAULT NULL,
PRIMARY KEY(id)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

插入数据
insert into t_grade(id, gradeName) values(1, '大学一年级');
insert into t_grade(id, gradeName) values(2, '大学二年级');

在t_student表增加gradeId关联字段
alter table t_student add gradeId INT(11);


2. 使用mybatis查询关联表使用collection 方式,一对多关系

<resultMap type="Grade" id="GradeResult">
    <result property="id" column="id"/>
    <result property="gradeName" column="gradeName"/>
    <collection property="students" column="id" select="com.andrew.mappers.StudentMapper.findByGradeId"></collection>
</resultMap>


3. 使用mybatis查询关联表,一对多关系

package com.andrew.model;
import java.util.List;
public class Grade {
    private Integer id;
    private String gradeName;
    private List<Student> students;
    @Override
    public String toString() {
        return "Grade [id=" + id + ", gradeName=" + gradeName +", student=" + students + "]";
    }
    // getter and setter
}


package com.andrew.mappers;
import com.andrew.model.Grade;
public interface GradeMapper {
    public Grade findById(Integer id);
}


<?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">
<mapper namespace="com.andrew.mappers.GradeMapper">
    <resultMap type="Grade" id="GradeResult">
        <result property="id" column="id"/>
        <result property="gradeName" column="gradeName"/>
        <collection property="students" column="id" select="com.andrew.mappers.StudentMapper.findByGradeId"></collection>
    </resultMap>
    <select id="findById" parameterType="Integer" resultMap="GradeResult">
        select * from t_grade where id=#{id}
    </select>
</mapper>


package com.andrew.mappers;
import java.util.List;
import com.andrew.model.Student;
public interface StudentMapper {
    public int add(Student student);
    public int update(Student student);
    public int delete(Integer id);
    public Student findById(Integer id);
    public List<Student> find();
    public Student findStudentWithAddress(Integer id);
    public Student findByGradeId(Integer gradeId);
}


<?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">
<mapper namespace="com.andrew.mappers.StudentMapper">
    <resultMap type="Student" id="StudentResult">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="age" column="age"/>
    </resultMap>
    <resultMap type="Student" id="StudentAddressResult">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="age" column="age"/>
        <association property="address" column="addressId" select="com.andrew.mappers.AddressMapper.findById"></association>
        <association property="grade" column="gradeId" select="com.andrew.mappers.GradeMapper.findById"></association>
    </resultMap>
    <insert id="add" parameterType="Student">
        insert into t_student values(null, #{name}, #{age})
    </insert>
    <update id="update" parameterType="Student">
        update t_student set name=#{name},age=#{age} where id=#{id}
    </update>
    <delete id="delete" parameterType="Integer">
        delete from t_student where id=#{id}
    </delete>
    <select id="findById" parameterType="Integer" resultType="Student">
        select * from t_student where id=#{id}
    </select>
    <select id="find" resultMap="StudentAddressResult">
        select * from t_student
    </select>
    <select id="findStudentWithAddress" resultMap="StudentAddressResult" parameterType="Integer">
        select * from t_student t1,t_address t2 where t1.addressId=t2.id and t1.id=#{id}
    </select>
    <select id="findByGradeId" resultMap="StudentAddressResult" parameterType="Integer">
        select * from t_student where gradeId=#{gradeId}
    </select>
</mapper> 


package com.andrew.model;
public class Student {
    private Integer id;
    private String name;
    private Integer age;
    private Address address;
    private Grade grade;
    public Student() {
        super();
    }
    public Student(String name, Integer age) {
        super();
        this.name = name;
        this.age = age;
    }
    public Student(Integer id, String name, Integer age) {
        super();
        this.id = id;
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student [id=" + id + ", name=" + name + ", age=" + age
                + ", address=" + address + "]";
    }
    // getter and setter
}


package com.andrew.service;
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.andrew.mappers.GradeMapper;
import com.andrew.model.Grade;
import com.andrew.util.SqlSessionFactoryUtil;
public class StudentGradeTest {
    private static Logger logger = Logger.getLogger(StudentTest.class);
    private SqlSession sqlSession = null;
    private GradeMapper gradeMapper = null;
    @Before
    public void setUp() throws Exception {
        sqlSession = SqlSessionFactoryUtil.openSession();
        gradeMapper = sqlSession.getMapper(GradeMapper.class);
    }
    @After
    public void tearDown() throws Exception {
        sqlSession.close();
    }
    @Test
    public void testFindGradeWithStudents() {
        logger.info("查询年级和学生");
        Grade grade = gradeMapper.findById(2);
        System.out.println(grade);
    }
}

运行结果:
Grade [id=2, gradeName=大学二年级, student=[Student [id=7, name=赵六3, age=23, address=Address [id=1, sheng=北京市, shi=北京市, qu=东城区]], Student [id=9, name=赵六5, age=25, address=Address [id=1, sheng=北京市, shi=北京市, qu=东城区]]]]

注意:
一对多关系不能a调用b的同时b调用a,否则会有死循环。
可以不使用默认的toString方法,自定义不同的方法。
分享到:
评论

相关推荐

    MyBatis一对多映射

    在处理复杂的关联关系时,MyBatis的一对多映射机制显得尤为重要。一对多映射指的是一个父类实体对应多个子类实体的关系,例如一个学生可以有多个课程,一个部门可以有多名员工等。 一、一对多映射的基本概念 在...

    实现Mybatis框架中一对多关联映射的查询操作。

    在处理复杂的数据库关联关系时,比如一对一、一对多、多对一、多对多等,Mybatis提供了灵活的映射机制。本篇将详细讲解如何在Mybatis中实现一对多关联映射的查询操作。 首先,我们要明确一对多关联映射的基本概念。...

    SpringBoot中mybatis表关联映射关系(一对多嵌套:结果方式)

    SpringBoot 中 MyBatis 表关联映射关系(一对多嵌套:结果方式) 在 SpringBoot 中,MyBatis 是一个非常流行的持久层框架,它提供了强大的持久化功能,能够将 Java 对象与数据库表进行映射。在实际开发中,我们经常...

    myBatis一对一和一对多

    通过分析这些文件,我们可以看到具体的XML映射配置、Java代码实现以及测试方法,从而更好地理解和掌握MyBatis的一对一和一对多映射。 ### 总结 MyBatis的一对一和一对多映射是其强大功能的一部分,通过合理的配置...

    MyBatis_关系映射之一对多-src.zip

    在这个名为"MyBatis_关系映射之一对多-src.zip"的压缩包中,我们很显然会探讨MyBatis中的一对多关系映射这一核心概念。 在数据库设计中,一对多关系是常见的实体关系类型,意味着一个父表(或父实体)可以与多个子...

    mybatis xml 一对多

    标题 "mybatis xml 一对多" 指的是在MyBatis框架中处理数据库中的一对多关联映射。MyBatis是一个优秀的持久层框架...对于开发人员来说,理解和熟练掌握MyBatis的一对多映射技巧,对于提升开发效率和代码质量至关重要。

    Mybatis一对多关联关系映射实现过程解析

    Mybatis的一对多关联关系映射实现过程解析 Mybatis是一款基于Java的持久层框架,它提供了对数据库的操作接口,包括数据的增删改查等操作。在实际开发中,我们经常会遇到一对多关联关系映射的问题,例如用户和订单...

    MyBatis注解配置映射器:一对多关系的实现

    本文将深入探讨如何使用MyBatis的注解配置来实现一对多关系映射,以此来提高开发效率并减少代码冗余。 首先,我们需要理解一对多关系的概念。在数据库设计中,一对多关系表示一个表中的记录可以对应另一个表中的多...

    MyBatis的一对一关联映射

    在实际的项目开发中,数据库中的表与表之间经常存在各种关联关系,比如一对一(One-to-One)、一对多(One-to-Many)和多对多(Many-to-Many)关系。本篇文章将重点讲解如何在 MyBatis 中实现一对一的关联映射。 一...

    MyBatis框架的学习(五)——一对一关联映射和一对多关联映射

    在本篇关于MyBatis框架的学习中,我们将深入探讨一对一关联映射和一对多关联映射的概念、配置以及在实际开发中的应用。MyBatis是一个优秀的持久层框架,它允许开发者将SQL语句直接写在XML配置文件或者注解中,从而...

    Mybatis关联映射Demo

    Mybatis关联映射是数据库操作中的一个重要概念,它允许我们在SQL查询中处理一对多、多对一、多对多等复杂关系。在这个"Mybatis关联映射Demo"中,我们将深入探讨如何在Mybatis框架中实现这些关系映射,以便更好地理解...

    Springboot中mybatis表关联映射关系(一对一)

    在 Springboot 中,MyBatis 提供了强大的表关联映射关系机制,可以实现一对一、多对一、多对多等各种关联关系。在本文中,我们将详细介绍 Springboot 中 MyBatis 表关联映射关系的实现机制,特别是针对一对一关联...

    mybatis之多对多

    5. **一对一(OneToOne)和一对多(OneToMany)嵌套映射**:在多对多关系中,常常伴随着一对一或一对多的子关系。MyBatis提供`&lt;oneToMany&gt;`和`&lt;oneToOne&gt;`标签,允许我们在映射文件中声明这些关系。 6. **级联操作...

    mybatis实现一对一关联映射实例代码

    * 一对多:一个班级有多个学生,一个学生只属于一个班级 * 多对多:一个学生可以选多门课,一门课可以有多个学生选 二、MyBatis 实现一对一关联映射 下面是一个简单的实例: 1. 建立表结构 首先,我们需要建立两...

    mybatis(一对多xml)

    MyBatis 提供了一种通过 XML 映射文件来配置一对多关联的方法,让我们可以方便地处理这种复杂的关系。 在 MyBatis 的一对多关联映射中,通常涉及到两个表:一个是一对的“父”表,另一个是多的“子”表。在 XML ...

    使用MyBatis实现表的多对多关联映射查询

    本示例主要讲解如何利用MyBatis来处理多对多关联映射查询,这对于理解和优化数据访问性能至关重要。 多对多关系在数据库设计中很常见,例如学生与课程的关系,一个学生可以选修多门课程,一门课程也可以被多个学生...

    Mybatis多对多关联映射源码

    `&lt;collection&gt;`元素用于表示一对多或多对多关系,而`&lt;association&gt;`则表示一对一或多对一关系。 - **注解方式配置**:使用`@Many`和`@One`注解来声明多对多关系。例如,`@Many(targetField = "students", fetchType...

    mybatis关系映射之一对多和多对一

    MyBatis关系映射之一对多和多对一 MyBatis是一款流行的Java持久化框架,提供了丰富的关系映射功能。关系映射是指在数据库中建立实体之间的关联关系,例如,一对多、多对一、多对多等。今天,我们将探讨MyBatis关系...

    mybatis 一对多

    在MyBatis框架中,"一对多"关系映射是一种常见的数据库关联操作,它表示一个实体(如用户)可以对应多个子实体(如订单)。在实际的业务场景中,例如,一个用户可能有多个订单,这就是一对一到多的关系。本教程将...

    mybatis学习总结:对象关系映射的xml配置实现

    这涉及到`&lt;resultMap&gt;`标签,可以设置`id`, `association`, `collection`, `discriminator`等子元素,处理复杂的一对一、一对多、多对多关系。 总的来说,MyBatis的XML配置是其灵活性和强大功能的体现,它使得...

Global site tag (gtag.js) - Google Analytics