現在我們就開始更加深入的學習了,今天我們要學習的是多對一的處理,
在正式開始之前我們需要做一些準備作業,
一、在資料庫建立兩張新的表并插入資料
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');
上述SQL陳述句建立了一個teacher表,一個student表,student表的tid與teacher表的id相關聯,
二、建立一個新的專案
我們建立一個全新的子專案
1.建立MyBatis的核心組態檔mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties resource="db.properties" /> <settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> <typeAliases> <package name="com.jms.pojo"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> </configuration>
2.建立db.properties
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/MyBaties?useSSL=true&useUnicode=true&characterEncoding=UTF-8 username=root password=123456
3.建立MyBatisUtil工具類
package com.jms.utils; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; //SqlSessionFactory-->SqlSession public class MyBatisUtil { private static SqlSessionFactory sqlSessionFactory; //獲取SqlSessionFactory物件 static { try { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } //通過SqlSessionFactory獲取SqlSession物件,其中包含了面向資料庫執行執行SQL命令所需要的方法 public static SqlSession getSqlSession() { return sqlSessionFactory.openSession(true); } }
4.建立物體類
Student
package com.jms.pojo; public class Student { private int id; private String name; private Teacher teacher; public Student() { } public Student(int id, String name, Teacher teacher) { this.id = id; this.name = name; this.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 "Student{" + "id=" + id + ", name='" + name + '\'' + ", teacher=" + teacher + '}'; } }
Teacher
package com.jms.pojo; public class Teacher { private int id; private String name; public Teacher(int id, String name) { this.id = id; this.name = name; } public 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; } @Override public String toString() { return "Teacher{" + "id=" + id + ", name='" + name + '\'' + '}'; } }
5.建立Mapper介面
StudentMapper
TeacherMapper
6.建立Mapper.xml組態檔
StudentMapper.xml
<?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.jms.dao.StudentMapper"> </mapper>
TeacherMapper.xml
<?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.jms.dao.TeacherMapper"> </mapper>
6.在核心組態檔mybatis-config.xml中建立映射
<mappers> <mapper resource="com/jms/dao/TeacherMapper.xml"/> <mapper resource="com/jms/dao/StudentMapper.xml"/> </mappers>
7.測驗
(1)在介面中寫一個方法
package com.jms.dao; import com.jms.pojo.Teacher; import org.apache.ibatis.annotations.Select; import java.util.List; public interface TeacherMapper { List<Teacher> getTeacherList(); }
(2)在Mapper.xml檔案中實作
<?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"> <!-- 命名空間namespace對應Mapper介面 --> <mapper namespace="com.jms.dao.TeacherMapper"> <select id="getTeacherList" resultType="teacher"> select * from mybaties.teacher </select> </mapper>
(3)junit測驗
import com.jms.dao.TeacherMapper; import com.jms.pojo.Teacher; import com.jms.utils.MyBatisUtil; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.util.List; public class MapperTest { @Test public void test() { SqlSession sqlSession = MyBatisUtil.getSqlSession(); TeacherMapper teacherMapper = sqlSession.getMapper(TeacherMapper.class); List<Teacher> teacherList = teacherMapper.getTeacherList(); for (Teacher teacher : teacherList) { System.out.println(teacher); } } }

測驗結果沒有問題,
至此,我們的資料庫和專案都搭建完成,
接下來就進行多對一處理的實作,
三、多對一處理的實作
首先我們要清楚我們要做什么?
我們要查詢所有的student資訊,查詢所有student資訊不是很簡單嗎?一般來說確實很簡答,但是我們Student類中有一個屬性是Teacher物件,Teacher物件還有著自己的id和name,所以我們要查的是student表中的id和name,以及它們的tid所對應的teacher表中的id和name,
我們先利用SQL來查詢看看,
select s.id,s.name,t.id,t.name from student as s,teacher as t where s.tid = t.id

上表即我們想要得到的結構,
那么在MyBatis中我們如何去實作呢?
我們有兩種方法,
1.按照結果嵌套處理
顧名思義,就是先通過查詢得到結果,把結果中的四個列對應給Student類的三個屬性,最后兩列對應給Teacher物件的兩個屬性,
由于student表和teacher中的id欄位和name欄位名字相同,所以我們在MyBatis中查詢的時候應該給它起別名(不同的話就沒有必要了),
(1)在StudentMapper介面中宣告方法
package com.jms.dao; import com.jms.pojo.Student; import java.util.List; public interface StudentMapper { List<Student> getStudentList(); }
(2)在StudentMapper.xml中實作介面中的方法
<!--按照結果嵌套處理--> <resultMap id="StudentAndTeacher" 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> <select id="getStudentList" resultMap="StudentAndTeacher"> select s.id as sid,s.name as sname,t.id as tid,t.name as tname from mybaties.student as s,mybaties.teacher as t where s.tid = t.id </select>
我們看上面的配置,還是常規的select陳述句和結果映射,唯一有變化的就是結果映射中多了一個對于復雜屬性的處理,
官方檔案中是這樣說明的:
association – 一個復雜型別的關聯;許多結果將包裝成這種型別
嵌套結果映射 – 關聯可以是 resultMap 元素,或是對其它結果映射的參考
javaType 一個 Java 類的全限定名,或一個型別別名(關于內置的型別別名,可以參考上面的表格), 如果你映射到一個 JavaBean,MyBatis 通常可以推斷型別,然而,如果你映射到的是 HashMap,那么你應該明確地指定 javaType 來保證行為與期望的相一致,
(3)junit測驗
import com.jms.dao.StudentMapper; import com.jms.dao.TeacherMapper; import com.jms.pojo.Student; import com.jms.pojo.Teacher; import com.jms.utils.MyBatisUtil; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.util.List; public class MapperTest { @Test public void getStudents() { SqlSession sqlSession = MyBatisUtil.getSqlSession(); StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class); List<Student> studentList = studentMapper.getStudentList(); for (Student student : studentList) { System.out.println(student); } } }
測驗結果如下:

成功得到了想要的結果,
2.按照查詢進行嵌套處理
顧名思義,就是查詢中嵌套著查詢,這個我們要實作,很明顯我們需要先對student表進行查詢,將結果中的tid作為第二個查詢的條件來查詢teacher表,
(1)在StudentMapper介面宣告方法
List<Student> getStudentList2();
(2)在StudentMapper.xml中實作介面中的方法
<resultMap id="StudentAndTeacher2" type="Student"> <!--此處的id和name的映射是可以省略的,寫出來只是為了方便理解--> <result property="id" column="id"/> <result property="name" column="name"/> <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/> </resultMap> <select id="getStudentList2" resultMap="StudentAndTeacher2"> select * from mybaties.student </select> <select id="getTeacher" resultType="Teacher"> select * from mybaties.teacher where id=#{tid} </select>
上面的id和name在隱性映射中已經存在,可以不寫這兩句,寫出來是為了方便理解,
這種方法相比第一種可能難理解一些,但也不是很難,將tid列與teacher屬性進行對應,然后嵌套一個查詢,這個查詢回傳的是一個Teacher型別,剛好把查詢結果返給對應的teacher屬性,
這里令我感到意外的是select的id,竟然還能作為被參考的物件,于是我看了一下官方檔案的內容:
| 屬性 | 描述 |
|---|---|
| id |
在命名空間中唯一的識別符號,可以被用來參考這條陳述句, |
select的id在命名空間的識別符號就是說去介面中找方法名,同樣說到可以被參考,嗯,學習了,
(3)junit測驗

同樣得到了結果,
(本文僅作個人學習記錄用,如有紕漏敬請指正)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/508781.html
標籤:其他
上一篇:day07-IO流應用02
下一篇:變數與資料型別
