在Mybatis中,能夠使用resultMap(結果集映射)做爲sql的返回類型java
通常用來解決以下問題:sql
數據庫表字段名和實體類屬性名不一致的問題處理數據庫
id name pwd //數據庫字段名 id name password //實體類屬性名
Mapper中SQL語句編寫以下:mybatis
<!--結果集映射--> <resultMap id="UserMap" type="User"> <!--column爲數據庫中的字段名,property爲實體中的屬性--> <result column="id" property="id"/> <result column="name" property="name"/> <result column="pwd" property="password"/> </resultMap> <select id="getUserById" resultType="UserMap"> select * from mybatis.user where id=#{id}; </select>
得到全部學生及其對應老師(多個學生對應一個老師)app
Student類this
@Data //get,set @NoArgsConstructor //無參構造 @AllArgsConstructor //有參構造 public class Student{ int id; String name; Teacher teacher; }
Teacher類code
@Data //get,set @NoArgsConstructor //無參構造 @AllArgsConstructor //有參構造 public class Teacher{ int id; String name; public Teacher() { } public Teacher(int id, String name) { this.id = id; this.name = name; } }
聯表查詢xml
<select id="getStudents" resultMap="StudentMap"> select s.id sid, s.name sname, t.name tname from student s join teacher t on s.tid = t.id </select> <resultMap id="StudentMap" type="Student"> <!--這裏的column是與查詢結果的字段名對應,字段重命名了則對應命名後的字段--> <result property="id" column="sid"/> <result property="name" column="sname"/> <!--複雜的屬性須要單獨處理 對象:association 集合:collection--> <association property="teacher" javaType="Teacher"> <result property="name" column="tname"/> </association> </resultMap>
至關於子查詢:對象
<select id="getStudent2" resultMap="StudentMap2"> select * from student; </select> <select id="getTeacher" resultType="Teacher"> select * from teacher where id = #{tid}; </select> <!--這裏將學生和對應老師分開查詢,將查詢結果組合--> <resultMap id="StudentMap2" type="Student"> <result property="id" column="sid"/> <result property="name" column="sname"/> <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/> </resultMap>
查詢結果:ci
Student{id=1, name='zhangsan', teacher=Teacher{id=1, name='spong'}} Student{id=2, name='lisi', teacher=Teacher{id=1, name='spong'}}
按指定ID查詢老師及其所管理的學生(一個老師對應多個學生)
Student類
@Data //get,set @NoArgsConstructor //無參構造 @AllArgsConstructor //有參構造 public class Student { int id; String name; int tid; public Student() { } public Student(int id, String name, int tid) { this.id = id; this.name = name; this.tid = tid; } }
Teacher類
@Data //get,set @NoArgsConstructor //無參構造 @AllArgsConstructor //有參構造 public class Teacher { int id; String name; List<Student> students; }
<select id="getTeacherById" resultMap="TeacherById"> select t.id id, t.name tname, s.id sid,s.name sname,s.tid tid from teacher t join student s on t.id = s.tid; </select> <resultMap id="TeacherById" type="Teacher"> <result property="id" column="id"/> <result property="name" column="tname"/> <!--獲取List<Student>中的泛型使用 ofType--> <collection property="students" ofType="Student"> <result property="id" column="sid"/> <result property="name" column="sname"/> <result property="tid" column="tid"/> </collection> </resultMap>
查詢結果:
[Teacher{id=1, name='spong', students=[Student{id=1, name='zhangsan', tid=1}, Student{id=2, name='lisi', tid=1}]}]