Mybatis中的Mapper.xml映射文件sql查询接收多个参数

​Mybatis中的Mapper.xml映射文件sql查询接收多个参数

接收多个参数

​ 遇到这个问题是在昨天实现分页的时候接收参数时遇到了错误,最后用第一种方法解决,但是怀着路漫漫其修远兮的态度,吾必将上下而求索其他用法,所以在查询了网上很多教程和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语句中某个参数进行占位的时候用#{}
————————————————
版权声明:本文为CSDN博主「一壶浊酒伴余生」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Ep_Little_prince/article/details/100687848


欢迎关注公众号Java技术大本营,会不定期分享BAT面试资料等福利。

在这里插入图片描述


  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值