Mybatis——ResultMap(結果集映射)的使用

五、ResultMap的使用

在Mybatis中,能夠使用resultMap(結果集映射)做爲sql的返回類型java

通常用來解決以下問題:sql

  • 數據庫表字段名和實體類屬性名不一致的問題;
  • 多對一問題:
    • 例如:多個學生對應同一個老師,查詢每一個學生信息(包含老師對象屬性)
  • 一對多問題:
    • 例如:一個老師教學多個學生,查詢某個老師信息及其屬下學生(包含學生列表)

5.一、字段名和屬性名不一致問題

數據庫表字段名和實體類屬性名不一致的問題處理數據庫

id	name	pwd	//數據庫字段名
id	name	password	//實體類屬性名

Mapper中SQL語句編寫以下:mybatis

<!--結果集映射-->
<resultMap id="UserMap" type="User">
    <!--column爲數據庫中的字段名,property爲實體中的屬性-->
    <result column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="pwd" property="password"/>
</resultMap>

<select id="getUserById" resultType="UserMap">
    select * from mybatis.user where id=#{id};
</select>

5.二、多對一處理

得到全部學生及其對應老師(多個學生對應一個老師)app

Student類this

@Data                              //get,set
@NoArgsConstructor                 //無參構造
@AllArgsConstructor                //有參構造
public class Student{
    int id;
    String name;
    Teacher teacher;
}

Teacher類code

@Data                              //get,set
@NoArgsConstructor                 //無參構造
@AllArgsConstructor                //有參構造
public class Teacher{
    int id;
    String name;

    public Teacher() {
    }

    public Teacher(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

按照結果集嵌套處理

聯表查詢xml

<select id="getStudents" resultMap="StudentMap">
    select s.id sid, s.name sname, t.name tname
    from student s
    join teacher t
    on s.tid = t.id
</select>
<resultMap id="StudentMap" type="Student">
    <!--這裏的column是與查詢結果的字段名對應,字段重命名了則對應命名後的字段-->
    <result property="id" column="sid"/>
    <result property="name" column="sname"/>
    <!--複雜的屬性須要單獨處理 對象:association  集合:collection-->
    <association property="teacher" javaType="Teacher">
        <result property="name" column="tname"/>
    </association>
</resultMap>

按照查詢嵌套處理

至關於子查詢:對象

<select id="getStudent2" resultMap="StudentMap2">
    select * from student;
</select>

<select id="getTeacher" resultType="Teacher">
    select * from teacher where id = #{tid};
</select>

<!--這裏將學生和對應老師分開查詢,將查詢結果組合-->
<resultMap id="StudentMap2" type="Student">
    <result property="id" column="sid"/>
    <result property="name" column="sname"/>
    
    <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
</resultMap>

查詢結果:ci

Student{id=1, name='zhangsan', teacher=Teacher{id=1, name='spong'}}
Student{id=2, name='lisi', teacher=Teacher{id=1, name='spong'}}

5.三、一對多處理

按指定ID查詢老師及其所管理的學生(一個老師對應多個學生)

Student類

@Data                              //get,set
@NoArgsConstructor                 //無參構造
@AllArgsConstructor                //有參構造
public class Student {
    int id;
    String name;
    int tid;

    public Student() {
    }

    public Student(int id, String name, int tid) {
        this.id = id;
        this.name = name;
        this.tid = tid;
    }
}

Teacher類

@Data                              //get,set
@NoArgsConstructor                 //無參構造
@AllArgsConstructor                //有參構造
public class Teacher {
    int id;
    String name;
    List<Student> students;
}

按照結果嵌套處理

<select id="getTeacherById" resultMap="TeacherById">
        select t.id id, t.name tname, s.id sid,s.name sname,s.tid tid
        from teacher t
        join student s
        on t.id = s.tid;
</select>

<resultMap id="TeacherById" type="Teacher">
    <result property="id" column="id"/>
    <result property="name" column="tname"/>
    <!--獲取List<Student>中的泛型使用 ofType-->
    <collection property="students" ofType="Student">
        <result property="id" column="sid"/>
        <result property="name" column="sname"/>
        <result property="tid" column="tid"/>
    </collection>
</resultMap>

查詢結果:

[Teacher{id=1, name='spong', students=[Student{id=1, name='zhangsan', tid=1}, Student{id=2, name='lisi', tid=1}]}]

小結:

  • 關聯:association【多對一】
  • 集合:collection【一對多】
  • javaType & ofType
    • javaType 用來指定實體類中屬性的類型
    • ofType 用來指定映射到List或者集合中pojo類型,即泛型的類型
相關文章
相關標籤/搜索