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语句中某个参数进行占位的时候用#{}
Mybatis中的Mapper.xml映射文件sql查询接收多个参数的更多相关文章
- Mybatis学习--Mapper.xml映射文件
简介 Mapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心. 映射文件中有很多属性,常用的就是parameterType(输入类型 ...
- Mapper.xml映射文件
查询订单关联查询用户: 使用resultType,ordersCustom可以通过继承orders获得其属性,再添加我们需要的用户字段. 使用resultMap,orders表中通过封装user对象来 ...
- MyBatis学习存档(3)——mapper.xml映射文件
MyBatis 真正的强大在于映射语句,专注于SQL,功能强大,SQL映射的配置却是相当简单 所以我们来看看映射文件的具体结构 一.xml节点结构 mapper为根节点 - namespace命名空间 ...
- mybatis 使用注解简化xml映射文件
目录 关于mybatis注解 初次简单使用mybatis注解示例 利用注解实现指定映射 使用注解实现表间关联(1对1) 关于mybatis注解 注解在java中特别常见,mybatis中也支持注解. ...
- 解决 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 以及MyBatis批量加载xml映射文件的方式
错误 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 的出现,意味着项目需要xml文件来 ...
- MyBatis - 3.Mapper XML映射文件
SQL 映射文件有很少的几个顶级元素(按照它们应该被定义的顺序): cache – 给定命名空间的缓存配置. cache-ref – 其他命名空间缓存配置的引用. resultMap – 是最复杂也是 ...
- mybatis Mapper XML 映射文件
传送门:mybatis官方文档 Mapper XML 文件详解 一. 数据查询语句 1. select <select id="selectPerson" parameter ...
- 在mapper.xml映射文件中添加中文注释报错
问题描述: 在写mapper.xml文件时,想给操作数据库语句添加一些中文注释,添加后运行报如下错误: 思考 可能是写了中文注释,编译器在解析xml文件时,未能成功转码,从而导致乱码.但是文件开头也采 ...
- mybatis自动生成mapper,dao映射文件
利用Mybatis-Generator来帮我们自动生成mapper.xml文件,dao文件,model文件. 1.所需文件 关于Mybatis-Generator的下载可以到这个地址:https:// ...
随机推荐
- iOS中的GCD线程
一.什么是GCD 全称是Grand Central Dispatch ,纯C语言编写,提供非常多强大的函数,是目前苹果官网推荐的多线程开发方法,NSOperation 便是基于GCD的封装 ...
- 记录C#泛型
常见的泛型类型 泛型类 class MyClass<T> { //...... } 泛型接口 interface GenericInterface<T> { void Gene ...
- MIPI CSI2学习(一):说一说MIPI CSI2
1. MIPI CSI2简介 MIPI联盟是一个开放的会员制组织.2003年7月,由美国德州仪器(TI).意法半导体(ST).英国ARM和芬兰诺基亚(Nokia)4家公司共同成立.MIPI联盟旨在推进 ...
- Python推导表达式、迭代器、生成器、模块和包
推导表达式 yield用法 模块的概念和导入方法 包和包管理 推导表达式(利用for,一个一个地放入数据) 列表推导 集合推导 字典推导 迭代器 迭代 for 迭代变量 in 可迭代对象 每一次循环都 ...
- 实时SSH网络吞吐量测试
centos 需要epel 源安装pv 软件,debian 需要安装pv 软件 #测试本机到192.168.1.158 的实时速率 yes | pv | ssh 192.168.1.158 " ...
- Shell命令-网络操作之基础之telnet、ssh
文件及内容处理 - telnet.ssh 1. telnet:使用TELNET协议远程登录 telnet命令的功能说明 telnet 命令用于远端登入.执行 telnet 指令开启终端机阶段作业,并登 ...
- 第十七章 Metasploit Framework
渗透测试者的困扰▪ 需要掌握数百个工具软件,上千个命令参数,实在记不住▪ 新出现的漏洞PoC/EXP有不同的运行环境要求,准备工作繁琐▪ 大部分时间都在学习使用不同工具的使用习惯,如果能统一就好了▪ ...
- MATLAB常见的学习率下降策略
MATLAB常见的学习率下降策略 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. 几种常见的学习率下降策略(learning rate decay st ...
- Python3面向对象编程实例
/*认真研究完这个实例,理解python面向对象编程的方法*/class Person: """人员信息""" # 姓名(共有属性) nam ...
- 第十六周博客作业 <西北师范大学| 周安伟>
第十六周作业 助教博客链接https://home.cnblogs.com/u/zaw-315/ 作业要求链接https://www.cnblogs.com/nwnu-daizh/p/10980707 ...