Mybatis中的association用法


這篇文章我們將來學習一些 association 用法

表結構

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', 'zhangsan', '男', '計算機科學與技術', '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', 'laowu', '男', '軟件工程');

對應的java bean

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;

}

}

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="net.zaodk.mybatis.mapper.StudentOperationMapper">

<!-- 定義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>

測試

public void testAssociation(){ 

 SqlSession session = sqlSessionFactory.openSession();

 StudentOperationMapper studentOperationMapper = session.getMapper(StudentOperationMapper.class);

 Student student = studentOperationMapper.getById(1);

 System.out.println(student.getName()+"的指導老師是:"+student.getSupervisor().getName());

}

myBatis association的兩種形式

嵌套的resultMap

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

<?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="net.zaodk.mybatis.mapper.StudentOperationMapper">

<!-- 定義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>

嵌套的select語句

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

<?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="net.zaodk.mybatis.mapper.StudentOperationMapper">

<!-- 定義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>



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM