最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis多對多一對多關(guān)系查詢嵌套處理

 更新時間:2023年10月15日 12:05:48   作者:phang  
這篇文章主要為大家介紹了MyBatis多對多一對多關(guān)系查詢嵌套處理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

1. 數(shù)據(jù)準(zhǔn)備

數(shù)據(jù)庫

student 數(shù)據(jù)庫字段:

id int(10)

name varchar(30)

tid int(10)

teacher 數(shù)據(jù)庫字符:

id int(10)

name varchar(30)

實體類

Student:

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

Teacher:

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

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

實體接口

編寫實體類對應(yīng)的Mapper接口 【兩個】

public interface StudentMapper {
}
public interface TeacherMapper {
}

mapper.xml

編寫Mapper接口對應(yīng)的 mapper.xml配置文件

StudentMapper.xml:

<?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.kuang.mapper.StudentMapper">

</mapper>

TeacherMapper.xml:

<?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.kuang.mapper.TeacherMapper">

</mapper>

2.一對多的關(guān)系

多個學(xué)生對應(yīng)一個老師.

2.1 按查詢嵌套處理

1、給StudentMapper接口增加方法:

//獲取所有學(xué)生及對應(yīng)老師的信息
public List<Student> getStudents();
  • 編寫對應(yīng)的Mapper文件:
<mapper namespace="com.dao.StudentMapper">
<!--
   需求:獲取所有學(xué)生及對應(yīng)老師的信息
   思路:
       1. 獲取所有學(xué)生的信息
       2. 根據(jù)獲取的學(xué)生信息的老師ID->獲取該老師的信息
       3. 思考問題,這樣學(xué)生的結(jié)果集中應(yīng)該包含老師,該如何處理呢,數(shù)據(jù)庫中我們一般使用關(guān)聯(lián)查詢?
           1. 做一個結(jié)果集映射:StudentTeacher
           2. StudentTeacher結(jié)果集的類型為 Student
           3. 學(xué)生中老師的屬性為teacher,對應(yīng)數(shù)據(jù)庫中為tid。
              多個 [1,...)學(xué)生關(guān)聯(lián)一個老師=> 一對一,一對多
           4. 查看官網(wǎng)找到:association – 一個復(fù)雜類型的關(guān)聯(lián);使用它來處理關(guān)聯(lián)查詢
   -->
    <select id="getStudents" resultMap="studentAllInfo" >
        select * from student
    </select>
    <resultMap id="studentAllInfo" type="com.pojo.Student">
        <result column="id" property="id" />
        <result column="name" property="name" />
       <!--association關(guān)聯(lián)屬性 property屬性名 javaType屬性類型 column在多的一方的表中的列名-->
        <association property="teacher" column="tid"  javaType="com.pojo.Teacher" select="getTeacher" />
    </resultMap>
 <!--
   這里傳遞過來的id,只有一個屬性的時候,下面可以寫任何值
   association中column多參數(shù)配置:
       column="{key=value,key=value}"
       其實就是鍵值對的形式,key是傳給下個sql的取值名稱,value是片段一中sql查詢的字段名。
   -->
        <select id="getTeacher" resultType="com.pojo.Teacher">
        select * from teacher where id = #{tid}
    </select>
</mapper>

2.2 按結(jié)果嵌套處理

  • 接口方法編寫:
    public List<Student> getStudents2();
  • StudentMapper.xml:
<select id="getStudents2" resultMap="STInfo">
        select s.id sid, s.name sname, t.id tid, t.name tname
        from student s, teacher t
        where s.tid = t.id
    </select>
    <resultMap id="STInfo" type="com.pojo.Student">
        <result property="id" column="sid"/>
        <result property="name" column="sname" />
        <association property="teacher" javaType="com.pojo.Teacher">
            <result property="id" column="tid" />
            <result property="name" column="tname" />
        </association>
    </resultMap>

Test:

@Test
    public void testStudent01(){
        SqlSession sqlsession = MyBatisUtils.getSqlSession();
        StudentMapper studentMapper = sqlsession.getMapper(StudentMapper.class);
        List&lt;Student&gt; listStudent = studentMapper.getStudents2();
        for (Student student : listStudent) {
            System.out.println(student);
        }
    }

3. 多對一的關(guān)系

一個老師對應(yīng)多個學(xué)生

數(shù)據(jù)準(zhǔn)備

Student

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

Teacher

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

    // 一個老師擁有多個學(xué)生
    private List&lt;Student&gt; studentList;
}

3.1 按結(jié)果嵌套處理

Mapper接口

TeacherMapper接口編寫方法:

//獲取指定老師,及老師下的所有學(xué)生
public Teacher getTeacher(int id);

編寫接口對應(yīng)的Mapper配置文件

<mapper namespace="com.dao.TeacherMapper">
   <!--
   思路:
       1. 從學(xué)生表和老師表中查出學(xué)生id,學(xué)生姓名,老師姓名
       2. 對查詢出來的操作做結(jié)果集映射
          * 集合的話,使用collection!
          * JavaType和ofType都是用來指定對象類型的
          * JavaType是用來指定pojo中屬性的類型
          * ofType指定的是映射到list集合屬性中pojo的類型。
   -->
    <select id="getTeacher" resultMap="TeacherStuent" >
        select s.id sid, s.name sname, t.id tid, t.name tname  from student s, teacher t
        where s.tid = t.id and t.id = #{tid}
    </select>
    <resultMap id="TeacherStuent" type="com.pojo.Teacher">
        <result property="id" column="tid" />
        <result property="name" column="tname" />
        <!--集合的話,使用collection
            property : 對應(yīng)著 Teacher類中的屬性;
            javaType: 指定屬性的類型;
            集合中的泛型,使用ofType獲取
        !-->
        <collection property="studentList" ofType="com.pojo.Student">
            <result property="id" column="sid" />
            <result property="name" column="sname" />
            <result property="tid" column="tid" />
        </collection>
    </resultMap>
</mapper>

Test:

@Test
    public void testgetTeacher(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        TeacherMapper teacherMapper = sqlSession.getMapper(TeacherMapper.class);
        Teacher teacher = teacherMapper.getTeacher(1);
        System.out.println( teacher );
        sqlSession.close();
    }
}

3.2 按查詢嵌套處理

數(shù)據(jù)準(zhǔn)備

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

@Data
public class Teacher {
   private int id;
   private String name;
   //一個老師多個學(xué)生
   private List&lt;Student&gt; students;
}

TeacherMapper接口編寫方法 :public Teacher getTeacher2(int id);

編寫接口對應(yīng)的Mapper配置文件

<mapper namespace="com.dao.TeacherMapper">
    <select id="getTeacher2" resultMap="TeacherStuent">
        select * from teacher where id = #{tid}
    </select>

    <resultMap id="TeacherStuent" type="com.pojo.Teacher">
        <result property="id" column="id" />
        <result property="name" column="name" />
        <!--column是一對多的外鍵 , 寫的是一的主鍵的列名-->
        <collection property="studentList" javaType="ArrayList" ofType="com.pojo.Student" select="getStudentByTId" column="id"/>
    </resultMap>
    
    <select id="getStudentByTId" resultType="com.pojo.Student">
        select * from student where tid = #{id}
    </select>
</mapper>

Test:

@Test
    public void testgetTeacher2(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        TeacherMapper teacherMapper = sqlSession.getMapper(TeacherMapper.class);
        Teacher teacher = teacherMapper.getTeacher2(1);
        System.out.println(teacher);

        sqlSession.close();

    }

以上就是MyBatis多對多一對多關(guān)系查詢嵌套處理的詳細(xì)內(nèi)容,更多關(guān)于MyBatis多對多一對多嵌套查詢的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot工程創(chuàng)建的四種方式詳解

    SpringBoot工程創(chuàng)建的四種方式詳解

    本文介紹四種創(chuàng)建Spring Boot項目的方法(IDEA聯(lián)網(wǎng)、官網(wǎng)、阿里云源、手動配置),并解答JDK版本、Maven設(shè)置等常見問題,最終實現(xiàn)集成tess4j進(jìn)行圖片文本識別,感興趣的朋友一起看看吧
    2025-06-06
  • openfeign使用nacos服務(wù)注冊方式調(diào)用的實現(xiàn)

    openfeign使用nacos服務(wù)注冊方式調(diào)用的實現(xiàn)

    文章說明如何將項目注冊到Nacos,使OpenFeign調(diào)用時通過服務(wù)名自動發(fā)現(xiàn)服務(wù),無需手動配置URL,需添加Nacos和Sentinel依賴,啟動類使用@FeignClient注解并指定fallback,服務(wù)名稱直接填入value屬性即可實現(xiàn)動態(tài)調(diào)用
    2025-09-09
  • mybatis-plus 擴(kuò)展批量新增的實現(xiàn)

    mybatis-plus 擴(kuò)展批量新增的實現(xiàn)

    本文主要介紹了mybatis-plus 擴(kuò)展批量新增的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Spring Cloud 系列之負(fù)載均衡 Ribbon的示例代碼

    Spring Cloud 系列之負(fù)載均衡 Ribbon的示例代碼

    Ribbon 是 Netflix 發(fā)布的負(fù)載均衡器,它有助于控制 HTTP 和 TCP 客戶端的行為。這篇文章主要介紹了Spring Cloud 系列之負(fù)載均衡 Ribbon的示例代碼,需要的朋友可以參考下
    2020-11-11
  • 解決IDEA maven 項目修改代碼不生效,mvn clean、install后才生效

    解決IDEA maven 項目修改代碼不生效,mvn clean、install后才生效

    這篇文章主要介紹了解決IDEA maven 項目修改代碼不生效,mvn clean、install后才生效的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • springboot實現(xiàn)全局異常處理及自定義異常類

    springboot實現(xiàn)全局異常處理及自定義異常類

    這篇文章主要介紹了springboot實現(xiàn)全局異常處理及自定義異常類,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • java開發(fā)之SQL語句中DATE_FORMAT函數(shù)舉例詳解

    java開發(fā)之SQL語句中DATE_FORMAT函數(shù)舉例詳解

    要將日期值格式化為特定格式,請使用DATE_FORMAT函數(shù),下面這篇文章主要給大家介紹了關(guān)于java開發(fā)之SQL語句中DATE_FORMAT函數(shù)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • Java如何向主函數(shù)main中傳入?yún)?shù)

    Java如何向主函數(shù)main中傳入?yún)?shù)

    這篇文章主要介紹了Java如何向主函數(shù)main中傳入?yún)?shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • java 抽象類與接口的區(qū)別介紹

    java 抽象類與接口的區(qū)別介紹

    這篇文章主要介紹了java 抽象類與接口的區(qū)別介紹的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • spring boot集成shiro詳細(xì)教程(小結(jié))

    spring boot集成shiro詳細(xì)教程(小結(jié))

    這篇文章主要介紹了spring boot 集成shiro詳細(xì)教程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01

最新評論

乌兰浩特市| 宽甸| 孟村| 新乐市| 广饶县| 枝江市| 广河县| 喀喇沁旗| 滁州市| 濮阳市| 福建省| 赣榆县| 如东县| 灌阳县| 浮山县| 上杭县| 修水县| 华蓥市| 历史| 黎平县| 泸定县| 曲麻莱县| 苍山县| 临猗县| 安吉县| 蛟河市| 河南省| 潜江市| 商城县| 樟树市| 乐东| 谷城县| 罗源县| 阳山县| 八宿县| 凤台县| 江川县| 易门县| 饶阳县| 湖北省| 天门市|