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:// ...
随机推荐
- C# 校验并转换 16 进制字符串到字节数组
问题 最近在进行硬件上位机开发的时候,经常会遇到将 16 进制字符串转换为 byte[] 的情况,除了这种需求以外,还需要判定一个字符串是否是有效的 16 进制数据. 解决 字符串转 byte[] 的 ...
- 用Python复制文件的9个方法
Python 中有许多"开盖即食"的模块(比如 os,subprocess 和 shutil)以支持文件 I/O 操作.在这篇文章中,你将会看到一些用 Python 实现文件复制的 ...
- JS基础语法---分支语句之:switch-case语句---3个练习
switch-case语句---分支语句---多分支语句 语法: switch(表达式){ case 值1:代码1;break; case 值2:代码2;break; case 值3:代码3;brea ...
- 配置flutter For IOS
https://www.cnblogs.com/lovestarfish/p/10628205.html 第一步,下载flutter最新版,解压到自己的目录里: 提供网址:https://flutte ...
- 机器视觉-python基础入门
下载安装python版本 https://www.python.org/ 安装并且勾上为添加系统环境 然后进入cmd命令行里进行 这时候装成功了 然后装opencv依赖库 pip install o ...
- 获取SpringCloud gateway响应的response的值,记录踩坑
最近在做网关改造,想要通过Gateway过滤器获取ResponseBody的值,查看了网上的帖子和官网内容: 帖子:https://cloud.tencent.com/developer/articl ...
- 微信小程序如何使用 Git 实现版本管理和协作开发
前言 在微信小程序开发的过程中,代码版本管理往往需要使用第三方工具进行管理.虽然微信Web开发工具提供了对Git文件版本状态的提示,但实际的使用体验依然不尽人意. 随着微信Web开发工具的更新,最新的 ...
- Go切片去掉重复元素
1.Go切片去掉重复元素 如果传入的是string类型: //slice去重 func removeRepByMap(slc []string) []string { result := []stri ...
- putty 配色方案
putty 配色方案 修改地点: Default Foreground: 255/255/255 Default Background: 51/51/51 ANSI Black: 77/77/77 A ...
- spark streaming checkpointing windows
spark streaming的相关概念: spark的核心是创建一个RDD对象,然后对RDD对象进行计算操作等 streaming可以理解为是 一个连续不断的数据流 ,然后将每个固定时间段里的数据构 ...