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

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

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

多對一的處理

多對一的理解:

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

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

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、搭建測試環(huán)境

【Lombok的使用】

1. IDEA安裝Lombok插件

2. 引入Maven依賴

<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;
    //多個學(xué)生可以是同一個老師,即多對一
    private Teacher teacher;
}

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

無論有沒有需求,都應(yīng)該寫上,以備后來之需!

public interface StudentMapper {
}
public interface TeacherMapper {
}

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

無論有沒有需求,都應(yīng)該寫上,以備后來之需!

<?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、按查詢嵌套處理

1. 給StudentMapper接口增加方法

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

2. 編寫對應(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屬性類型 column在多的一方的表中的列名-->
        <association property="teacher" column="tid" javaType="teacher" select="getTeacher"/>
    </resultMap>
 
    <select id="getTeacher" resultType="teacher">
        select * from mybatis.teacher;
    </select>
 
</mapper>

3. 編寫完畢去Mybatis配置文件中,注冊Mapper!

4.測試

@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. 接口方法編寫

public List<Student> getStudents2();

2. 編寫對應(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)該處理過了】

4. 測試

@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é)

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

一對多的處理

一對多的理解:

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

1、實體類編寫

@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<Student> students;
}

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

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

1. TeacherMapper接口編寫方法

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

2. 編寫接口對應(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文件注冊到MyBatis-config文件中

4. 測試

@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、按查詢嵌套處理

1. TeacherMapper接口編寫方法

public Teacher getTeacher2(int id);

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

<select id="getTeacher2" resultMap="TeacherStudent2">
    select * from teacher where id = #{id}
</select>
<resultMap id="TeacherStudent2" type="Teacher">
    <!--column是一對多的外鍵 , 寫的是一的主鍵的列名-->
    <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文件注冊到MyBatis-config文件中

4. 測試

@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是用于一對一和多對一,而collection是用于一對多的關(guān)系JavaType和ofType都是用來指定對象類型的

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

注意說明:

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

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

相關(guān)文章

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

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

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

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

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

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

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

    解決@RequestBody使用不能class類型匹配的問題

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

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

    這篇文章主要介紹了springboot如何使用logback-spring配置日志格式,并分環(huán)境配置的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    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實現(xiàn)的日期處理類完整實例

    Java實現(xiàn)的日期處理類完整實例

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

    java解壓jar包和壓縮jar包的簡單步驟

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

    Springboot整合Mybatispuls的實例詳解

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

最新評論

株洲市| 辽阳市| 昌黎县| 双城市| 丰城市| 灌云县| 余姚市| 大新县| 康定县| 滨海县| 临猗县| 阿拉善盟| 延寿县| 唐山市| 盱眙县| 扎鲁特旗| 遂平县| 原阳县| 普宁市| 都匀市| 色达县| 常州市| 昭苏县| 岳普湖县| 白玉县| 会昌县| 乌苏市| 法库县| 江都市| 罗江县| 门源| 乌鲁木齐县| 绥阳县| 甘孜县| 平山县| 新竹市| 哈尔滨市| 翁牛特旗| 南乐县| 普安县| 香港 |