myBaits association的使用

    假設每一個學生都有一名指導老師,本示例的任務就是查詢出學生的詳細信息,這就包括學生的指導老師的信息。具體代碼以下:java

一、表的結構sql

DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(10) NOT NULL,
  `gender` char(1) NOT NULL,
  `major` varchar(20) NOT NULL,
  `grade` char(4) NOT NULL,
  `supervisor_id` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('1', '李林', '男', '計算機科學與技術', '2011', '1');
-- ----------------------------
-- Table structure for teacher
-- ----------------------------
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(10) NOT NULL,
  `gender` char(1) NOT NULL,
  `research_area` varchar(20) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of teacher
-- ----------------------------
INSERT INTO `teacher` VALUES ('1', '張偉', '男', '軟件工程');

 二、對應的JavaBean類數據庫

public class Student {
 private int id;  
 private String name;     // 姓名
 private String gender;   // 性別
 private String major;    // 專業
 private String grade;    // 年級
 private Teacher supervisor; //指導教師 
 
 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 String getGender() {
  return gender;
 }
 public void setGender(String gender) {
  this.gender = gender;
 }
 public String getMajor() {
  return major;
 }
 public void setMajor(String major) {
  this.major = major;
 }
 public String getGrade() {
  return grade;
 }
 public void setGrade(String grade) {
  this.grade = grade;
 }
 public Teacher getSupervisor() {
  return supervisor;
 }
 public void setSupervisor(Teacher supervisor) {
  this.supervisor = supervisor;
 }
}
public class Teacher {
 private int id;    
 private String name;               // 教師姓名
 private String gender;        // 教師性別
 private String researchArea;    // 研究領域
 private List<Student> supStudents; // 指導學生
 
 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 String getGender() {
  return gender;
 }
 public void setGender(String gender) {
  this.gender = gender;
 }
 public String getResearchArea() {
  return researchArea;
 }
 public void setResearchArea(String researchArea) {
  this.researchArea = researchArea;
 }
 public List<Student> getSupStudents() {
  return supStudents;
 }
 public void setSupStudents(List<Student> supStudents) {
  this.supStudents = supStudents;
 }
}

三、配置StudentMapper.xmlsession

<?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="org.zsm.myBatis.day02.inner.IStudentOperation">
 <!-- 定義java Bean的屬性與數據庫的列之間的映射 -->
 <resultMap type="Student" id="studentResultMap">
  <id column="id" property="id" />
  <result column="name" property="name" />
  <result column="gender" property="gender" />
  <result column="major" property="major" />
  <result column="grade" property="grade"/>
  <!-- association處理has-a關係 -->
  <!--注意:這種方式javaType必須指定,表示supervisor的類型是Teacher,不然會報錯 -->
  <association property="supervisor" javaType="Teacher">
   <!-- 教師自身的屬性與數據庫字段的映射 -->
   <id property="id" column="t_id"/>
   <result property="name" column="t_name"/>
   <result property="gender" column="t_gender"/>
   <result property="researchArea" column="research_area"/>
  </association>
 </resultMap>
 
 <!-- SQL語句中以"#{}"的形式引用參數 -->
 <select id="getById" parameterType="int" resultMap="studentResultMap">
  SELECT st.id,st.name,st.gender,st.major,st.grade,t.id t_id,t.name t_name,
  t.gender t_gender,t.research_area 
  FROM student st, teacher t
  WHERE st.supervisor_id = t.id
  AND st.id=#{id}
 </select>
</mapper>

三、測試mybatis

 public void testAssociation(){
  SqlSession session = sqlSessionFactory.openSession();
  IStudentOperation studentOperation = session.getMapper(IStudentOperation.class);
  Student student = studentOperation.getById(1);
  System.out.println(student.getName()+"的指導老師是:"+student.getSupervisor().getName());
 }

myBatis association的兩種形式app

1、嵌套的resultMap測試

    這種方法的本質就是把教師實體映射從association元素中提取出來,用一個resultMap元素表示。而後association元素再引用這個resultMap元素。this

<?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="org.zsm.myBatis.day02.inner.IStudentOperation">
 <!-- 定義java Bean的屬性與數據庫的列之間的映射 -->
 <resultMap type="Teacher" id="teacherResultMap">
  <id property="id" column="t_id"/>
   <result property="name" column="t_name"/>
   <result property="gender" column="t_gender"/>
   <result property="researchArea" column="research_area"/>
 </resultMap>
 
 <resultMap type="Student" id="studentResultMap">
  <id column="id" property="id" />
  <result column="name" property="name" />
  <result column="gender" property="gender" />
  <result column="major" property="major" />
  <result column="grade" property="grade"/>
  <!-- 引用teacherResultMap -->
  <association property="supervisor" resultMap="teacherResultMap"/>
 </resultMap>
 
 <!-- SQL語句中以"#{}"的形式引用參數 -->
 <select id="getById" parameterType="int" resultMap="studentResultMap">
  SELECT st.id,st.name,st.gender,st.major,st.grade,t.id t_id,t.name t_name,
  t.gender t_gender,t.research_area 
  FROM student st, teacher t
  WHERE st.supervisor_id = t.id
  AND st.id=#{id}
 </select>
</mapper>

2、嵌套的select語句spa

    這種方式是使用一條單獨的select語句來加載關聯的實體(本例中就是教師實體),而後在association元素中引用此select語句(注:此方法會產生N+1問題,儘可能不要用嵌套的select語句)code

<?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="org.zsm.myBatis.day02.inner.IStudentOperation">
 <!-- 定義java Bean的屬性與數據庫的列之間的映射 -->
 <resultMap type="Teacher" id="supervisorResultMap">
  <id property="id" column="t_id"/>
   <result property="name" column="t_name"/>
   <result property="gender" column="t_gender"/>
   <result property="researchArea" column="research_area"/>
 </resultMap>
 
 <resultMap type="Student" id="studentResultMap">
  <id column="id" property="id" />
  <result column="name" property="name" />
  <result column="gender" property="gender" />
  <result column="major" property="major" />
  <result column="grade" property="grade"/>
  <!-- 引用teacherResultMap -->
  <association property="supervisor" column="supervisor_id" select="selectSupervisor"/>
 </resultMap>
 
 <!-- SQL語句中以"#{}"的形式引用參數 -->
 <select id="getById" parameterType="int" resultMap="studentResultMap">
  select id,name,gender,major,grade,supervisor_id from student where id =#{id}
 </select>
 
 <select id="selectSupervisor" parameterType="int" resultMap="supervisorResultMap">
  select id,name,gender,research_area
  from teacher where id = #{id}
 </select>
</mapper>
相關文章
相關標籤/搜索