1:需求:查詢學過“葉平”老師所教的所有課的同學的學號、姓名;
1 List<Map<String,Object>> selectYepingAllCourse(@Param("name") String name);
用
List<Map<String,Object>>來接收從數據庫查詢的數據
1 <!--學葉平老師教的所有課的學生的學號,姓名--> 2 <select id="selectYepingAllCourse" resultMap="Base_ResultMap"> 3 SELECT 4 a.s_id, 5 a.sname 6 FROM 7 a_student a 8 WHERE 9 a.s_id IN ( 10 SELECT 11 a.s_id 12 FROM 13 a_sc a 14 INNER JOIN a_course b ON a.c_id = b.c_id 15 INNER JOIN a_teacher c ON c.t_id = b.t_id 16 WHERE 17 c.tname = #{name} 18 GROUP BY 19 a.s_id 20 HAVING 21 count(a.c_id) = ( 22 SELECT 23 count(a_course.c_id) 24 FROM 25 a_course 26 INNER JOIN a_teacher ON a_teacher.t_id = a_course.t_id 27 WHERE 28 a_teacher.tname = #{name} 29 ) 30 ); 31 </select>
分析一下這個sql。
1:都有哪些學生學習了葉平老師的課。 SELECT a.s_id,count(a.c_id) FROM a_sc a INNER JOIN a_course b ON a.c_id = b.c_id INNER JOIN a_teacher c ON c.t_id = b.t_id WHERE c.tname = '葉平' GROUP BY a.s_id 2:葉平老師教了幾門課。 SELECT count(a_course.c_id) FROM a_course INNER JOIN a_teacher ON a_teacher.t_id = a_course.t_id WHERE a_teacher.tname = '葉平' ) 3:學葉平老師課和葉平老師教的課一樣的學生的信息。 SELECT a.s_id FROM a_sc a INNER JOIN a_course b ON a.c_id = b.c_id INNER JOIN a_teacher c ON c.t_id = b.t_id WHERE c.tname = '葉平' GROUP BY a.s_id HAVING count(a.c_id) = ( SELECT count(a_course.c_id) FROM a_course INNER JOIN a_teacher ON a_teacher.t_id = a_course.t_id WHERE a_teacher.tname = '葉平' )
測試:
/** * 查詢學過“葉平”老師所教的所有課的同學的學號、姓名; */ @Test public void testSelectYepingAllCourse(){ List<Map<String, Object>> list = ascMapper.selectYepingAllCourse("李一"); for (Map<String,Object> i:list){ System.out.println(i); } }
輸出的結果:
得到List集合中Map集合的值。
1 for(int i=0;i<list.size();i++){ 2 Map map=list.get(i); 3 //是用set來接收的。不能重復。無順序 4 Set set = map.keySet(); 5 System.out.println("set的值 "+set); 6 Object sId = map.get("sId"); 7 System.out.println("得到sId的值 "+sId); 8 }
輸出結果:這個只有一條結果。
下面看下多個結果的。