日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Mybatis關(guān)聯(lián)查詢之一對(duì)多和多對(duì)一XML配置詳解

 甘甘灰 2018-08-03

平時(shí)在開(kāi)發(fā)過(guò)程中dao、bean和XML文件都是自動(dòng)生成的,很少寫(xiě)XML的配置關(guān)系,今天記錄一下mybatis的關(guān)聯(lián)查詢中的多對(duì)一和一對(duì)多的情況。

  • 首先是有兩張表(學(xué)生表Student和老師Teacher表),為了更易懂,這里只設(shè)置了最簡(jiǎn)單的幾個(gè)必要字段。表結(jié)構(gòu)如下圖

Student表:


Teacher表:

  • 創(chuàng)建實(shí)體bean
Teacher.java:
  1. import java.util.List;
  2. /**
  3. * TODO
  4. * @version 創(chuàng)建時(shí)間:2017年12月21日 上午9:02:45
  5. */
  6. public class Teacher {
  7. private Integer id;
  8. private String name;
  9. private String className;
  10. private List<Student> students;
  11. public List<Student> getStudents() {
  12. return students;
  13. }
  14. public void setStudents(List<Student> students) {
  15. this.students = students;
  16. }
  17. public Integer getId() {
  18. return id;
  19. }
  20. public void setId(Integer id) {
  21. this.id = id;
  22. }
  23. public String getName() {
  24. return name;
  25. }
  26. public void setName(String name) {
  27. this.name = name;
  28. }
  29. public String getClassName() {
  30. return className;
  31. }
  32. public void setClassName(String className) {
  33. this.className = className;
  34. }
  35. }

Sfudent.java

  1. /**
  2. * TODO
  3. *
  4. * @author 作者 E-mail:2332999366@qq.com
  5. * @version 創(chuàng)建時(shí)間:2017年12月21日 上午9:01:17
  6. */
  7. public class Student {
  8. private Integer id;
  9. private String name;
  10. private Integer teacherId;
  11. private String className;
  12. private Teacher teacher;
  13. public Teacher getTeacher() {
  14. return teacher;
  15. }
  16. public void setTeacher(Teacher teacher) {
  17. this.teacher = teacher;
  18. }
  19. public Integer getId() {
  20. return id;
  21. }
  22. public void setId(Integer id) {
  23. this.id = id;
  24. }
  25. public String getName() {
  26. return name;
  27. }
  28. public void setName(String name) {
  29. this.name = name;
  30. }
  31. public Integer getTeacherId() {
  32. return teacherId;
  33. }
  34. public void setTeacherId(Integer teacherId) {
  35. this.teacherId = teacherId;
  36. }
  37. public String getClassName() {
  38. return className;
  39. }
  40. public void setClassName(String className) {
  41. this.className = className;
  42. }
  43. @Override
  44. public String toString() {
  45. return "{id:"+this.id+",name:"+this.name+",className:"+this.className+",teacherId:"+this.teacherId+"}";
  46. }
  47. }
  • 下面重點(diǎn)來(lái)了:配置Mapper.xml文件:
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN" "http:///dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.tz.mybatis.dao.studentDao">
  4. <!-- /////////////////////////////////一對(duì)多的第一種寫(xiě)法,一般考慮到性能問(wèn)題,不會(huì)這么實(shí)現(xiàn)//////////////////////// -->
  5. <resultMap type="Teacher" id="teacherMap">
  6. <id column="id" property="id"/>
  7. <result column="name" property="name"/>
  8. <collection property="students" ofType="Student" column="id">
  9. <id column="sid" property="id"/><!-- 這里的column對(duì)應(yīng)的是下面查詢的別名,而不是表字段名 -->
  10. <result column="sname" property="name"/><!-- property對(duì)應(yīng)JavaBean中的屬性名 -->
  11. <result column="className" property="className"/>
  12. </collection>
  13. </resultMap>
  14. <!-- 查詢所有的老師級(jí)各自的所有學(xué)生 -->
  15. <select id="getTeachers" parameterType="Teacher" resultMap="teacherMap">
  16. SELECT
  17. t.id,
  18. t.NAME,
  19. t.class_Name,
  20. s.id AS sid,
  21. s. NAME AS sname,
  22. s.class_name as className
  23. FROM
  24. teacher t
  25. LEFT JOIN student s ON t.id = s.teacher_id
  26. </select>
  27. </mapper>

  • 測(cè)試類:

  1. package com.tz.test;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.util.List;
  5. import org.apache.ibatis.io.Resources;
  6. import org.apache.ibatis.session.SqlSession;
  7. import org.apache.ibatis.session.SqlSessionFactory;
  8. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  9. import org.junit.Before;
  10. import org.junit.Test;
  11. import com.tz.mybatis.bean.Student;
  12. import com.tz.mybatis.bean.Teacher;
  13. public class TeacherTest {
  14. private SqlSessionFactory sqlSessionFactory;
  15. @Before
  16. public void init() throws IOException {
  17. String resource = "mybatis-config.xml";
  18. InputStream inputStream = Resources.getResourceAsStream(resource);
  19. sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  20. }
  21. @Test
  22. public void getTeachers() {
  23. SqlSession session = sqlSessionFactory.openSession();
  24. List<Teacher> list = session.selectList("com.tz.mybatis.dao.studentDao.getTeachers");
  25. System.out.println(list);
  26. }
  27. }

下面給出第二種寫(xiě)法:

  1. <!-- //////////////////////////////////////////////一對(duì)多的第二種寫(xiě)法///////////////////////////////////////////////////// -->
  2. <resultMap type="Teacher" id="teacherMaps">
  3. <id column="id" property="id"/>
  4. <result column="name" property="name"/>
  5. <result column="class_name" property="className"/>
  6. <collection property="students" ofType="Student" select="getStudents" column="id">
  7. </collection>
  8. </resultMap>
  9. <!-- 查詢所有的老師級(jí)各自的所有學(xué)生 -->
  10. <select id="getAllTeacher" parameterType="Teacher" resultMap="teacherMaps">
  11. SELECT
  12. t.id,
  13. t.NAME,
  14. t.class_name
  15. FROM
  16. teacher t
  17. </select>
  18. <select id="getStudents" parameterType="int" resultType="Student">
  19. select
  20. s.id,
  21. s. NAME,
  22. s.class_name as className
  23. from student s
  24. where teacher_id = #{id}
  25. </select>

測(cè)試類:

  1. @Test
  2. public void getTeachers2() {
  3. SqlSession session = sqlSessionFactory.openSession();
  4. List<Teacher> list = session.selectList("com.tz.mybatis.dao.studentDao.getAllTeacher");
  5. System.out.println(list);
  6. }

查詢學(xué)生信息(多對(duì)一):

首先還是配置文件:

  1. <resultMap type="Student" id="studentMap">
  2. <id column="id" property="id"/>
  3. <result column="name" property="name"/>
  4. <result column="class_name" property="className"/>
  5. <result column="teacher_id" property="teacherId"/>
  6. <association property="teacher" select="getTeacher" column="teacher_id" javaType="Teacher">
  7. <!-- 這里要注意的是column對(duì)應(yīng)的是student中的外鍵,而且需是表字段名 -->
  8. </association>
  9. </resultMap>
  10. <select id="getStudent" resultMap="studentMap">
  11. SELECT
  12. s.id,
  13. s.name,
  14. s.class_name,
  15. s.teacher_id
  16. FROM
  17. student s
  18. </select>
  19. <select id="getTeacher" resultType="Teacher" parameterType="int">
  20. SELECT
  21. t.id,
  22. t.name,
  23. t.class_name as className
  24. FROM teacher t
  25. where id = #{teacher_id}
  26. </select>

測(cè)試類:

  1. @Test
  2. public void getStudents() {
  3. SqlSession session = sqlSessionFactory.openSession();
  4. List<Student> list = session.selectList("com.tz.mybatis.dao.studentDao.getStudent");
  5. System.out.println(list);
  6. }

最后:當(dāng)然如果不想配置這么麻煩的信息,可以直接寫(xiě)一個(gè)關(guān)聯(lián)查詢的SQL語(yǔ)句,返回結(jié)果直接由Map接受即可。不過(guò)這樣就不太符合面向?qū)ο蟮睦砟盍恕?br>

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多