mybatis學習——多對一和一對多查詢


首先先來說明一下數據庫,數據庫有兩張表student表和teacher表:

student表如下:

teacher表如下:

 

兩張表的關系:多個學生關聯一位老師(多對一)

*其中tid是外鍵

需要sql語句的朋友可以在這里取:

CREATE TABLE `teacher`(
    `id` INT(10) NOT NULL,
    `name` VARCHAR(30) DEFAULT NULL,
    PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO teacher(`id`,`name`) VALUES (1,'秦老師');

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`)
)ENGINE=INNODB DEFAULT CHARSET=utf8

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');

SELECT * FROM student;
SELECT * FROM teacher;
View Code

 

下面進入正題:

一、多對一

1.編寫pojo類

注意:在“多”這一邊添加一個“一”的對象作為屬性。例如:在student實體類中添加一個屬性 Teacher teacher;

@Data
public class Student {
    private int id;
    private String name;

    //學生需要關聯一個老師
    private Teacher teacher;
}
@Data
public class Teacher {
    private int id;
    private String name;
}

注意:@Data是一個注解,使用這個注解可以自動幫我們引入get()、 set()、 toString()等方法。這個注解來自lombok,要使用這個注解首先要安裝lombok插件並導入相關jar包。

 

2.編寫接口類

public interface StudentMapper {
    public List<Student> getStudent();
}

3.編寫映射文件

這里有兩種方法,按照查詢嵌套處理和按照結果嵌套處理

 

方式一:按照查詢嵌套處理

思路:我們先查詢所有的學生,然后根據查詢出來的學生的tid再去查詢對應的老師的信息,代碼如下所示

<?xml version="1.0" encoding="GBK" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.orggetStudent//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.kuang.dao.StudentMapper">

    <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 property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
    </resultMap>
  <select id="getTeacher" resultType="Teacher">
        SELECT * FROM teacher where id = #{tid} </select>
</mapper>

 

注意:

  ●用來指定實體類中屬性的類型。還不懂的話,那就再細說一點:由於上邊代碼<association >標簽中properties的值是teacher,實體類Student中teacher屬性的類型是Teacher,所以javaType="Teacher"

    

  ●在上邊代碼中<resultMap>標簽里簡單的屬性我們可以用<result>標簽去映射,但是復雜的屬性就用不了了,那怎么結局復雜屬性的映射怎么解決呢?有兩種情況:

    ①.復雜屬性是對象:用association

    ②.復雜屬性是集合,用collection

 

映射過程圖解:

 

方式二:按照結果嵌套處理

這種方法比較簡單,只要對比上一種方法你就能明白了,這里就不詳細贅述了。

映射文件代碼如下:

<!--方式二-->
<select id="getStudent2" resultMap="StudentTeacher2">
SELECT s.id AS sid,s.name AS sname,t.id AS tid,t.name AS tname
FROM student s,teacher t
WHERE s.tid = t.id
</select>

<resultMap id="StudentTeacher2" type="Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<association property="teacher" javaType="Teacher">
<result property="id" column="tid"/>
<result property="name" column="tname"/>
</association>
</resultMap>

 

注意:

●select語句中給字段區別名那里不能省略,不然查詢結果會出錯。出錯的原因我現在不知道,有知道的朋友歡迎在下邊評論,不勝感謝!

 

 

二、一對多

1.編寫pojo類

*tip:在“一”這一邊添加一個“多”的對象的泛型集合作為屬性。例如:在Teacher 實體類中添加一個屬性 List<Student> students;

@Data
public class Teacher {
    private int id;
    private String name;
    //一個老師擁有多個學生
    private List<Student> students;
}

 

@Data
public class Student {
    private int id;
    private String name;
    private int tid;
}

 

注意:@Data是一個注解,使用這個注解可以自動幫我們引入get()、 set()、 toString()等方法。這個注解來自lombok,要使用這個注解首先要安裝lombok插件並導入相關jar包。

 

2.編寫接口類

public interface TeacherMapper {
    //獲取指定老師下的所有學生及老師的信息
    Teacher getTeacher(@Param("tid") int id);
}

 

3.編寫映射文件

這里有兩種方法,按照查詢嵌套處理和按照結果嵌套處理

 

方式一:按照查詢嵌套處理

思路:我們先根據id查詢所有的老師,然后根據查詢出來的老師的id再去查詢對應的學生的信息,代碼如下所示

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.kuang.dao.TeacherMapper">
    <select id="getTeacher" resultMap="TeacherStudent">
        SELECT * FROM teacher WHERE id = #{tid}
    </select>
    <resultMap id="TeacherStudent" type="Teacher">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <collection property="students" javaType="ArrayList" ofType="Student" select="getStudentByTeacherId" column="id"/>
    </resultMap>

    <select id="getStudentByTeacherId" resultType="Student">
        SELECT * FROM student WHERE tid = #{tid}
    </select>
</mapper>

 

注意:

  ●javaType:用來指定實體類中屬性的類型。還不懂的話,那就再細說一點:由於上邊代碼<collection >標簽中properties的值是students,實體類Teacher中students屬性的類型是一個泛型列表ArrayList,所以javaType="ArrayList"

  ●ofType:用來指定映射到集合中的pojo類型,泛型中的約束類型。

 

方式二:按照結果嵌套處理

  <select id="getTeacher" resultMap="TeacherStudent">
        SELECT s.id sid,s.name sname,t.name tname,t.id tid
        FROM student s,teacher t
        WHERE t.id = #{tid} AND s.tid = t.id
    </select>
    <resultMap id="TeacherStudent" type="Teacher">
        <result column="tid" property="id"/>
        <result column="tname" property="name"/>
        <collection property="students" javaType="ArrayList" ofType="Student">
            <result column="sid" property="id"/>
            <result column="sname" property="name"/>
            <result column="tid" property="tid"/>
        </collection>
    </resultMap>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM