Mybatis中的Mapper.xml映射文件sql查詢接收多個參數

​ 我們都知道,在Mybatis中的Mapper.xml映射文件可以定製動態SQL,在dao層定義的接口中定義的參數傳到xml文件中之後,在查詢之前mybatis會對其進行動態解析,通常使用#{}接收,下面介紹幾種比較常用的用法。

接收多個參數

​ 遇到這個問題是在昨天實現分頁的時候接收參數時遇到了錯誤,最後用第一種方法解決,但是懷着路漫漫其修遠兮的態度,吾必將上下而求索其他用法,所以在查詢了網上很多教程和mybatis官方文檔,總結出以下四種常用用法;
具體分頁參考:
手動實現分頁
手動分頁

  • 使用arg0,arg1或使用param1,param2接收(arg索引從0開始,param索引從1開始);
  • 多個參數封裝成對象;
  • 多個參數封裝成Map集合;
  • 使用@param綁定參數;

下面分別介紹

public interface CustomerDao {
     List<Customer> findAllPageSql(Integer pageNo,Integer pageSize);
}

第一種方法:使用arg或param

<mapper namespace="com.vue.dao.CustomerDao">
    <select id="findAllPageSql" parameterType="java.lang.Integer" resultType="com.vue.entity.Customer">
        SELECT * FROM t_customer LIMIT #{param1},#{param2}
    </select>
</mapper>

<mapper namespace="com.vue.dao.CustomerDao">
    <select id="findAllPageSql" parameterType="java.lang.Integer" resultType="com.vue.entity.Customer">
        SELECT * FROM t_customer LIMIT #{arg0},#{arg1}
    </select>
</mapper>

第二種方法:封裝成對象

Page.java

public class Page {
    private Integer pageNo;
    private Integer pageSize;
	//getter,setter略
}

傳參:

控制層封裝前臺傳來的page信息

	@ResponseBody
    @GetMapping("/allClass")
    public String findAllPageClass(@RequestParam(required = true,defaultValue = "1") Integer pageNo,
                                 @RequestParam(required = false,defaultValue = "5") Integer pageSize) {
        Page page = new Page();
        page.setPageNo(pageNo-1);
        page.setPageSize(pageSize);
        return customerService.findAllPageClass(page);
    }

service層:

public interface CustomerService{   
	String findAllPageClass(Page page);
}

持久層傳參:

public interface CustomerDao {
     List<Customer> findAllPageClass(Page page);
}   

mapper.xml映射文件

<mapper namespace="com.vue.dao.CustomerDao">
   <select id="findAllPageClass" resultType="com.vue.entity.Customer" parameterType="com.vue.util.Page">
       SELECT * FROM t_customer LIMIT #{pageNo},#{pageSize}
   </select>
</mapper>

第三種方法:封裝成Map集合

傳參:

控制層封裝前臺傳來的page信息

	@ResponseBody
    @GetMapping("/allMap")
    public String findAllPageMap(@RequestParam(required = true,defaultValue = "1") Integer pageNo,
                                   @RequestParam(required = false,defaultValue = "5") Integer pageSize) {
        Map<String,Integer> pageMap = new HashMap<>();
        pageMap.put("pageNo",pageNo-1);
        pageMap.put("pageSize",pageSize);
        return customerService.findAllPageMap(pageMap);
    }

service層:

public interface CustomerService{   
	String findAllPageMap(Map<String, Integer> pageMap);
}

持久層傳參:

public interface CustomerDao {
     List<Customer> findAllPageMap(Map<String, Integer> pageMap);
}   

mapper.xml映射文件

<mapper namespace="com.vue.dao.CustomerDao">
   <select id="findAllPageMap" parameterType="java.util.Map" resultType="com.vue.entity.Customer">
       SELECT * FROM t_customer LIMIT #{pageNo},#{pageSize}
   </select>
</mapper>

第四種方法:使用@Param綁定參數

public interface CustomerDao {
	List<Customer> findAllPageSql(
        @Param(value = "pageNo") Integer pageNo,
        @Param(value = "pageSize") Integer pageSize);
}

mapper.xml映射文件

<mapper namespace="com.vue.dao.CustomerDao">
	<select id="findAllPageSql" parameterType="java.lang.Integer" resultType="com.vue.entity.Customer">
        SELECT * FROM t_customer LIMIT #{pageNo},#{pageSize}
	</select>
</mapper>

補充 :#{}與${}區別

  • #{} 在SQL動態解析之後,編譯將#{}替換爲佔位符?去替換參數,可以防止sql注入;

  • #{} 只是表示佔位,與參數的名字無關,如果只有一個參數會自動對應,下面會介紹多個參數的問題;

  • ${} 是進行字符串拼接,直接取出參數值,放到sql語句中;

  • 使用注意點,當表名作爲變量時,必須使用${}獲取參數作爲表名進行查詢,否則會出現語法錯誤;

總結:

  • sql語句動態生成的時候,使用${}
  • sql語句中某個參數進行佔位的時候用#{}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章