MyBatis的association示例
今天學會的association的用法,就是一例,現寫出來和大家分享(為簡潔起見,ant工程中各文件、目錄的布局,以及其它與前面的例子重復的內容,將不再贅述。以后博文亦將如此)。
??????假設每個學生都有一名指導老師,本示例的任務就是查詢出學生的詳細信息,這就包括學生的指導教師的信息。為此,應先增加一個教師的實體類。如下所示(和以前一樣的原因,讀者不要復制本文的配置文件。在文章下方的附件下載處,可下載本示例的完整代碼):
package com.abc.domain; public class Teacher{ private int id; private String name; //姓名 private String gender;//性別 private String researchArea;//研究方向 private String title;//職稱 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 String getTitle() { return title; } public void setTitle(String title) { this.title = title; } }相應地,在數據庫中,應增加教師表。完成此任務的腳本(teacher.sql)如下:
/*數據庫編碼UTF8,以下命令是為了在腳本和 命令行中支持中文*/ set names gbk; /*切換到courseman數據庫*/ use courseman; /*創建成績表*/ drop table if exists teacher; CREATE TABLE teacher( id int NOT NULL AUTO_INCREMENT primarykey, name varchar(10) NOT NULL,/*姓名*/ gender char(1) NOT NULL,/*性別*/ research_area varchar(20) NOT NULL,/*研究方向*/ title varchar(6) NOT NULL/*職稱*/ ); /*添加第一條記錄,自動生成的ID為1*/ insert into teacher(name,gender,research_area, title) values('張偉','男','軟件工程','講師');?? 在命令行下以courseman身份登錄MySQL(mysql??–ucourseman??–pabc123),用source命令運行此腳本(若 teacher.sql放在D盤,即d:\?teacher.sql,則運行命令source?d:/teacher.sql。注意,這里是“/”,而不 是“\”。以下腳本的運行方式不再贅述)。
??????接著為學生增加指導教師屬性,如下:
private Teacher supervisor; //指導教師并為此屬性編寫getter和setter方法,此處略去。
??????相應地,為學生表增加一個指導教師ID的字段,腳本(supervisor.sql)如下:?
/*切換到courseman數據庫*/ use courseman; /*為學生表添加指導老師ID列*/ alter TABLE student add supervisor_id int not null references teacher(id); /*把上面新增的教師作為目前學生的指導教師*/ update student set supervisor_id=1;在MyBatis的核心配置文件configuration.xml中增加教師類型的別名定義,如下:
<typeAliases> <typeAlias alias="Student" type="com.abc.domain.Student"/> <!--增加的教師類型別名--> <typeAlias alias="Teacher" type="com.abc.domain.Teacher"/> </typeAliases>然后,我們需要修改StudentMapper.xml中的select語句及要用到的resultMap元素,這是本示例的關鍵部分。
?????首先,為了能夠同時查詢到學生的指導教師的信息,修改select語句如下:?
<select id="getById" parameterType="int" resultMap="studentResultMap"> select st.id,st.name,st.gender, st.major,st.grade, <!--為教師的id取別名,避免MyBatis向教師實體注入 此屬性時與學生id混淆。以下的name和gender等屬性 也是如此--> t.id t_id,t.name t_name,t.gender t_gender, t.title,t.research_area from student st, teacher t where st.supervisor_id = t.id and st.id=#{id} </select>??? 為了實現查詢結果與實體的映射,需要修改resultMap元素。此時的學生實體擁有一個指導教師屬性(supervisor),而該屬性本身就是一個實體。這是一種has-a關系,亦即一個學生有一個指導教師,而association元素就是處理這種關系的映射的。我們為resultMap添加 association如下(從第11行開始):
<resultMap id="studentResultMap" type="Student"> <!--普通屬性映射與以前一致--> <id property="id" column="id"/> <result property="name" column="name"/> <result property="gender" column="gender"/> <result property="major" column="major"/> <result property="grade" column="grade"/> <!--property="supervisor"表明這是為了映射學生實體的 supervisor屬性。javaType="Teacher"用到了Teacher這個 別名定義,并指出了supervisor屬性的java類型--> <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"/><result property="title" column="title"/> </association> </resultMap>????? 其中的javaType屬性為必須,否則報以下錯誤:?
???????這次的執行類是AssociationDemo,代碼如下:
package com.demo; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSession; import com.abc.mapper.StudentMapper; import com.abc.domain.Student; import com.util.SqlSessionFactoryGen; public class AssociationDemo { //獲取SqlSessionFactory實例 private static SqlSessionFactory factory = SqlSessionFactoryGen.getSqlSessionFactory(); public static void main(String[] args) { SqlSession session = factory.openSession(); StudentMapper mapper = session.getMapper(StudentMapper.class); //筆者的數據庫中只有ID為4的學生。讀者若運行此程序, //須使用你的數據庫中存在的學生ID。否則報空指針異常 Student student = mapper.getById(4); //使用StringBuilder的append操作代替字符串的“+” //操作可提高執行效率 StringBuilder sb = new StringBuilder("學生信息:\n"); sb.append("姓名:"); sb.append(student.getName()); sb.append(" "); sb.append( "專業:"); sb.append(student.getMajor()); sb.append(" 年級:"); sb.append(student.getGrade()); sb.append("\n"); sb.append("指導教師信息:\n"); sb.append("姓名:"); sb.append(student.getSupervisor().getName()); sb.append(" "); sb.append("職稱:"); sb.append(student.getSupervisor().getTitle()); sb.append(" "); sb.append("研究方向:"); sb.append(student.getSupervisor().getResearchArea()); System.out.println(sb.toString()); session.close(); } }??????相應地,應修改ant的生成文件build.xml中的run?target,指定這個類是要運行的類:
<target name="run" depends="compile"> <!--指定AssociationDemo為要運行的類--> <java fork="true" classname="com.demo.AssociationDemo" classpathref="library"><classpath path="${targetdir}"/> </java> </target>??執行結果如下:
總結
以上是生活随笔為你收集整理的MyBatis的association示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 步步深入:MySQL架构总览-gt;查询
- 下一篇: Jenkins构建自动化任务