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

摘要:
众所周知,Mybatis中的Mapper。xml映射文件可以自定义动态SQL。在dao层中定义的接口中定义的参数被传输到xml文件之后,mybatis将在查询之前动态解析它们,通常使用#{}来接收它们。以下是一些常见的用法。替换参数以防止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语句中某个参数进行占位的时候用#{}

免责声明:文章转载自《Mybatis中的Mapper.xml映射文件sql查询接收多个参数》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ArcEngine内置工具条12、JavaEE--Listener监听器下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

如何用IDEA创建springboot(maven)并且整合mybatis连接mysql数据库和遇到的问题

一、New->Project 二、点击next  三、在Group栏输入组织名,Artifact就是项目名。选择需要的java版本,点击next  四、添加需要的依赖 在这里我们也可以添加sql方面的依赖,这样的话,我们就不用手动在pom文件添加依赖了  五、修改您希望放项目的位置,点击finish,等待idea下载springboot项目模板...

IDEA 创建 MAPPER 模板

Mybatis 是一款优秀的 ORM 框架,但是在 IDEA 工具使用时并未自带 MAPPER 文件模板,需要手工添加,接下来就一起在 IDEA 中创建一个 MAPPER 文件模板吧; 1、打开 IDEA ,右键 new-->Edit File Template 2、点击 + ,输入此模板名称 3、黏贴 MAPPER 模板内容: <?xml...

SpringBoot整合Mybatis-Plus报错org.apache.ibatis.binding.BindingException

SpringBoot整合Mybatis-Plus报错org.apache.ibatis.binding.BindingException Mapper接口,被Spring注入后,却无法正常的使用mapper.xml的sql;你的接口已经成功的被扫描到,但是当Spring尝试注入一个代理(MyBatista实现)的实现类后,却无法正常使用。这里的可能发生的情...

Java消息系统简单设计与实现

前言:由于导师在我的毕设项目里加了消息系统(本来想水水就过的..),没办法...来稍微研究研究吧..简单简单... 需求分析 我的毕设是一个博客系统,类似于简书这样的,所以消息系统也类似,在用户的消息里包含了有:喜欢和赞、评论、关注、私信这样的一类东西,这样的一个系统应该包含以下的功能: 当用户评论/关注/点赞时能够通知到被评论/关注/点赞的用户,并...

Spring+SpringMVC+MyBatis深入学习及搭建(八)——MyBatis查询缓存

转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6956206.html  前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(七)——MyBatis延迟加载 1.什么是查询缓存 mybatis提供查询缓存,用于减轻数据库压力,提高数据库性能。 mybatis提供一级缓存和二级缓存。 一级缓存...

浅入 ABP 系列(7):对象映射

目录 基础 DTO和实体 麻烦的映射 AutoMapper 集成 IObjectMapper/ObjectMapper 对象拓展 写博客的过程中,发现很多基础理论太薄弱,因此很多专业词汇可能会解释错误或者不准确,建议读者多参考官方文档或者其它书籍。 本篇主要讲解 ABP 中如何配置、使用对象映射,其中大部分跟 AutoMapper 这个框架有...