mybatis in查询传入String方式

mybatis in查询传入String

在使用 mybaits 进行 in 查询时,传入String,如1,2,3,发现查询的结果并非我们想要的

这是因为#{}编译完自动加双引号“” 也就是变成in (“1,2,3”)

如果想要获得我们想要的结果,可以使用${},编译完是这样的 in (1,2,3)

例如,查询铃音库中多首铃音的总数量

<select id="getProgsResourceCount" resultType="java.lang.Long"
 parameterType="com.progandresource.entity.ProgsResourceCond">
 select count(ring_no)
     from progandresmanage_ringinfo where valid_day > now()
 <if test="ringNo != '' and ringNo != null">
     and ring_no in (${ringNo})
 </if>
</select>

如果传入参数是List或者Array,则直接用foreach即可

例如

<select id="getProgsResourceCount" resultType="java.lang.Long" parameterType="java.util.List">
 select count(ring_no)
     from progandresmanage_ringinfo where valid_day > now() and ring_no in
 <foreach collection="list" item="item" index="index" open="(" close=")" separator=",">
            #{item, jdbcType=VARCHAR}
        </foreach>
</select>

mybatis in查询传入字符串参数

sql里的in操作符允许我们在where子句中规定多个值进行匹配。

语法:

SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...);

在mybatis里,可以通过传入数组或容器(array、list、set、map)通过foreach标签来给in操作符指定参数。

问题:想要从org表中匹配字段org_id在OR001、OR002、OR004中的数据,org_id是字符串类型的字段。

常规方法是在mapper.java中传入一个包含"OR001"、“OR002”、"OR004"的list对象orgIdList,在xml中:

SELECT * from org where org_id in
<foreach item="orgId" index="index" collection="orgIdList" open="(" close=")" separator=",">
#{orgId}
</foreach>

如果要作为in的匹配参数的多个值在一个String类型的对象orgs中,想直接通过String传入,有两种实现方式。

1、在xml中用${orgs}把整个String作为sql的一部分

SELECT * from org where org_id in (${orgs})

这种写法需要关注字符串orgs的内容在拼入之后,整个sql是否是符合语法的,按上面的需求和sql写法,就要求作为sql一部分的orgs的值为"‘OR001',‘OR002',‘OR004'"。

参数直接以sql一部分的方式作为查询语句存在sql注入的风险,有一些项目可能会一刀切地限制开发者不允许用这种写法。

2、在xml的foreach标签里,传入collection属性时将字符串用split函数转为数组

SELECT * from org where org_id in
<foreach item="orgId" index="index" collection="orgs.split(',')" open="(" close=")" separator=",">
#{orgId}
</foreach>

在这里传入的orgs字符串的值可以为"OR001,OR002,OR004",在调用split函数时设置","分格,可以直接切分出三个字符串作为数组的元素。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • MyBatis 参数类型为String时常见问题及解决方法

    1. 参数为String时的插值问题 假设有下面一Dao接口方法 public Account findByAccountType (String type)throws DaoException; 对应的Mapper.xml <select id="findByAccountType " parameterType="string" resultType="account"> select * form account <wh

  • mybatis 查询sql中in条件用法详解(foreach)

    foreach属性主要有item,index,collection,open,separator,close 1.item表示集合中每一个元素进行迭代时的别名, 2.index指定一个名字,用于表示在迭代过程中,每次迭代到的位置, 3.open表示该语句以什么开始, 4.separator表示在每次进行迭代之间以什么符号作为分隔符, 5.close表示以什么结束, 6.collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的, 主要有一下3种情况: a.如果传入的是单

  • mybatis使用foreach语句实现IN查询(三种)

    foreach语句中, collection属性的参数类型可以使:List.数组.map集合 collection: 必须跟mapper.java中@Param标签指定的元素名一样 item : 表示在迭代过程中每一个元素的别名,可以随便起名,但是必须跟元素中的#{}里面的名称一样. index :表示在迭代过程中每次迭代到的位置(下标) open :前缀, sql语句中集合都必须用小括号()括起来 close :后缀 separator :分隔符,表示迭代时每个元素之间以什么分隔 Mybati

  • mybatis in查询传入String方式

    mybatis in查询传入String 在使用 mybaits 进行 in 查询时,传入String,如1,2,3,发现查询的结果并非我们想要的 这是因为#{}编译完自动加双引号"" 也就是变成in ("1,2,3") 如果想要获得我们想要的结果,可以使用${},编译完是这样的 in (1,2,3) 例如,查询铃音库中多首铃音的总数量 <select id="getProgsResourceCount" resultType="

  • Mybatis游标查询大量数据方式

    目录 Mybatis游标查询大量数据 mapper层 service层 资源释放 Mybatis游标使用总结 什么是游标 Mybatis游标查询大量数据 对大量数据进行处理时,为防止内存泄漏情况发生,所以采用mybatis plus游标方式进行数据查询处理,当查询百万级的数据的时候,使用游标可以节省内存的消耗,不需要一次性取出所有数据,可以进行逐条处理或逐条取出部分批量处理 mapper层 使用Cursor类型进行数据接收 @Options,fetchSize设置为Integer最小值 @Sel

  • mybatis-plus 查询传入参数Map,返回List<Map>方式

    目录 mybatis-plus 查询传入参数Map,返回List<Map> 1.mapper.xml 2.mapper.java 3.service 组装查询条件 mybatis-plus 基本使用 首先我们需要创建一个数据库表 然后创建一个Spring Boot项目 我们来演示几个基本的查询方法 再演示几个删除方法 再演示插入方法 mybatis-plus 查询传入参数Map,返回List<Map> 原因有时实体类属性不够用,又不想写自定义VO了,所以用map,这样直接返回前台用

  • mybatis批量新增、删除、查询和修改方式

    目录 前期说明: 主要有一下3种情况: (1)mybatis批量新增 (2)mybatis批量删除 (3)mybatis批量查询 (4)mybatis批量修改 mySql Case函数 动态批量修改:DeviceMapper.xml 动态批量修改:DeviceMapper.java 控制层(xxxxController) 每次写批量的时候,都要在网上搜索一下,虽然都做过多次了,但具体的自己还是记不住(汗颜),所以索性今天就记录下来. 前期说明: foreach的主要用在构建in条件中,它可以在S

  • mybatis 模糊查询的实现方法

    mybatis 模糊查询的实现方法 mybatis的逆向助手确实好用,可以省去很多编写常规sql语句的时间,但是它没办法自动生成模糊查询语句,但开发中模糊查询是必不可少的,所以,需要手动对mapper编写模糊查询功能. 这里先明确MyBatis/Ibatis中#和$的区别: 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解

  • Java中mybatis的三种分页方式

    目录 前言 一.Limit分页 二.RowBounds分页(不推荐使用) 三.Mybatis_PageHelper分页插件 前言 分页是我们在开发中绕不过去的一个坎!当你的数据量大了的时候,一次性将所有数据查出来不现实,所以我们一般都是分页查询的,减轻服务端的压力,提升了速度和效率!也减轻了前端渲染的压力! 注意:由于 java 允许的最大整数为 2147483647,所以 limit 能使用的最大整数也是 2147483647,一次性取出大量数据可能引起内存溢出,所以在大数据查询场合慎重使用!

  • Mybatis 条件查询 批量增删改查功能

    模糊查询: @Select({ "SELECT * FROM account where account like CONCAT('%',#{query},'%') or email like CONCAT('%',#{query},'%')" }) Account findAccountByAccountOrMail(@Param("query") String query); 批量添加: @Insert({ "<script>"

  • mybatis模糊查询、分页和别名配置的方法

    mybatis模糊查询(3种) 第一种 select * from user where username like "%" #{name} "%" 第二种 select * from user where username like "%${value}%" 第三种 <!--concat拼接字符串 mysql独有的函数--> select * from user where username like concat("%&

  • mybatis Map查询结果下划线转驼峰的实例

    添加一个配置类MybatisCamelConfig 即可 package com.fpi.notify.config; import com.google.common.base.CaseFormat; import org.apache.ibatis.reflection.MetaObject; import org.apache.ibatis.reflection.wrapper.MapWrapper; import org.apache.ibatis.reflection.wrapper.

  • 如何基于mybatis框架查询数据库表数据并打印

    一.需求说明 使用mybatis框架查询数据库user表数据并打印到控制台上 二.数据库数据准备 -- 创建用户表 create table user ( id int primary key auto_increment, username varchar(20) not null, birthday date, sex char(1) default '男', address varchar(50) ); -- 添加用户数据 insert into user values (null, '孙

随机推荐