SSM框架中Mybatis傳遞引數的幾種方法

giscoder發表於2020-10-11

在實際使用SSM框架進行開發過程中,經常涉及到請求引數的傳遞,今將專案中常用的幾種傳值方法進行總結。

總體內容

總體內容

傳遞單個引數

傳遞單個引數的方法比較簡單,我們們直接上程式碼。
本文以根據使用者名稱查詢使用者為例:
Dao層:

List<User> findByUsername (String username);

mapper.xml:

<select id="findByUsername" resultType="User" parameterType="String">
    select * from user where username = #{username}
</select>

傳遞多個引數

以根據使用者名稱和密碼查詢使用者為例:

匿名傳參法

Dao層:

User selectByUsernamePwd(String username,String pwd );

mapper.xml:
有兩種方式:

<select id=" selectByUsernamePwd " resultMap="BaseResultMap" >
  select * from user where user_name = #{0} and pwd = #{1}
</select>

或者

<select id=" selectByUsernamePwd " resultMap="BaseResultMap" >
  select * from user where user_name = #{param1} and pwd = #{param2}
</select>

上述方法可讀性不好,不推薦使用。

@Param傳參法

該方法使用@Param註解顯示的告訴mybatis引數的名字,然後在xml中就可以使用引數名去引用。
Dao層:

User selectByUsernamePwd(@Param("username") String username, 
   @Param("pwd") String pwd );

mapper.xml:

<select id=" selectByUsernamePwd " resultMap="BaseResultMap" >
  select * from user where user_name = #{username} and pwd = #{pwd}
</select>

Map傳參法

使用map來傳遞多個引數,可以直接使用引數名稱進行引用。
在使用該方法進行傳遞引數的時候,需在controller層將接收到的引數轉化成HashMap型別。
Controller層:

@GetMapping("selectByUsernamePwd")
public viod selectByUsernamePwd (String username,String pwd)
{
    Map params = new HashMap<>();
    params.put("username",username);
    params.put("pwd",pwd);
    User user = user. selectByUsernamePwd (params);
}

Dao層:

User selectByUsernamePwd(Map params);

mapper.xml:

<select id=" selectByUsernamePwd " resultMap="BaseResultMap" parameterType="map">
  select * from user where user_name = #{username} and pwd = #{pwd}
</select>

實體類傳參法

使用bean的方式來傳遞多個引數,使用時parameterType指定為對應的bean型別即可。
這就傳參方式的優點是比較方便,controller層使用@RequestBody接收到實體類引數後,直接傳遞給mapper層呼叫即可,不需要在進行引數的轉換。
controller層:

@PostMapping ("selectByUsernamePwd")
public viod selectByUsernamePwd (@RequestBody User user)
{
    User user = user. selectByUsernamePwd (user);
}

Dao層:

User selectByUsernamePwd(User user);

mapper.xml:

<select id=" selectByUsernamePwd " resultMap="BaseResultMap" 
  parameterType="com.demo.User">
  select * from user where user_name = #{username} and pwd = #{pwd}
</select>

JSON傳參法

使用該方法,controller層收到JSON型資料後,直接傳遞給Dao層進行查詢操作,簡單、方便。
controller層:

@PostMapping ("selectByUsernamePwd")
public viod selectByUsernamePwd (@RequestBody JSONObject user)
{
    User user = user. selectByUsernamePwd (user);
}

Dao層:

User selectByUsernamePwd(JSONObject user);

mapper.xml:

<select id=" selectByUsernamePwd " resultMap="BaseResultMap"
   parameterType="com.alibaba.fastjson.JSONObject">
   select * from user where user_name = #{username} and pwd = #{pwd}
</select>

集合傳參法

在一些複雜的查詢中(如 sql中的 in操作),傳統的引數傳遞已無法滿足需求,這時候就要用到List、Set、Array型別的引數傳遞,下面以查詢年齡為24,35,47歲的使用者為例:
controller層:

@PostMapping ("selectByUserByAges")
public List<User> selectByUserByAges (@RequestBody List<Short> ages)
{
List<User> users = user. selectByUserByAges (ages);
return users;
}

Dao層:

List<User> selectByUserByAges(List<Short> ages);

mapper.xml:

<select id="selectByUserByAges" resultMap="BaseResultMap">
  SELECT * from user where age in
    <foreach collection="list" open="(" separator="," close=")" item="age">
      #{age}
    </foreach>
  </select>

這裡foreach表示迴圈操作,具體的引數含義如下:
foreach元素的屬性主要有 item,index,collection,open,separator,close。
item表示集合中每一個元素進行迭代時的別名,
index指定一個名字,用於表示在迭代過程中,每次迭代到的位置,
open表示該語句以什麼開始,
separator表示在每次進行迭代之間以什麼符號作為分隔符,
close表示以什麼結束
在使用foreach的時候最關鍵的也是最容易出錯的就是collection屬性,該屬性是必須指定的,但是在不同情況下,該屬性的值是不一樣的,主要有一下3種情況:
1.如果傳入的是單引數且引數型別是一個List的時候,collection屬性值為list
2.如果傳入的是單引數且引數型別是一個array陣列的時候,collection的屬性值為array
3.如果傳入的引數是多個的時候,我們就需要把它們封裝成一個Map或者Object

集合+物件傳參法

該類引數與實體類傳參法類似,只不過更復雜一些。下面以班級、學生為例進行說明:
實體類:

@Data
public class Class{
    private Long id;

    private String className;

    List<Student> students;
}

controller層:

@PostMapping("selectClass")
public List<Class> selectClass (@RequestBody Class class)
{
    List<Class> result= class.selectClass (class);
    return result;
}

Dao層:

List <Class> selectClass (@Param("class")Class class);

mapper.xml:

<select id="selectClass" resultMap="BaseResultMap" parameterType="com.demo.Class">
    SELECT * from class where id =#{id} and age in
    <foreach collection="class.students" open="(" separator="," close=")" 
      item="student">
        #{student.age}
    </foreach>
</select>

掃描下方二維碼,關注微信公眾號,精彩內容同步更新,有問題可隨時交流
微信公眾號

相關文章