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

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

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

当传入参数为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常用的所有传入数据类型了。如果有问题,可以在评论区给我留言

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

baker_zhuang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值