MyBatis中的映射語句有一個parameterType屬性來制定輸入參數的類型。但是parameterType屬性只可以寫一個參數,所以如果我們想給映射語句傳入多個參數的話,我們可以將所有的輸入參數放到HashMap中,將HashMap傳遞給映射語句。
其實就是把多個參數存到Map中,把Map當做一個參數再傳給sql語句,mybaits收到后再解析Map集合拿到每一個參數。
例如:
<select id="searchCourses" parameterType="map" resultMap="CourseResult"> SELECT * FROM COURSES WHERE TUTOR_ID= #{tutorId} AND NAME LIKE #{courseName} </select>
映射接口:
public interface DynamicSqlMapper{ List<Course> searchCourses(Map<String, Object> map); }
測試方法:
@Test public void test_searchCourses1(){ SqlSession sqlSession = null; try { sqlSession = MyBatisSqlSessionFactory.openSession(); DynamicSqlMapper mapper = sqlSession.getMapper(DynamicSqlMapper.class); Map<String,Object> map = new HashMap<String,Object>(); map.put("tutorId", 1); map.put("courseName", "%Java%"); List<Course> courses = mapper.searchCourses(map); courses.forEach(System.out::println); } catch (Exception e) { e.printStackTrace(); } }
同時MyBatis還提供了另外一種傳遞多個輸入參數給映射語句的方法。
例如我們想通過給定的name和email信息查找學生信息,定義查詢接口如下:
對於映射器中的方法,MyBatis默認從左到右給方法的參數命名為param1、param2…,依次類推。
public interface StudentMapper{ List<Student> findAllStudentsByNameEmail(String name, String email); }
MyBatis支持將多個輸入參數傳遞給映射語句,並以#{param}的語法形式引用它們:
<select id="findAllStudentsByNameEmail" resultMap="StudentResult"> select stud_id, name,email, phone from Students where name=#{param1} and email=#{param2} </select>
這里#{param1}引用第一個參數name,而#{param2}引用了第二個參數email。