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

MyBatis中多對(duì)一和一對(duì)多數(shù)據(jù)的處理方法

 更新時(shí)間:2023年01月03日 08:56:09   作者:wyh518  
這篇文章主要介紹了MyBatis中多對(duì)一和一對(duì)多數(shù)據(jù)的處理,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

多對(duì)一的處理

多對(duì)一的理解:

  • 多個(gè)學(xué)生對(duì)應(yīng)一個(gè)老師
  • 如果對(duì)于學(xué)生這邊,就是一個(gè)多對(duì)一的現(xiàn)象,即從學(xué)生這邊關(guān)聯(lián)一個(gè)老師!

1、數(shù)據(jù)庫(kù)設(shè)計(jì)

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

2、搭建測(cè)試環(huán)境

【Lombok的使用】

1. IDEA安裝Lombok插件

2. 引入Maven依賴(lài)

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.10</version>
</dependency>

3. 在代碼中增加注解

@Data
public class Teacher {
    private int id;
    private String name;
}
@Data
public class Student {
    private int id;
    private String name;
    //多個(gè)學(xué)生可以是同一個(gè)老師,即多對(duì)一
    private Teacher teacher;
}

4. 編寫(xiě)實(shí)體類(lèi)對(duì)應(yīng)的Mapper接口 【兩個(gè)】

無(wú)論有沒(méi)有需求,都應(yīng)該寫(xiě)上,以備后來(lái)之需!

public interface StudentMapper {
}
public interface TeacherMapper {
}

5. 編寫(xiě)Mapper接口對(duì)應(yīng)的 mapper.xml配置文件 【兩個(gè)】

無(wú)論有沒(méi)有需求,都應(yīng)該寫(xiě)上,以備后來(lái)之需!

<?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.hang.mapper.StudentMapper">
</mapper>
<?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.hang.mapper.TeacherMapper">
</mapper>

3、按查詢(xún)嵌套處理

1. 給StudentMapper接口增加方法

//獲取所有學(xué)生及對(duì)應(yīng)老師的信息
public List<Student> getStudents();

2. 編寫(xiě)對(duì)應(yīng)的Mapper文件

<?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.hang.mapper.StudentMapper">
 
    <select id="getStudents" resultMap="studentTeacher">
        select * from mybatis.student;
    </select>
 
    <resultMap id="studentTeacher" type="student">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <!--association關(guān)聯(lián)屬性 property屬性名 javaType屬性類(lèi)型 column在多的一方的表中的列名-->
        <association property="teacher" column="tid" javaType="teacher" select="getTeacher"/>
    </resultMap>
 
    <select id="getTeacher" resultType="teacher">
        select * from mybatis.teacher;
    </select>
 
</mapper>

3. 編寫(xiě)完畢去Mybatis配置文件中,注冊(cè)Mapper!

4.測(cè)試

@Test
public void getStudents(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
    List<Student> students= mapper.getStudents();
    for (Student student : students) {
        System.out.println(
        "學(xué)生名:"+ student.getName()
        +"\t老師:"+student.getTeacher().getName());
    }
    sqlSession.close();
}

4 、按結(jié)果嵌套處理

除了上面這種方式,還有其他思路嗎?

我們還可以按照結(jié)果進(jìn)行嵌套處理;

1. 接口方法編寫(xiě)

public List<Student> getStudents2();

2. 編寫(xiě)對(duì)應(yīng)的mapper文件

<select id="getStudents2" resultMap="studentTeacher2">
      select s.id sid, s.name sname, t.id tid, t.name tname
      from mybatis.student s, mybatis.teacher t
      where t.id = s.tid
  </select><br>
  <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>

3. 去mybatis-config文件中注入【此處應(yīng)該處理過(guò)了】

4. 測(cè)試

@Test
public void getStudents2(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
    List<Student> students= mapper.getStudents2();
    for (Student student : students) {
        System.out.println(
        "學(xué)生名:"+ student.getName()
        +"\t老師:"+student.getTeacher().getName());
    }
    sqlSession.close();
} 

5、小結(jié)

  • 按照查詢(xún)進(jìn)行嵌套處理就像SQL中的子查詢(xún)
  • 按照結(jié)果進(jìn)行嵌套處理就像SQL中的聯(lián)表查詢(xún)

一對(duì)多的處理

一對(duì)多的理解:

一個(gè)老師擁有多個(gè)學(xué)生如果對(duì)于老師這邊,就是一個(gè)一對(duì)多的現(xiàn)象,即從一個(gè)老師下面擁有一群學(xué)生(集合)!

1、實(shí)體類(lèi)編寫(xiě)

@Data
public class Student {
    private int id;
    private String name;
    private int tid;
}
@Data
public class Teacher {
    private int id;
    private String name;
    //一個(gè)老師多個(gè)學(xué)生
    private List<Student> students;
}

和之前一樣,搭建測(cè)試的環(huán)境!

2、按結(jié)果嵌套處理

1. TeacherMapper接口編寫(xiě)方法

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

2. 編寫(xiě)接口對(duì)應(yīng)的Mapper配置文件

<select id="getTeacher" resultMap="TeacherStudent">
    select s.id sid, s.name sname, t.id tid, t.name tname
    from mybatis.teacher t, mybatis.student s
    where t.id = s.tid and t.id = #{tid};
</select>
 
<resultMap id="TeacherStudent" type="teacher">
    <result property="id" column="tid"/>
    <result property="name" column="tname"/>
    <collection property="students" ofType="student">
        <result property="id" column="sid"/>
        <result property="name" column="sname"/>
        <result property="tid" column="tid"/>
    </collection>
</resultMap>

3. 將Mapper文件注冊(cè)到MyBatis-config文件中

4. 測(cè)試

@Test
public void testGetTeacher(){
    SqlSession session = MybatisUtils.getSession();
    TeacherMapper mapper = session.getMapper(TeacherMapper.class);
    Teacher teacher = mapper.getTeacher(1);
    System.out.println(teacher.getName());
    System.out.println(teacher.getStudents());
}

3、按查詢(xún)嵌套處理

1. TeacherMapper接口編寫(xiě)方法

public Teacher getTeacher2(int id);

2. 編寫(xiě)接口對(duì)應(yīng)的Mapper配置文件

<select id="getTeacher2" resultMap="TeacherStudent2">
    select * from teacher where id = #{id}
</select>
<resultMap id="TeacherStudent2" type="Teacher">
    <!--column是一對(duì)多的外鍵 , 寫(xiě)的是一的主鍵的列名-->
    <collection property="students" javaType="ArrayList" ofType="Student" column="id" select="getStudentByTeacherId"/>
</resultMap>
<select id="getStudentByTeacherId" resultType="Student">
    select * from student where tid = #{id}
</select>

3. 將Mapper文件注冊(cè)到MyBatis-config文件中

4. 測(cè)試

@Test
public void testGetTeacher2(){
    SqlSession session = MybatisUtils.getSession();
    TeacherMapper mapper = session.getMapper(TeacherMapper.class);
    Teacher teacher = mapper.getTeacher2(1);
    System.out.println(teacher.getName());
    System.out.println(teacher.getStudents());
}

4、小結(jié)

關(guān)聯(lián)-association集合-collection所以association是用于一對(duì)一和多對(duì)一,而collection是用于一對(duì)多的關(guān)系JavaType和ofType都是用來(lái)指定對(duì)象類(lèi)型的

  • 關(guān)聯(lián)-association
  • 集合-collection
  • 所以association是用于一對(duì)一和多對(duì)一,而collection是用于一對(duì)多的關(guān)系
  • JavaType和ofType都是用來(lái)指定對(duì)象類(lèi)型的
    • JavaType是用來(lái)指定pojo中屬性的類(lèi)型
    • ofType指定的是映射到list集合屬性中pojo的類(lèi)型。

注意說(shuō)明:

  • 保證SQL的可讀性,盡量通俗易懂
  • 根據(jù)實(shí)際要求,盡量編寫(xiě)性能更高的SQL語(yǔ)句
  • 注意屬性名和字段不一致的問(wèn)題
  • 注意一對(duì)多和多對(duì)一 中:字段和屬性對(duì)應(yīng)的問(wèn)題
  • 盡量使用Log4j,通過(guò)日志來(lái)查看自己的錯(cuò)誤

到此這篇關(guān)于MyBatis中多對(duì)一和一對(duì)多數(shù)據(jù)的處理的文章就介紹到這了,更多相關(guān)MyBatis多對(duì)一和一對(duì)多處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中實(shí)現(xiàn)漢字按照拼音排序(示例代碼)

    java中實(shí)現(xiàn)漢字按照拼音排序(示例代碼)

    這篇文章主要是對(duì)java中將漢字按照拼音排序的實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的分析介紹。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-12-12
  • Java 工具類(lèi)總結(jié)目錄(分享)

    Java 工具類(lèi)總結(jié)目錄(分享)

    下面小編就為大家?guī)?lái)一篇Java 工具類(lèi)總結(jié)目錄(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • 使用VS?Code進(jìn)行java開(kāi)發(fā)與調(diào)試的圖文教程

    使用VS?Code進(jìn)行java開(kāi)發(fā)與調(diào)試的圖文教程

    這篇文章主要介紹了如何在計(jì)算機(jī)上安裝JDK、VSCode以及Java擴(kuò)展包,并詳細(xì)說(shuō)明了配置Java運(yùn)行環(huán)境的過(guò)程,還展示了如何在VSCode中新建一個(gè)Java項(xiàng)目,需要的朋友可以參考下
    2025-02-02
  • 解決@RequestBody使用不能class類(lèi)型匹配的問(wèn)題

    解決@RequestBody使用不能class類(lèi)型匹配的問(wèn)題

    這篇文章主要介紹了解決@RequestBody使用不能class類(lèi)型匹配的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • springboot如何使用logback-spring配置日志格式,并分環(huán)境配置

    springboot如何使用logback-spring配置日志格式,并分環(huán)境配置

    這篇文章主要介紹了springboot如何使用logback-spring配置日志格式,并分環(huán)境配置的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java中替換HTML標(biāo)簽的方法代碼

    Java中替換HTML標(biāo)簽的方法代碼

    這篇文章主要介紹了Java中替換HTML標(biāo)簽的方法代碼,需要的朋友可以參考下
    2014-02-02
  • Kotlin 基礎(chǔ)教程之泛型

    Kotlin 基礎(chǔ)教程之泛型

    這篇文章主要介紹了Kotlin 基礎(chǔ)教程之泛型的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Java實(shí)現(xiàn)的日期處理類(lèi)完整實(shí)例

    Java實(shí)現(xiàn)的日期處理類(lèi)完整實(shí)例

    這篇文章主要介紹了Java實(shí)現(xiàn)的日期處理類(lèi),結(jié)合完整實(shí)例形式分析了Java針對(duì)日期的獲取、運(yùn)算、轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09
  • java解壓jar包和壓縮jar包的簡(jiǎn)單步驟

    java解壓jar包和壓縮jar包的簡(jiǎn)單步驟

    JAR(Java Archive)是Java的歸檔文件,它是一種與平臺(tái)無(wú)關(guān)的文件格式,它允許將許多文件組合成一個(gè)壓縮文件,這篇文章主要介紹了java解壓jar包和壓縮jar包的簡(jiǎn)單步驟,需要的朋友可以參考下
    2024-12-12
  • Springboot整合Mybatispuls的實(shí)例詳解

    Springboot整合Mybatispuls的實(shí)例詳解

    這篇文章主要介紹了Springboot整合Mybatispuls的相關(guān)資料,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11

最新評(píng)論

新郑市| 环江| 清远市| 丹东市| 汤阴县| 德江县| 雷山县| 高州市| 玉田县| 赤壁市| 南漳县| 璧山县| 陆川县| 隆昌县| 景东| 阳信县| 洛宁县| 泗阳县| 开远市| 塔河县| 宣恩县| 石渠县| 平安县| 萨嘎县| 雅江县| 盐源县| 通化市| 江孜县| 息烽县| 胶州市| 盱眙县| 乌恰县| 徐水县| 绥阳县| 岳普湖县| 怀安县| 海丰县| 白朗县| 固阳县| 永州市| 滦平县|