這篇文章咱們未來學習一些 association 用法html
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', '男', '軟件工程');
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;
}
}
<?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());
}
這種方法的本質就是把教師實體映射從association元素中提取出來,用一個resultMap元素表示。而後association元素再引用這個resultMap元素。java
<?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語句來加載關聯的實體(本例中就是教師實體),而後在association元素中引用此select語句(注:此方法會產生N+1問題,儘可能不要用嵌套的select語句)sql
<?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>