目錄java
參數傳遞在Mybatis中也是很是重要的。存在諸多狀況,以下所介紹的單個參數,多個參數,對象,集合和數組等。git
1.單個的參數Mybatis不會作特殊處理 #{這裏隨便寫什麼均可以} 它都能把這裏面的值取到 2.傳入對象POJO(普通的java類).. #{對象的屬性名稱} 3.多個參數。Mybatis會作特殊處理。會把傳入的參數自動封裝成Map類型 Map 的key值就是從param1...paramN .. map.put("param1",name) map.put("param2,id") @param("name") 能夠使用這個註解 來自定義Map封裝數據的key值。 4.直接傳入Map 5.Collection(集合)類型(List,Set) ,數組。 Mybatis也會作特殊處理。。 若是是List或者Set 封裝到map中 若是是數組 map.put("array",你傳入的數組)
Mapper接口的方法:sql
List<User> findUsersByUsername(String username);
Mapper.xml文件:數組
<select id="findUsersByUsername" resultType="user"> select <include refid="Base_Column_List"/> from tb_user <where> username = #{value} </where> </select>
注意:mybatis
其中方法名和id一致,#{}中的參數名與方法中的參數名k能夠不一致, 映射結果的時候,select 後的字段列表要和bean中的屬性名一致, 若是不一致的能夠用 as 來補充,特殊的也能夠再mybatis中啓用駝峯,好比create_time 和 createTime;app
Mapper接口的方法:單元測試
List<User> findUsersByUsernamePassword1(String username, String password);
對應的Mapper.xml:學習
<!--方法1.1--> <select id="findUsersByUsernamePassword1" resultType="user" > select * from tb_user where username = #{arg0} and password = #{arg1} </select> <!--方法1.2--> <select id="findUsersByUsernamePassword1" resultType="user" > select * from tb_user where username = #{0} and password = #{1} </select>
注意:測試
有 些版本在使用上有不一樣,我使用的是 org.mybatis:mybatis:3.5.2版本,須要使用方法1.1。code
Mapper接口的方法:
List<User> findUsersByUsernamePassword2(@Param("username") String username, @Param("password") String password);
對應的Mapper.xml文件:
<select id="findUsersByUsernamePassword2" resultType="user"> select * from tb_user where username = #{username} and password = #{password} </select>
Mapper接口的方法:
List<User> findUsersByUsernamePassword3(User user); // 調用方式 @Test public void testFindUsersByUsernamePassword3(){ UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = new User(); user.setUsername("admin"); user.setPassword("admin"); List<User> users = mapper.findUsersByUsernamePassword3(user); System.out.println(users); sqlSession.close(); }
Mapper.xml文件:
<select id="findUsersByUsernamePassword3" resultType="user" parameterType="user"> select * from tb_user where username = #{username} and password = #{password} </select>
Mapper接口的方法:
/*根據username和password查詢*/ List<User> findUsersByUsernamePassword(Map map); //-----調用方式 @Test public void testFindUsersByUsernamePassword() { UserMapper mapper = sqlSession.getMapper(UserMapper.class); Map<String, Object> map = new HashMap<>(); map.put("username", "admin"); map.put("password", "admin"); List<User> users = mapper.findUsersByUsernamePassword(map); System.out.println(users); sqlSession.close(); } /* 其中Map是mybatis本身配置好的直接使用就行。map中key的名字就是在#{}使用的個,map如何封裝就不用了管了 */
對應Mapper.xml文件:
<select id="findUsersByUsernamePassword" resultType="user" > select * from tb_user where username = #{username} and password = #{password} </select>
注意:
這裏使用Map來讀取參數,須要注意的是,使用Map能夠像實體那樣訪問,這裏的key就像實體的屬性名。
Mapper接口的方法:
List<User> findUsersByUsernamePassword4(@Param("user") User user);
對應Mapper.xml文件:
<select id="findUsersByUsernamePassword4" resultType="user"> select * from tb_user where username = #{user.username} and password = #{user.password} </select>
注意:
若是使用註解結合實體的方式來傳參數的話,那麼就須要使用實體.屬性名的方式來讀取參數。
Mapper接口的方法:
List<User> findUsersByUsernamePassword5(@Param("map") Map map);
對應的Mapper.xml文件:
<select id="findUsersByUsernamePassword5" resultType="user"> select * from tb_user where username = #{map.username} and password = #{map.password} </select>
使用方法和方法5相似,再也不贅述。
前面的動態SQL中使用到了傳遞List的狀況,這小節主要把幾種迭代對象都使用一遍。
Mapper接口方法:
List<User> findUsersByIds(List<Integer> id);
對應的Mapper.xml文件:
<!--select * from tb_user WHERE id in ( ? , ? , ? ) --> <select id="findUsersByIds" resultType="user"> select * from tb_user <where> id in <foreach collection="list" item="ite" open="(" separator="," close=")"> #{ite} </foreach> </where> </select>
注意:List集合能夠使用list,也能夠使用collection。
Mapper接口的方法:
List<User> findUsersByIds1(Set<Integer> ids);
對應的Mapper.xml文件
<select id="findUsersByIds2" resultType="user"> select * from tb_user where id in <foreach collection="collection" item="item" open="(" separator="," close=")"> #{item} </foreach> </select>
注意:Set集合沒有像List那樣,Set只能使用collection。
Mapper接口的方法:
List<User> findUsersByIds2(Integer[] ids);
對應的Mapper.xml文件
<select id="findUsersByIds1" resultType="user"> select * from tb_user where id in <foreach collection="array" item="item" open="(" separator="," close=")"> #{item} </foreach> </select>
使用Map來作保存操做:
void saveUserByMap1(Map<String,Object> map);
對應的Mapper.xml文件:
<select id="saveUserByMap1"> insert into tb_user (user_id,username,password) values (#{user_id},#{username},#{password}); </select>
單元測試:
@Test public void testSaveUserByMap1(){ UserMapper mapper = sqlSession.getMapper(UserMapper.class); Map<String,Object> map = new HashMap<>(); map.put("user_id","root"); map.put("username","root"); map.put("password","root"); mapper.saveUserByMap1(map); sqlSession.close(); }
這裏使用List和Map結合使用實現批量操做
Mapper接口文件的方法:
void saveUserByMap(List<Map<String,Object>> listMap);
對應的Mapper.xml文件:
<!--insert into tb_user (user_id,username,password)values (?,?,?) , (?,?,?) --> <select id="saveUserByMap"> insert into tb_user (user_id,username,password)values <foreach collection="collection" item="item" separator=","> (#{item.userId},#{item.username},#{item.password}) </foreach> </select>
單元測試:
@Test public void testSaveUserByMap(){ UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<Map<String,Object>> list = new ArrayList<>(); Map<String,Object> map = new HashMap<>(); map.put("userId","mybatis1"); map.put("username","mybatis1"); map.put("password","mybatis1"); Map<String,Object> map1 = new HashMap<>(); map1.put("userId","mybatis2"); map1.put("username","mybatis2"); map1.put("password","mybatis2"); list.add(map); list.add(map1); mapper.saveUserByMap(list); sqlSession.close(); }
源碼地址:
https://gitee.com/ooyhao/JavaRepo_Public/tree/master/Mybatis
若是以爲不錯的話,那就關注一下小編哦!一塊兒交流,一塊兒學習