Mybatis学习总结五

来源:互联网 发布:linux更改文件权限777 编辑:程序博客网 时间:2024/06/04 18:23

一对多映射
在模型设计总存在很多一对多的关系,例如一个角色可能对应多个职位等。mybatis对于一对多的映射关系通过collection来实现。

我们可以先设计2张数据库表,一个是教师(班主任 teacher 表)一个是教师所对应的管理的班级(class table),在现实中有可能存在一个教师管理多个班级的情况。
teacher表中存在比较简单的2个字段,id和name。在class中存在3个字段id,name,teacherid。

在mapper文件中配置 对应的teacher和class resultMap,利用collection关联2个resultMap

<?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.company.TeacherMapper">    <resultMap id="Teacher" type="com.company.Teacher">        <id property="id" column="id"/>        <result column="name" property="name"/>        <collection property="classes" select="getClasses" column="id"/>    </resultMap>    <select id="getTeacher" resultMap="Teacher">        SELECT id,name from teacher    </select>    <resultMap id="Class" type="com.company.ClassModel">        <id property="id" column="id"/>        <result column="name" property="name"/>        <result column="teacherid" property="teacherid"/>    </resultMap>    <select id="getClasses" resultMap="Class" parameterType="Int">        SELECT id,name,teacherid from class WHERE teacherid = #{id}    </select>    </mapper>

定义ClassModel

package com.company;public class ClassModel {    private int id;    private String name;    private  int teacherid;    public int getId(){        return id;    }    public void setId(int value){        id = value;    }    public String getName(){        return name;    }    public void setName(String value){        name =value;    }    public int getTeacherid(){        return  teacherid;    }    public void  setTeacherid(int value){        teacherid = value;    }}

定义Teacher,在其中定义一个List属性

package com.company;import java.util.List;public class Teacher {    private int id;    private String name;    private List<ClassModel> classes;    public int getId(){        return id;    }    public void setId(int value){        id=value;    }    public String getName(){        return name;    }    public void setName(String value){        name = value;    }    public List<ClassModel> getClasses(){        return classes;    }    public void setClasses(List<ClassModel> value){        classes = value;    }}

这样执行程序即可实现teacher对class的一对多关联。

但由于嵌套select语句会导致N+1选择问题,即对于主查询返回n行结果集另外一个查询会被执行(主查询n行,则此查询会执行n次)。对于大型数据库,这样会导致性能问题。

另一种实现方式是用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"><mapper namespace="com.company.TeacherMapper">    <resultMap id="Teacher" type="com.company.Teacher">        <id property="id" column="id"/>        <result column="name" property="name"/>        <collection property="classes" resultMap="Class"/>    </resultMap>    <select id="getTeacher" resultMap="Teacher">        SELECT t.id as id,t.name as name,c.id as classid ,c.name as classname from teacher as t LEFT JOIN class as c on c.teacherid = t.id    </select>    <resultMap id="Class" type="com.company.ClassModel">        <id property="id" column="classid"/>        <result column="classname" property="name"/>        <result column="id" property="teacherid"/>    </resultMap>    </mapper>

在这里通过left join将teacher和class表关联起来进行查询。

0 0
原创粉丝点击