mybatis-一对多、多对一

2022/8/23 23:25:42

本文主要是介绍mybatis-一对多、多对一,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

多对一:

多个学生对一个老师 就是 多对一

对学生:多个学生关联一个老师

一对多:

一个老师 对 多个学生

对老师而言:一个老师 有 很多学生

SQL

#创建teachaer表
CREATE TABLE `teacher`(
`id` INT(10) NOT NULL,
`name` VARCHAR(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET=utf8;
#插入teachaer数据
INSERT INTO teacher(id,name) VALUES(1,'张老师');
#创建student表
CREATE TABLE `student`(
`id` INT(10) NOT NULL,
`name` VARCHAR(30) DEFAULT NULL,
`tid` INT(10) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fktid` (`tid`),
CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)
) DEFAULT CHARACTER SET = utf8;
#插入student表数据
INSERT into student(id,name,tid) VALUES(1,'张三',1);
INSERT into student(id,name,tid) VALUES(2,'李四',1);
INSERT into student(id,name,tid) VALUES(3,'王五',1);
INSERT into student(id,name,tid) VALUES(4,'赵六',1);
INSERT into student(id,name,tid) VALUES(5,'孙七',1);

测试环境搭建

1、导入pom文件的 lomnok依赖,刷新 maven

2、创建工具类,实体类

3、写对应接口,一个实体类对应一个dao层的接口

4、在mapper文件中写对应接口的xml文件,通过namespace和dao层接口关联。

5、核心配置文件中对xml文件进行绑定注册。

6、测试类测试。

多对一处理

获取所有学生信息以及对应的老师信息

1、按照查询嵌套处理(有点难理解)

先去查学生信息,拿学生信息的tid去子查询中查询老师的信息,然后返回。

<mapper namespace="com.zy.dao.StudentMapper">
    <!--
    1、查询多有学生信息
    2、根据查询的学生信息tid,查询老师信息
    -->
    <select id="getStudent" resultMap="StudentTeacher">
        select * from student
    </select>
    <resultMap id="StudentTeacher" type="Student">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <!--复杂的属性需要特殊处理 对象:association 集合:collection-->
        <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
​
    </resultMap>
    //getTeacher 没有走mapper.xml文件 走的下面select
    <select id="getTeacher" resultType="Teacher">
        select * from teacher where id = #{id}
    </select>
</mapper>

打印结果

Student(id=1, name=张三, teacher=Teacher(id=1, name=张老师))
Student(id=2, name=李四, teacher=Teacher(id=1, name=张老师))
Student(id=3, name=王五, teacher=Teacher(id=1, name=张老师))
Student(id=4, name=赵六, teacher=Teacher(id=1, name=张老师))
Student(id=5, name=孙七, teacher=Teacher(id=1, name=张老师))
Student(id=6, name=张一, teacher=Teacher(id=2, name=刘老师))
Student(id=7, name=李二, teacher=Teacher(id=2, name=刘老师))
Student(id=8, name=王三, teacher=Teacher(id=2, name=刘老师))
Student(id=9, name=赵四, teacher=Teacher(id=2, name=刘老师))
Student(id=10, name=孙吴, teacher=Teacher(id=2, name=刘老师))

2、按照结果嵌套处理

 <!--按照结果嵌套处理-->
    <select id="getStudent" resultMap="teacherStudent2">
        SELECT b.id AS sid, b.`name` AS sName,a.`name` AS tName
        FROM teacher a,student b
        WHERE a.id = b.tid
    </select>
    <resultMap id="teacherStudent2" type="Student">
        <result property="id" column="sid"/>
        <result property="name" column="sName"/>
        <association property="teacher" javaType="Teacher">
            <result property="name" column="tName"/>
        </association>
    </resultMap>
Student(id=1, name=张三, teacher=Teacher(id=0, name=张老师))
Student(id=2, name=李四, teacher=Teacher(id=0, name=张老师))
Student(id=3, name=王五, teacher=Teacher(id=0, name=张老师))
Student(id=4, name=赵六, teacher=Teacher(id=0, name=张老师))
Student(id=5, name=孙七, teacher=Teacher(id=0, name=张老师))
Student(id=6, name=张一, teacher=Teacher(id=0, name=刘老师))
Student(id=7, name=李二, teacher=Teacher(id=0, name=刘老师))
Student(id=8, name=王三, teacher=Teacher(id=0, name=刘老师))
Student(id=9, name=赵四, teacher=Teacher(id=0, name=刘老师))
Student(id=10, name=孙吴, teacher=Teacher(id=0, name=刘老师))

一对多处理

按照结果嵌套处理

实体类:

public class Teacher {
    private int id;
    private String name;
 /*   private Student student;*/
    //一个老师关联多个学生
    private List<Student> students;
​
​
}

 

接口:

public interface TeacherMapper {
    Teacher getTeacherAndStudent(@Param("id") int id);
}
​

 

mapper.xml

​
<mapper namespace="com.zy.dao.TeacherMapper">
    <select id="getTeacherAndStudent" resultMap="TeacherStudent" parameterType="int">
            SELECT t.`name` AS teacherName,s.`name` AS studentName,s.id AS sid  
            FROM teacher t,student s
            WHERE  t.id = #{id} 
            AND t.id = s.tid
    </select>
    <resultMap id="TeacherStudent" type="Student">
        <result property="id" column="id"/>
        <result property="name" column="teacherName"/>
        <!--javaTypey用于指定的属性的类型
            集合中的泛型用ofType
        -->
        <collection property="students" ofType="Teacher">
            <result property="name" column="studentName"/>
            <result property="id" column="sid"/>
        </collection>
    </resultMap>
</mapper>

结果

Teacher(id=0, name=张老师, students=[Student(id=1, name=张三, tid=0), Student(id=2, name=李四, tid=0), Student(id=3, name=王五, tid=0), Student(id=4, name=赵六, tid=0), Student(id=5, name=孙七, tid=0)])

按照查询嵌套处理

 

mapper.xml

    <!--===========================================-->
    <select id="getTeacherAndStudent2" resultMap="TeacherStudent2" parameterType="int">
        select * from teacher  where id = #{id}
    </select>
    <resultMap id="TeacherStudent2" type="Teacher">
        <collection property="students" column="id" javaType="ArrayList" ofType="Student" select="getStudent1"/>
    </resultMap>
    <select id="getStudent1" resultType="Student">
        select * from student  where tid = #{id}
    </select>

 

小结:

1、关联 assciation 【多对一】

2、集合 collection 【一对多】

3、javaType & ofType

(1) javaType 用来指定实体类中属性的类型

(2)ofType 用来制动映射到list或者集合中的pojo类型,泛型中的约束类型

 

注意点:

保证sql可读性,尽量保证通俗易懂

注意一对多和多对一中,属性和字段的问题

如果问题不好排查,可以使用日志,推荐Log4j



这篇关于mybatis-一对多、多对一的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程