欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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依賴

<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í)體類對(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、按查詢嵌套處理

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屬性類型 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é)

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

一對(duì)多的處理

一對(duì)多的理解:

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

1、實(shí)體類編寫(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、按查詢嵌套處理

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ì)象類型的

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

注意說(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身份證驗(yàn)證方法實(shí)例詳解

    Java身份證驗(yàn)證方法實(shí)例詳解

    這篇文章主要介紹了Java身份證驗(yàn)證方法實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 在IDEA啟動(dòng)多個(gè)Spring Boot工程實(shí)例

    在IDEA啟動(dòng)多個(gè)Spring Boot工程實(shí)例

    這篇文章主要介紹了在IDEA啟動(dòng)多個(gè)Spring Boot工程實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 基于RxPaparazzo實(shí)現(xiàn)圖片裁剪、圖片旋轉(zhuǎn)、比例放大縮小功能

    基于RxPaparazzo實(shí)現(xiàn)圖片裁剪、圖片旋轉(zhuǎn)、比例放大縮小功能

    這篇文章主要為大家詳細(xì)介紹了基于RxPaparazzo實(shí)現(xiàn)圖片裁剪、圖片旋轉(zhuǎn)、比例放大縮小功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • java 數(shù)據(jù)結(jié)構(gòu) 冒泡排序?qū)崿F(xiàn)代碼

    java 數(shù)據(jù)結(jié)構(gòu) 冒泡排序?qū)崿F(xiàn)代碼

    這篇文章主要介紹了java 數(shù)據(jù)結(jié)構(gòu) 冒泡排序的相關(guān)資料,并附實(shí)例代碼,有需要的小伙伴可以參考下
    2016-09-09
  • 詳解Java并發(fā)編程基礎(chǔ)之volatile

    詳解Java并發(fā)編程基礎(chǔ)之volatile

    volatile作為Java多線程中輕量級(jí)的同步措施,保證了多線程環(huán)境中“共享變量”的可見(jiàn)性。這里的可見(jiàn)性簡(jiǎn)單而言可以理解為當(dāng)一個(gè)線程修改了一個(gè)共享變量的時(shí)候,另外的線程能夠讀到這個(gè)修改的值。本文將詳解介紹Java并發(fā)編程基礎(chǔ)之volatile
    2021-06-06
  • Jmeter參數(shù)化實(shí)現(xiàn)原理及過(guò)程解析

    Jmeter參數(shù)化實(shí)現(xiàn)原理及過(guò)程解析

    這篇文章主要介紹了Jmeter參數(shù)化實(shí)現(xiàn)原理及過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Java類和對(duì)象的設(shè)計(jì)原理

    Java類和對(duì)象的設(shè)計(jì)原理

    這篇文章主要介紹了Java類和對(duì)象的設(shè)計(jì)原理,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • Java中的參數(shù)傳遞詳細(xì)介紹

    Java中的參數(shù)傳遞詳細(xì)介紹

    大家好,本篇文章主要講的是Java中的參數(shù)傳遞詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • java圖片驗(yàn)證碼生成教程詳解

    java圖片驗(yàn)證碼生成教程詳解

    這篇文章主要為大家詳細(xì)介紹了java圖片驗(yàn)證碼生成教程,從簡(jiǎn)單到復(fù)雜,從本地到前后臺(tái),感興趣的小伙伴們可以參考一下
    2016-07-07
  • Java基礎(chǔ)之static關(guān)鍵字的使用講解

    Java基礎(chǔ)之static關(guān)鍵字的使用講解

    這篇文章主要介紹了Java基礎(chǔ)之static關(guān)鍵字的使用講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評(píng)論