SSM框架中Mybatis傳遞引數的幾種方法
在實際使用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>
掃描下方二維碼,關注微信公眾號,精彩內容同步更新,有問題可隨時交流
相關文章
- python中函式引數傳遞的幾種方法Python函式
- require方法接受以下幾種引數的傳遞:UI
- SpringBoot系列Mybatis之引數傳遞的幾種姿勢Spring BootMyBatis
- Mybatis引數傳遞MyBatis
- Mybatis傳遞多個引數的4種方式(乾貨)MyBatis
- Java中將方法作為引數傳遞5種方式Java
- mybatis 傳遞多個引數 --解決mybatis查詢使用多個引數方法--javabean傳統方法和map方法MyBatisJavaBean
- 向路由元件傳遞引數2種方法路由元件
- JS的方法引數傳遞(按值傳遞)JS
- Mybatis引數傳遞&註解開發MyBatis
- java 中引數的傳遞Java
- java 傳遞引數的兩種方式Java
- OFBiz中的引數傳遞
- angularjs中ajax請求時傳遞引數的方法AngularJS
- mybatis傳遞引數到mapping.xmlMyBatisAPPXML
- golang 方法作為引數傳遞Golang
- Mybatis 傳入多個引數查詢資料 (3種方法)MyBatis
- 引數傳遞
- php函式引用傳遞引數的方法PHP函式
- GridView傳遞兩個引數的方法View
- linux中main引數傳遞LinuxAI
- js中函式引數值傳遞和引用傳遞JS函式
- MyBatis中傳入引數為List集合的MyBatis
- Java中方法引數傳遞詳析Java
- 在 `el-upload` 的事件中傳遞更多引數的方法事件
- 面試官問:Go 中的引數傳遞是值傳遞還是引用傳遞?面試Go
- Java方法04:命令列傳遞引數、可變引數Java命令列
- python中函式的引數傳遞Python函式
- C/C++中的引數傳遞方式C++
- JSP中四種傳遞引數中文亂碼問題JS
- ABAP 方法呼叫的引數傳遞裡,透過引用傳遞的方式,能修改原始引數值嗎?
- JavaScript引數傳遞中值和引用的一種理解JavaScript
- mybatis如何傳引數MyBatis
- Javascript 定時器呼叫傳遞引數的方法JavaScript定時器
- android 中Service 和activity之間的資料傳遞的幾種方法Android
- C# 中傳遞引數到執行緒的 N 個方法C#執行緒
- JNI傳遞引數
- 請求引數的傳遞