1. 程式人生 > 其它 >mybatis學習16 :一對多處理

mybatis學習16 :一對多處理

mybatis學習16 :一對多處理

  • 一對多處理:

    • 一個老師擁有多個學生;

    • 對於老師而言,就是一對多的關係;

 

  • 開發步驟:

    • 學生實體類:

      public class Student {
         private int  id;
         private String name;
         //學生需要關聯一個老師
         private int  tid;

      }
    • 老師實體類:

      public class Teacher {
         private int id;
         private String name;
         //一個老師包含多個學習
         private List<Student> students;
      }
    • 新建Mapper介面:

    • 新建Mapper.xml配置檔案;

       

 

  • 按照結果巢狀查詢:類似於多表聯查

    • Mapper.xml:注意collection,集合中的泛型資訊:我們使用ofType獲取

      <!--按結果巢狀查詢-->
      <resultMap id="resMap" type="teacher">
         <result property="id" column="tid"/>
         <result property="name" column="tname"/>
         <!--
             List集合:集合用collection
             javaType="" 指定屬性的型別
             集合中的泛型資訊:我們使用ofType獲取
         -->
         <collection property="students" ofType="student">
             <result property="id" column="sid"/>
             <result property="name" column="sname"/>
         </collection>
      </resultMap>

      <select id="getTeacher" resultMap="resMap">
        select s.id as sid,s.name sname,t.name as tname,t.id as tid
        from teacher t, student s where t.id=s.tid and t.id=#{tid}

      </select>
    • 測試:

      @Test
      public void test(){
         SqlSession sqlSession = MybatisUtils.getSqlSession();
         TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
         Teacher teacher = mapper.getTeacher(1);
         System.out.println(teacher);

         /**
          * Teacher(id=1, name=秦老師, students=[Student(id=1, name=小明, tid=0), Student(id=2, name=小紅, tid=0), Student(id=3, name=小張, tid=0), Student(id=4, name=小李, tid=0), Student(id=5, name=小王, tid=0)])
          */

         sqlSession.close();
      }

       

 

  • 按照查詢巢狀處理:類似於子查詢

    • Mapper.xml:

      <resultMap id="resMap2" type="teacher">
         <result property="id" column="id"/>
         <result property="name" column="name"/>
         <collection property="students" column="id" javaType="ArrayList" ofType="student" select="getStudent2"/>
      </resultMap>

      <select id="getTeacher2" parameterType="_int" resultMap="resMap2">
        select * from teacher where id=#{teacherId}
      </select>

      <select id="getStudent2" parameterType="_int" resultType="student">
        select * from student where tid=#{tid}
      </select>
    • 測試類同上!

       

 

  • 總結:

    • 關聯:association 【多對一】

    • 集合:collection 【一對多】

    • javaType 和 ofType

      • javaType用來指定實體類中屬性的型別;

      • ofType用來指定對映到List和集合中的pojo型別(泛型中的約束);

 

 

  • 注意點:

    • 保證SQL的可讀性;儘量保證通俗易懂!

    • 注意一對多和多對一中,屬性名和欄位的問題!

    • 如果問題不好排查錯誤,可以使用日誌,建議使用Log4j

       

 

  • 面試高頻:

    • Mysql引擎

    • InnoDB的底層原理

    • 索引

    • 索引優化