首页 > 数据库 >Mybatis中的Mapper.xml映射文件sql查询接收多个参数 分页查询 sql语句动态生成的时候,使用${},sql语句中某个参数进行占位的时候用#{}

Mybatis中的Mapper.xml映射文件sql查询接收多个参数 分页查询 sql语句动态生成的时候,使用${},sql语句中某个参数进行占位的时候用#{}

时间:2023-07-31 18:45:16浏览次数:51  
标签:语句 pageSize pageNo 查询 参数 sql Integer public

Mybatis中的Mapper.xml映射文件sql查询接收多个参数 分页查询 sql语句动态生成的时候,使用${},sql语句中某个参数进行占位的时候用#{}
原文链接:https://blog.csdn.net/Ep_Little_prince/article/details/100687848

​ 我们都知道,在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);
}
  • 1
  • 2
  • 3

第一种方法:使用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>
  • 1
  • 2
  • 3
  • 4
  • 5

<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>
  • 1
  • 2
  • 3
  • 4
  • 5

第二种方法:封装成对象

Page.java

public class Page {
    private Integer pageNo;
    private Integer pageSize;
	//getter,setter略
}
  • 1
  • 2
  • 3
  • 4
  • 5

传参:

控制层封装前台传来的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);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

service层:

public interface CustomerService{   
	String findAllPageClass(Page page);
}
  • 1
  • 2
  • 3

持久层传参:

public interface CustomerDao {
     List<Customer> findAllPageClass(Page page);
}   
  • 1
  • 2
  • 3

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>
  • 1
  • 2
  • 3
  • 4
  • 5

第三种方法:封装成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);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

service层:

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

持久层传参:

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

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>
  • 1
  • 2
  • 3
  • 4
  • 5

第四种方法:使用@Param绑定参数

public interface CustomerDao {
	List<Customer> findAllPageSql(
        @Param(value = "pageNo") Integer pageNo,
        @Param(value = "pageSize") Integer pageSize);
}
  • 1
  • 2
  • 3
  • 4
  • 5

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>
  • 1
  • 2
  • 3
  • 4
  • 5

补充 :#{}与${}区别

  • #{} 在SQL动态解析之后,编译将#{}替换为占位符?去替换参数,可以防止sql注入

  • #{} 只是表示占位,与参数的名字无关,如果只有一个参数会自动对应,下面会介绍多个参数的问题;

  • ${} 是进行字符串拼接,直接取出参数值,放到sql语句中;

  • 使用注意点,当表名作为变量时,必须使用${}获取参数作为表名进行查询,否则会出现语法错误;

总结:

  • sql语句动态生成的时候,使用${}
  • sql语句中某个参数进行占位的时候用#{}

标签:语句,pageSize,pageNo,查询,参数,sql,Integer,public
From: https://www.cnblogs.com/sunny3158/p/17594204.html

相关文章

  • 软件测试|SQL中的LIKE模糊匹配该怎么用?
    SQL中的LIKE模糊匹配解析简介在SQL(StructuredQueryLanguage)中,LIKE是一种用于模糊匹配的操作符。通过使用LIKE,我们可以根据模式匹配的方式进行数据检索,而不仅仅局限于完全匹配。本文将详细介绍SQL中LIKE操作符的语法、用法以及一些示例,帮助您掌握模糊匹配的技巧。LIKE模糊匹配在S......
  • 软件测试|SQL TOP提取顶部数据该如何使用?
    SQLTOP子句:提取数据库中的顶部数据简介在SQL查询语言中,TOP子句是一个非常有用的功能,它允许我们从数据库中提取指定数量的顶部数据记录。本文将深入探讨SQLTOP子句的使用方法,以及在实际应用中的一些常见场景和技巧。SQLTOPSQL是一种用于管理和操作关系型数据库的强大语言,TOP子句......
  • sqlserver SELECT显示和PRINT打印超长的字符
    步骤一:SSMS里返回的列值长度限制,问题没有解决步骤二:使用如下方式”Cast或FORXMLPATH;问题还是一样printCast(@AgentListastext)select@AgentListforxmlPath('')selectCAST(@AgentListasXML)分析问题:一直只显示50字符,最终找到问题所在,是定义的变量长度的问题,@Agen......
  • 如何获取备份 SQL 数据库历史记录
    本文将回顾如何获取有关备份SQL数据库历史记录的信息,包括MSDB中可查询的元数据,以及用于对这些关键信息进行分组、排序、报告和导出的增值工具和功能 每个组织都必须在其环境中定义备份策略。此类策略有助于以最小的数据丢失和最短的停机时间恢复数据库。SQLServer在系统......
  • 数据库三大范式,mysql索引,事务的特性和隔离级别
    1数据库三大范式是什么数据库设计理论中的三大范式是指关系数据库中的规范化原则,目的是减少数据冗余和数据更新异常。第一范式(1NF):第一范式要求关系数据库表的每个属性都是原子性的,即每个属性不能再细分为更小的数据项。它要求将数据划分为最小的单元,避免重复或多值属性。这样......
  • mysql 查看当前正在被锁定的事务和等待锁的事务信息
    SELECTr.trx_idAS'事务ID',r.trx_stateAS'事务状态',r.trx_startedAS'事务开始时间',r.trx_wait_startedAS'等待开始时间',l.lock_tableAS'表',l.lock_indexAS'索引',l.lock_modeAS......
  • MYSQL中JSON类型介绍
    1json对象的介绍在mysql未支持json数据类型时,我们通常使用varchar、blob或text的数据类型存储json字符串,对mysql来说,用户插入的数据只是序列化后的一个普通的字符串,不会对JSON文档本身的语法合法性做检查,文档的合法性需要用户自己保证。在使用时需要先将整个json对象从数据库读......
  • SQLite的SQL语法 CREATE INDEX
    SQLite的SQL语法[目录]CREATEINDEXsql-statement ::=CREATE[UNIQUE]INDEX[IFNOTEXISTS][database-name.]index-nameONtable-name(column-name[,column-name]*)column-name ::=name[COLLATEcollation-name][ASC|DESCCREATEINDEX命令由"CREATEINDEX&qu......
  • Mysql高级6-视图
    一、视图介绍视图(View):是一种虚拟存在的表,视图中的数据并不在数据库中实际存在,行和列数据来自,定义视图时查询使用的表,并且是在使用视图时动态生成的。通俗的讲,视图只保存了查询的SQL逻辑,不保存查询的结果。 二、创建视图2.1语法create[orreplace]view视图名称......
  • 【Logstash】conf文件mysql多数据源导入elasticsearch配置说明
    #inputplugin输入插件,接收事件源input{jdbc{#定义类型_1type=>"type_1"#mysql的ip、端口以及用到的数据库名jdbc_connection_string=>"jdbc:mysql://localhost:3306/数据库名"#mysql用户名jd......