什麼是多對一?舉個栗子
假如現在數據庫中有兩個表,一個是學生表student,一個是老師表teacher,現在的對應關係就是多個學生對應一個老師
當我們在查詢學生信息的時候,根據學生和老師的字段的關聯,同時查出每個學生對應的老師的信息。
具體代碼實現
兩個實體類
學生類和老師類
package com.robot.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 +
'}';
}
}
package com.robot.pojo;
public class Teacher {
private int id;
private String name;
public Teacher() {
}
public Teacher(int id, String name) {
this.id = id;
this.name = 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 + '\'' +
'}';
}
}
兩個接口
package com.robot.dao;
import com.robot.pojo.Student;
import java.util.List;
public interface StudentMapper {
public List<Student> getStudent();
}
package com.robot.dao;
import com.robot.pojo.Teacher;
import org.apache.ibatis.annotations.Param;
public interface TeacherMapper {
Teacher getTeacher(@Param("tid")int id);
}
編寫xml,實現查詢
第一種方式:子查詢
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.robot.dao.StudentMapper">
<select id="getStudent" resultMap="StudentToTeacher">
select * from student
</select>
<resultMap id="StudentToTeacher" type="student">
<result property="id" column="id"/>
<result property="name" column="name"/>
<!-- 複雜的屬性需要單獨處理,對象:association 集合:collection-->
<association property="teacher" column="tid" javaType="teacher" select="getTeacher"/>
</resultMap>
<select id="getTeacher" resultType="teacher">
select * from mybatis.teacher where id=#{id}
</select>
</mapper>
第二種方式:聯表查詢(一般常用這種)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.robot.dao.StudentMapper">
<select id="getStudent" resultMap="StudentTeacher">
select s.id sid, s.name sname, t.id tid, t.name tname from student s, teacher t where s.tid = t.id
</select>
<resultMap id="StudentTeacher" 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>
</mapper>
修改核心配置文件
修改核心配置文件中的mappers映射,映射到對應的兩個xml文件
<mappers>
<mapper resource="com/robot/dao/StudentMapper.xml"/>
</mappers>
測試
@Test
public void getStudentTest() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
List<Student> studentList = studentMapper.getStudent();
for (Student student : studentList) {
System.out.println(student);
}
sqlSession.close();
}
預期的結果就是通過查詢學生的信息,從而將每個學生對應的老師的信息也查詢出來
以上都是在搭建好MyBatis的運行環境後,才能測試成功
總結
聯表查詢是根據結果再進行查詢,比較容易理解,而且主要使用SQL語句,可以先在命令行中進行調試,成功後再編寫xml
子查詢更不容易理解,而且如果出錯的話,也不容易調錯排查
所以還是使用聯表查詢更容易些