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>

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

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

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>

第二种是多个参数放入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>

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

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

同时传入参数还可能是集合,但是传入的集合一般都是基础数据类型的集合,比如根据多个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>

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

相关文章
|
7月前
|
SQL Java 数据库连接
Mybatis源码分析系列之第三篇:Mybatis的操作类型对象
Mybatis源码分析系列之第三篇:Mybatis的操作类型对象
|
Java 数据库连接 mybatis
mybatis返回map类型数据空值字段不显示(三种解决方法)
mybatis返回map类型数据空值字段不显示(三种解决方法)
|
7月前
|
SQL Java 数据库连接
Mybatis之核心配置文件详解、默认类型别名、Mybatis获取参数值的两种方式
【1月更文挑战第3天】 一、核心配置文件详解 二、默认的类型别名 三、MyBatis的增删改查 四、MyBatis获取参数值的两种方式 1、单个字面量类型的参数 2、多个字面量类型的参数 3、map集合类型的参数 4、实体类类型的参数 5、使用@Param标识参数
135 2
Mybatis之核心配置文件详解、默认类型别名、Mybatis获取参数值的两种方式
|
1月前
|
SQL Java 数据库连接
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。本文讲解了最新版MP的使用教程,包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段等核心功能。
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
|
2月前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
54 10
|
7月前
|
存储 Java 数据库连接
MyBatis的类型处理器TypeHandler与自定义实现
MyBatis的类型处理器TypeHandler与自定义实现
643 0
|
7月前
|
存储 XML Java
mybatis使用内部类处理一对多类型数据2
mybatis使用内部类处理一对多类型数据2
79 0
|
7月前
|
SQL Java 数据库连接
Mybatis查询的时候BigDecimal类型的值查询失效的解决办法
Mybatis查询的时候BigDecimal类型的值查询失效的解决办法
|
7月前
|
SQL XML Java
mybatis元素类型为 "resultMap" 的内容必须匹配 "(constructor?,id *,result*,association报错解决
mybatis元素类型为 "resultMap" 的内容必须匹配 "(constructor?,id *,result*,association报错解决
392 0
|
7月前
|
SQL IDE Java
MyBatis【问题 01】mapper传入array\collection\list类型的参数时报BindingException:Parameter ‘xx‘ not found问题复现及解决
MyBatis【问题 01】mapper传入array\collection\list类型的参数时报BindingException:Parameter ‘xx‘ not found问题复现及解决
222 0