一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - MyBatis學習教程(五)-實現關聯表查詢方法詳解

MyBatis學習教程(五)-實現關聯表查詢方法詳解

2020-05-04 14:40孤傲蒼狼 JAVA教程

本文給大家介紹mybatis關聯查詢,包括一對一關聯查詢,一對多關聯查詢,代碼簡單易懂,感興趣的朋友一起學習吧

一、一對一關聯

 1.1、提出需求

  根據班級id查詢班級信息(帶老師的信息)

1.2、創建表和數據

  創建一張教師表和班級表,這里我們假設一個老師只負責教一個班,那么老師和班級之間的關系就是一種一對一的關系。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE teacher(
 t_id INT PRIMARY KEY AUTO_INCREMENT,
 t_name VARCHAR()
);
CREATE TABLE class(
 c_id INT PRIMARY KEY AUTO_INCREMENT,
 c_name VARCHAR(),
 teacher_id INT
);
ALTER TABLE class ADD CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id) REFERENCES teacher(t_id);
INSERT INTO teacher(t_name) VALUES('teacher');
INSERT INTO teacher(t_name) VALUES('teacher');
INSERT INTO class(c_name, teacher_id) VALUES('class_a', );
INSERT INTO class(c_name, teacher_id) VALUES('class_b', 2);

  表之間的關系如下:

MyBatis學習教程(五)-實現關聯表查詢方法詳解

1.3、定義實體類

  1、Teacher類,Teacher類是teacher表對應的實體類。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package me.gacl.domain;
/**
* @author gacl
* 定義teacher表對應的實體類
*/
public class Teacher {
 //定義實體類的屬性,與teacher表中的字段對應
 private int id;   //id===>t_id
 private String name; //name===>t_name
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 @Override
 public String toString() {
  return "Teacher [id=" + id + ", name=" + name + "]";
 }
}

  2、Classes類,Classes類是class表對應的實體類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package me.gacl.domain;
/**
* @author gacl
* 定義class表對應的實體類
*/
public class Classes {
 //定義實體類的屬性,與class表中的字段對應
 private int id;   //id===>c_id
 private String name; //name===>c_name
 /**
 * class表中有一個teacher_id字段,所以在Classes類中定義一個teacher屬性,
 * 用于維護teacher和class之間的一對一關系,通過這個teacher屬性就可以知道這個班級是由哪個老師負責的
 */
 private Teacher teacher;
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public Teacher getTeacher() {
  return teacher;
 }
 public void setTeacher(Teacher teacher) {
  this.teacher = teacher;
 }
 @Override
 public String toString() {
  return "Classes [id=" + id + ", name=" + name + ", teacher=" + teacher+ "]";
 }
}

1.4、定義sql映射文件classMapper.xml

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?xml version="." encoding="UTF-" ?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper .//EN" "http://mybatis.org/dtd/mybatis--mapper.dtd">
 <!-- 為這個mapper指定一個唯一的namespace,namespace的值習慣上設置成包名+sql映射文件名,這樣就能夠保證namespace的值是唯一的
 例如namespace="me.gacl.mapping.classMapper"就是me.gacl.mapping(包名)+classMapper(classMapper.xml文件去除后綴)
 -->
 <mapper namespace="me.gacl.mapping.classMapper">
  <!--
   根據班級id查詢班級信息(帶老師的信息)
   ##. 聯表查詢
   SELECT * FROM class c,teacher t WHERE c.teacher_id=t.t_id AND c.c_id=;
   ##. 執行兩次查詢
   SELECT * FROM class WHERE c_id=; //teacher_id=
   SELECT * FROM teacher WHERE t_id=;//使用上面得到的teacher_id
  -->
  <!--
  方式一:嵌套結果:使用嵌套結果映射來處理重復的聯合結果的子集
    封裝聯表查詢的數據(去除重復的數據)
   select * from class c, teacher t where c.teacher_id=t.t_id and c.c_id=
  -->
  <select id="getClass" parameterType="int" resultMap="ClassResultMap">
   select * from class c, teacher t where c.teacher_id=t.t_id and c.c_id=#{id}
  </select>
  <!-- 使用resultMap映射實體類和字段之間的一一對應關系 -->
  <resultMap type="me.gacl.domain.Classes" id="ClassResultMap">
   <id property="id" column="c_id"/>
   <result property="name" column="c_name"/>
   <association property="teacher" javaType="me.gacl.domain.Teacher">
    <id property="id" column="t_id"/>
    <result property="name" column="t_name"/>
   </association>
  </resultMap>
  <!--
  方式二:嵌套查詢:通過執行另外一個SQL映射語句來返回預期的復雜類型
   SELECT * FROM class WHERE c_id=;
   SELECT * FROM teacher WHERE t_id= // 是上一個查詢得到的teacher_id的值
  -->
  <select id="getClass" parameterType="int" resultMap="ClassResultMap">
   select * from class where c_id=#{id}
  </select>
  <!-- 使用resultMap映射實體類和字段之間的一一對應關系 -->
  <resultMap type="me.gacl.domain.Classes" id="ClassResultMap">
   <id property="id" column="c_id"/>
   <result property="name" column="c_name"/>
   <association property="teacher" column="teacher_id" select="getTeacher"/>
  </resultMap>
  <select id="getTeacher" parameterType="int" resultType="me.gacl.domain.Teacher">
   SELECT t_id id, t_name name FROM teacher WHERE t_id=#{id}
  </select>
 </mapper>

  在conf.xml文件中注冊classMapper.xml

?
1
2
3
4
5
<mappers>
  <!-- 注冊classMapper.xml文件,
  classMapper.xml位于me.gacl.mapping這個包下,所以resource寫成me/gacl/mapping/classMapper.xml-->
  <mapper resource="me/gacl/mapping/classMapper.xml"/>
</mappers>

1.5、編寫單元測試代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package me.gacl.test;
import me.gacl.domain.Classes;
import me.gacl.util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
public class Test {
 @Test
 public void testGetClass(){
  SqlSession sqlSession = MyBatisUtil.getSqlSession();
  /**
  * 映射sql的標識字符串,
  * me.gacl.mapping.classMapper是classMapper.xml文件中mapper標簽的namespace屬性的值,
  * getClass是select標簽的id屬性值,通過select標簽的id屬性值就可以找到要執行的SQL
  */
  String statement = "me.gacl.mapping.classMapper.getClass";//映射sql的標識字符串
  //執行查詢操作,將查詢結果自動封裝成Classes對象返回
  Classes clazz = sqlSession.selectOne(statement,);//查詢class表中id為的記錄
  //使用SqlSession執行完SQL之后需要關閉SqlSession
  sqlSession.close();
  System.out.println(clazz);//打印結果:Classes [id=, name=class_a, teacher=Teacher [id=, name=teacher]]
 }
 @Test
 public void testGetClass(){
  SqlSession sqlSession = MyBatisUtil.getSqlSession();
  /**
  * 映射sql的標識字符串,
  * me.gacl.mapping.classMapper是classMapper.xml文件中mapper標簽的namespace屬性的值,
  * getClass是select標簽的id屬性值,通過select標簽的id屬性值就可以找到要執行的SQL
  */
  String statement = "me.gacl.mapping.classMapper.getClass";//映射sql的標識字符串
  //執行查詢操作,將查詢結果自動封裝成Classes對象返回
  Classes clazz = sqlSession.selectOne(statement,);//查詢class表中id為的記錄
  //使用SqlSession執行完SQL之后需要關閉SqlSession
  sqlSession.close();
  System.out.println(clazz);//打印結果:Classes [id=, name=class_a, teacher=Teacher [id=, name=teacher]]
 }
}

 1.6、MyBatis一對一關聯查詢總結

  MyBatis中使用association標簽來解決一對一的關聯查詢,association標簽可用的屬性如下:

•property:對象屬性的名稱

 •javaType:對象屬性的類型

 •column:所對應的外鍵字段名稱

 •select:使用另一個查詢封裝的結果

二、一對多關聯

2.1、提出需求

  根據classId查詢對應的班級信息,包括學生,老師

2.2、創建表和數據

  在上面的一對一關聯查詢演示中,我們已經創建了班級表和教師表,因此這里再創建一張學生表

?
1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE student(
 s_id INT PRIMARY KEY AUTO_INCREMENT,
 s_name VARCHAR(20),
 class_id INT
);
INSERT INTO student(s_name, class_id) VALUES('student_A', 1);
INSERT INTO student(s_name, class_id) VALUES('student_B', 1);
INSERT INTO student(s_name, class_id) VALUES('student_C', 1);
INSERT INTO student(s_name, class_id) VALUES('student_D', 2);
INSERT INTO student(s_name, class_id) VALUES('student_E', 2);
INSERT INTO student(s_name, class_id) VALUES('student_F', 2);

MyBatis學習教程(五)-實現關聯表查詢方法詳解

2.3、定義實體類

  1、Student類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package me.gacl.domain;
/**
* @author gacl
* 定義student表所對應的實體類
*/
public class Student {
 //定義屬性,和student表中的字段對應
 private int id;   //id===>s_id
 private String name; //name===>s_name
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 @Override
 public String toString() {
  return "Student [id=" + id + ", name=" + name + "]";
 }
}

  2、修改Classes類,添加一個List<Student> students屬性,使用一個List<Student>集合屬性表示班級擁有的學生,如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package me.gacl.domain;
import java.util.List;
/**
* @author gacl
* 定義class表對應的實體類
*/
public class Classes {
 //定義實體類的屬性,與class表中的字段對應
 private int id;   //id===>c_id
 private String name; //name===>c_name
 /**
 * class表中有一個teacher_id字段,所以在Classes類中定義一個teacher屬性,
 * 用于維護teacher和class之間的一對一關系,通過這個teacher屬性就可以知道這個班級是由哪個老師負責的
 */
 private Teacher teacher;
 //使用一個List<Student>集合屬性表示班級擁有的學生
 private List<Student> students;
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public Teacher getTeacher() {
  return teacher;
 }
 public void setTeacher(Teacher teacher) {
  this.teacher = teacher;
 }
 public List<Student> getStudents() {
  return students;
 }
 public void setStudents(List<Student> students) {
  this.students = students;
 }
 @Override
 public String toString() {
  return "Classes [id=" + id + ", name=" + name + ", teacher=" + teacher
    + ", students=" + students + "]";
 }
}

2.4、修改sql映射文件classMapper.xml

  添加如下的SQL映射信息

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<!--
   根據classId查詢對應的班級信息,包括學生,老師
  -->
  <!--
  方式一: 嵌套結果: 使用嵌套結果映射來處理重復的聯合結果的子集
  SELECT * FROM class c, teacher t,student s WHERE c.teacher_id=t.t_id AND c.C_id=s.class_id AND c.c_id=
  -->
  <select id="getClass" parameterType="int" resultMap="ClassResultMap">
   select * from class c, teacher t,student s where c.teacher_id=t.t_id and c.C_id=s.class_id and c.c_id=#{id}
  </select>
  <resultMap type="me.gacl.domain.Classes" id="ClassResultMap">
   <id property="id" column="c_id"/>
   <result property="name" column="c_name"/>
   <association property="teacher" column="teacher_id" javaType="me.gacl.domain.Teacher">
    <id property="id" column="t_id"/>
    <result property="name" column="t_name"/>
   </association>
   <!-- ofType指定students集合中的對象類型 -->
   <collection property="students" ofType="me.gacl.domain.Student">
    <id property="id" column="s_id"/>
    <result property="name" column="s_name"/>
   </collection>
  </resultMap>
  <!--
   方式二:嵌套查詢:通過執行另外一個SQL映射語句來返回預期的復雜類型
    SELECT * FROM class WHERE c_id=;
    SELECT * FROM teacher WHERE t_id= // 是上一個查詢得到的teacher_id的值
    SELECT * FROM student WHERE class_id= //是第一個查詢得到的c_id字段的值
  -->
  <select id="getClass" parameterType="int" resultMap="ClassResultMap">
   select * from class where c_id=#{id}
  </select>
  <resultMap type="me.gacl.domain.Classes" id="ClassResultMap">
   <id property="id" column="c_id"/>
   <result property="name" column="c_name"/>
   <association property="teacher" column="teacher_id" javaType="me.gacl.domain.Teacher" select="getTeacher"></association>
   <collection property="students" ofType="me.gacl.domain.Student" column="c_id" select="getStudent"></collection>
  </resultMap>
  <select id="getTeacher" parameterType="int" resultType="me.gacl.domain.Teacher">
   SELECT t_id id, t_name name FROM teacher WHERE t_id=#{id}
  </select>
  <select id="getStudent" parameterType="int" resultType="me.gacl.domain.Student">
   SELECT s_id id, s_name name FROM student WHERE class_id=#{id}
  </select>

2.5、編寫單元測試代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package me.gacl.test;
 import me.gacl.domain.Classes;
 import me.gacl.util.MyBatisUtil;
 import org.apache.ibatis.session.SqlSession;
 import org.junit.Test;
 public class Test {
  @Test
  public void testGetClass(){
   SqlSession sqlSession = MyBatisUtil.getSqlSession();
   /**
   * 映射sql的標識字符串,
   * me.gacl.mapping.classMapper是classMapper.xml文件中mapper標簽的namespace屬性的值,
   * getClass是select標簽的id屬性值,通過select標簽的id屬性值就可以找到要執行的SQL
   */
   String statement = "me.gacl.mapping.classMapper.getClass";//映射sql的標識字符串
   //執行查詢操作,將查詢結果自動封裝成Classes對象返回
   Classes clazz = sqlSession.selectOne(statement,);//查詢class表中id為的記錄
   //使用SqlSession執行完SQL之后需要關閉SqlSession
   sqlSession.close();
   //打印結果:Classes [id=, name=class_a, teacher=Teacher [id=, name=teacher], students=[Student [id=, name=student_A], Student [id=, name=student_B], Student [id=, name=student_C]]]
   System.out.println(clazz);
  }
  @Test
  public void testGetClass(){
   SqlSession sqlSession = MyBatisUtil.getSqlSession();
   /**
   * 映射sql的標識字符串,
   * me.gacl.mapping.classMapper是classMapper.xml文件中mapper標簽的namespace屬性的值,
   * getClass是select標簽的id屬性值,通過select標簽的id屬性值就可以找到要執行的SQL
   */
   String statement = "me.gacl.mapping.classMapper.getClass";//映射sql的標識字符串
   //執行查詢操作,將查詢結果自動封裝成Classes對象返回
   Classes clazz = sqlSession.selectOne(statement,);//查詢class表中id為的記錄
   //使用SqlSession執行完SQL之后需要關閉SqlSession
   sqlSession.close();
   //打印結果:Classes [id=, name=class_a, teacher=Teacher [id=, name=teacher], students=[Student [id=, name=student_A], Student [id=, name=student_B], Student [id=, name=student_C]]]
   System.out.println(clazz);
  }
 }

 2.6、MyBatis一對多關聯查詢總結

  MyBatis中使用collection標簽來解決一對多的關聯查詢,ofType屬性指定集合中元素的對象類型。

關于MyBatis學習教程(五)-實現關聯表查詢的相關內容就給大家介紹這么多,希望對大家有所幫助!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日剧整部剧护妻狂魔免费观看全集 | 免费在线看片网站 | 波多野结在线 | 久久国产精品人妻中文 | 久青草国产观看在线视频 | 娇妻与老头绿文小说系列 | naruto堂同人本子汉化gg | 99精品国产成人a∨免费看 | 亚洲 欧美 日本 国产 高清 | 国产一区二区免费不卡在线播放 | 国产精品视频二区不卡 | 91制片厂制作传媒破解版免费 | 欧美高清milf在线播放 | 国产激情一区二区三区四区 | 青久久| 日韩精品一区二区三区毛片 | 天天视频国产精品 | 日本中文字幕一区二区高清在线 | 热99在线观看 | 国产精品1| 52av我爱avhaose01好 | 手机在线观看国产精选免费 | 楚乔传第二部全60集免费观看 | 91精品国产高清久久久久久io | 加勒比成人 | 女人被爽到呻吟娇喘的视频动态图 | 99久久国语露脸精品国产 | 福利视频一区二区三区 | 亚洲首页国产精品丝袜 | 5151hh四虎国产精品 | 成全动漫视频在线观看 | 国产乱子伦真实china | 精品国产免费观看一区高清 | 欧美日韩亚洲高清不卡一区二区三区 | 国内自拍成人网在线视频 | 91高清免费国产自产 | 99久久久久国产精品免费 | 久久这里只有精品国产精品99 | 莫莉瑞典1977k | 性猛交娇小69hd | 国产女主播福利在线 |