Mybatis中传入不同类型的值处理方案

简介: 这篇文章讲述了在Mybatis中如何处理传入不同类型参数的情况,包括单个值、列表及Map等,并提供了相应的XML映射和Java代码示例。

系统在做查询时,多数情况会需要做条件筛选,也就是要传入参数,用参数作为条件去查询,因此处理传入参数就成了一个问题,传入的参数可能是单个基础数据类型的参数,也可能是集合或者是对象等,

如果传入的参数是基础数据类型,可以直接拼接上,例如:

当传入参数为String类型的name时,直接拼接到sql语句上即可,这里要注意区分#{},和${}。

#是作为占位符预编译的,简单的说,传入的内容会加上单引号只会作为一个值去执行。

但是$里的内容会拼接到sql语句中,如果传入的是sql语句也会拼接到此位置,就会存在sql注入的问题,因此正常使用#来做拼接。

但是有时候需要动态拼接sql语句的时候也会用到${},但是要处理好防止sql注入的问题。

<select id="getUserByName" parameterType="java.lang.String" resultType="User">
    SELECT * FROM sys_user WHERE name = #{name}
</select>
AI 代码解读

另一种情况是传入的数据为多个值,当传入参数为多个值时有几种方案:

第一种是直接传入多个参数:

List<User> getUsers(@Param("name") String name, @Param("age") int age);

<select id="getUserByName" parameterType="java.lang.String" resultType="User">
    SELECT * FROM sys_user WHERE name = #{name} and age = #{age}
</select>
AI 代码解读

第二种是多个参数放入map后。传入整合map:(这里的name和age,就是map中的key)

<select id="getUsers" parameterType="java.util.Map" resultType="User">
    SELECT * FROM users WHERE name = #{name} AND age = #{age}
</select>
AI 代码解读

第三种是可以设置为对象的属性,传入整个对象:(#{}中的name和age都是User的属性)

<select id="getUsers" parameterType="User" resultType="User">
    SELECT * FROM users WHERE name = #{name} AND age = #{age}
</select>
AI 代码解读

同时传入参数还可能是集合,但是传入的集合一般都是基础数据类型的集合,比如根据多个id进行查询等,这里就要引入一个新的标签<foreach> ,实际上是做了一个循环,逐个取出集合中的元素拼接到sql中,

  • collection: 指定要遍历的集合或数组的表达式,可以是一个参数、一个属性或者一个 OGNL 表达式。
  • item: 指定在遍历过程中当前元素的名称。
  • index: 指定在遍历过程中当前元素的索引,如果不需要索引可以省略。
  • open: 指定遍历生成的 SQL 片段的开头部分。
  • separator: 指定遍历生成的 SQL 片段的分隔符部分。
  • close: 指定遍历生成的 SQL 片段的结束部分。

最终类似{1,2,3}的集合经过处理会成为 (‘1’, 2’, ‘3’),list集合前后各拼接一个括号,每个元素用,隔开,拼接后的sql就是 SELECT * FROM users WHERE id IN (‘1’, ‘2’, ‘3’)

<select id="getUsersByIds" parameterType="java.util.List" resultType="User">
    SELECT * FROM users WHERE id IN
    <foreach item="item" collection="list" open="(" separator="," close=")">
        #{item}
    </foreach>
</select>
AI 代码解读

以上就是Mybatis常用的所有传入数据类型了。如果有问题,可以在评论区给我留言

目录
打赏
0
0
0
0
74
分享
相关文章
简单易懂的 MyBatis 分库分表方案
本文介绍了一种基于 MyBatis 框架的数据库分库分表方案——shardino。不同于复杂插件方式,该方案通过客户端代码包装实现简便易懂的操作,显式处理分库分表逻辑,确保开发者清晰了解数据分布。项目地址:[https://github.com/pyloque/shardino](https://github.com/pyloque/shardino)。方案中,帖子表按 userId 字段 hash 分为 64 张表,平均分配到多个主从库中,配置文件管理 MySQL 组对象,支持读写分离和权重随机选择从库。代码示例展示了如何计算 partition number 并进行具体操作。
70 22
简单易懂的 MyBatis 分库分表方案
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。本文讲解了最新版MP的使用教程,包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段等核心功能。
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
87 10
mybatis使用内部类处理一对多类型数据2
mybatis使用内部类处理一对多类型数据2
86 0
Mybatis查询的时候BigDecimal类型的值查询失效的解决办法
Mybatis查询的时候BigDecimal类型的值查询失效的解决办法
Mybatis之核心配置文件详解、默认类型别名、Mybatis获取参数值的两种方式
【1月更文挑战第3天】 一、核心配置文件详解 二、默认的类型别名 三、MyBatis的增删改查 四、MyBatis获取参数值的两种方式 1、单个字面量类型的参数 2、多个字面量类型的参数 3、map集合类型的参数 4、实体类类型的参数 5、使用@Param标识参数
177 2
Mybatis之核心配置文件详解、默认类型别名、Mybatis获取参数值的两种方式
|
9月前
|
mybatis元素类型为 "resultMap" 的内容必须匹配 "(constructor?,id *,result*,association报错解决
mybatis元素类型为 "resultMap" 的内容必须匹配 "(constructor?,id *,result*,association报错解决
474 0
|
9月前
|
MyBatis【问题 01】mapper传入array\collection\list类型的参数时报BindingException:Parameter ‘xx‘ not found问题复现及解决
MyBatis【问题 01】mapper传入array\collection\list类型的参数时报BindingException:Parameter ‘xx‘ not found问题复现及解决
261 0
干翻Mybatis源码系列之第八篇:Mybatis提供的缓存方案细节注意
干翻Mybatis源码系列之第八篇:Mybatis提供的缓存方案细节注意
干翻Mybatis源码系列之第七篇:Mybatis提供的集成缓存方案
干翻Mybatis源码系列之第七篇:Mybatis提供的集成缓存方案
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等