Mybatis 實現多對一和一對多的資料庫操作
阿新 • • 發佈:2021-01-03
Mybatis 實現多對一和一對多的資料庫操作
第一步:建立對應資料庫表:
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'); INSERTINTO `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');
建立一個學生表並插入五個學生(注意建立和插入要分開執行)
第二步:建立pojo實體類:
Teacher:
package com.xiaofu.pojo; public class Teacher { private int id; private String name; //無參構造 public Teacher() { } //有參構造 public Teacher(int id, String name) { this.id = id; this.name = name; } //get set 方法 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; } //重寫toString @Override public String toString() { return "Teacher{" + "id=" + id + ", name='" + name + '\'' + '}'; } }
Student:
package com.xiaofu.pojo; public class Student { private int id; private String name; //學生需要關聯一個老師 所以這裡封裝一個Teacher型別 private Teacher teacher; //無參構造 public Student() { } //有參構造 public Student(int id, String name, Teacher teacher) { this.id = id; this.name = name; this.teacher = teacher; } //get set 方法 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; } //重寫toString @Override public String toString() { return "Student{" + "id=" + id + ", name='" + name + '\'' + ", teacher=" + teacher + '}'; } }
第三步:建立介面:
第四步:建立實現介面的Mapper.xml:
第五步:在核心配置檔案中註冊 寫好的Mapper.xml:
第六步:實現多對一:
package com.xiaofu.dao; import com.xiaofu.pojo.Student; import java.util.List; public interface StudentMapper { //查詢所有的學生資訊及對應老師的資訊(多對一) List<Student> getStudent(); }
在StudentMapper中編寫一個介面來完成多對一的查詢
然後在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.xiaofu.dao.StudentMapper"> <!-- 查詢所有的學生資訊及對應老師的資訊(多對一)--> <!-- 第一種解決方式:按照查詢巢狀處理--> <!-- 先查出所有的學生--> <select id="getStudent" resultMap="StudentTeacher"> select * from student </select> <!-- resultMap 結果集對映 這裡的id 對應上面的resultMap --> <resultMap id="StudentTeacher" type="com.xiaofu.pojo.Student"> <result property="id" column="id"/> <!--模型類中的id(property)對應查出來的id(column)--> <result property="name" column="name"/><!--模型類中的name(property)對應查出來的name(column)--> <!--模型類中的teacher對應下面的查詢語句 --> <!--為什麼呢?因為column="tid" 被傳到了下面查詢語句的#{tid} javaType 確定了欄位的型別 select="getTeacher" 執行了下面的查詢語句 --> <association property="teacher" column="tid" javaType="com.xiaofu.pojo.Teacher" select="getTeacher"/> </resultMap> <select id="getTeacher" resultType="com.xiaofu.pojo.Teacher"> select * from teacher where id = #{tid} </select> </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.xiaofu.dao.StudentMapper"> <!-- 查詢所有的學生資訊及對應老師的資訊(多對一)--> <!-- 第二種解決方式:按照結果巢狀處理--> <select id="getStudent" resultMap="StudentTeacher"> select s.id sid,s.name sname,t.name tname from student s,teacher t where s.tid = t.id </select> <!-- resultMap 結果集對映 這裡的id 對應上面的resultMap --> <resultMap id="StudentTeacher" type="com.xiaofu.pojo.Student"> <result property="id" column="sid"/> <result property="name" column="sname"/> <!-- 因為teacher對應的是一個物件 所以在對映對應的內容 --> <association property="teacher" javaType="com.xiaofu.pojo.Teacher"> <result property="name" column="tname"/> </association> </resultMap> </mapper>
編寫測試類:
@Test public void getlist(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); List<Student> list = mapper.getStudent(); for (Student student : list) { System.out.println(student); } sqlSession.close(); }
分別執行一下:
都查了出來。
第七步:一對多:
做一對多需要先更改一下實體類:
Sutdent:
package com.xiaofu.pojo; public class Student { private int id; private String name; //學生需要關聯一個老師 所以這裡封裝一個Teacher型別 private int tid; public Student() { } public Student(int id, String name, int tid) { this.id = id; this.name = name; this.tid = tid; } 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 int getTid() { return tid; } public void setTid(int tid) { this.tid = tid; } @Override public String toString() { return "Student{" + "id=" + id + ", name='" + name + '\'' + ", tid=" + tid + '}'; } }
Teacher:
package com.xiaofu.pojo; import java.util.List; public class Teacher { private int id; private String name; //一個老師擁有多個學生 private List<Student> students; public Teacher() { } public Teacher(int id, String name, List<Student> students) { this.id = id; this.name = name; this.students = 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 List<Student> getStudents() { return students; } public void setStudents(List<Student> students) { this.students = students; } @Override public String toString() { return "Teacher{" + "id=" + id + ", name='" + name + '\'' + ", students=" + students + '}'; } }
在TecherMapper下寫一個介面:
package com.xiaofu.dao; import com.xiaofu.pojo.Teacher; public interface TeacherMapper { //獲取指定老師下的所有學生(及老師的資訊和學生的資訊) Teacher getTeacher(int id); }
在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.xiaofu.dao.TeacherMapper"> <select id="getTeacher" resultMap="TeacherStudent"> select s.id sid, s.name sname,t.name tname,t.id tid from student s, teacher t where s.tid = t.id and t.id = #{tid} </select> <resultMap id="TeacherStudent" type="com.xiaofu.pojo.Teacher"> <result property="id" column="tid"/> <result property="name" column="tname"/> <!--複雜的屬性,我們需要單獨處理 物件:association 集合:collection javaType=“ ” 指定屬性型別! 集合中的泛型資訊,我們使用ofType獲取 --> <collection property="students" ofType="com.xiaofu.pojo.Student"> <result property="id" column="sid"/> <result property="name" column="sname"/> <result property="tid" column="tid"/> </collection> </resultMap> </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.xiaofu.dao.TeacherMapper"> <select id="getTeacher" resultMap="TeacherStudent"> select * from teacher where id = #{tid} </select> <resultMap id="TeacherStudent" type="com.xiaofu.pojo.Teacher"> <result property="id" column="id"/> <result property="name" column="name"/> <collection property="students" column="id" javaType="ArrayList" ofType="Student" select="getStudent"/> </resultMap> <select id="getStudent" resultType="com.xiaofu.pojo.Student"> select * from student where tid = #{tid}; </select> </mapper>
編寫測試類:
@Test public void getlist(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class); Teacher teacher = mapper.getTeacher(1); System.out.println(teacher); sqlSession.close(); }
分別執行一下:
都查出來了