题目描述
我现在要批量往数据库中插入数据(xxx证件),这个证件根据证件代码和号码确定唯一,待插入的批量数据里面有些数据,在数据库里面有可能已经存在。
我现在的目的是:批量插入,如果该证件已经存在,就忽略。我想到的做法就是:遍历这个 待插入的批量数据,每一个按照代码和号码去数据库中查询,查到了就跳过,没查询到就新增。但是这个 待插入的批量数据 可能很大,我要遍历他,然后循环的去数据库中按照代码、号码查询,循环的去操作数据库,这样操作数据库压力很大。
所以我的想法是:想根据这个 待插入的批量数据去数据库中查询(批量的,不是循环单条),哪些是已经存在的,在java代码里面将其排除,确保待插入的数据中没有重复的,再批量插入,前后只用执行两次SQL。所以我现在的问题是:如何根据两个条件,去数据库中查询一个list出来?
如果还没有理解我的问题,我再说简单一点:我现在的条件是这样的
[{'code':'3249sdf023','number':'2340dfssdf34'},
{'code':'3249sdf024','number':'2340dfssdf35'},
{'code':'3249sdf025','number':'2340dfssdf36'},
{'code':'3249sdf026','number':'2340dfssdf37'},……]
数据库表里也有code和number这两个字段,要怎么根据这些条件,查询出来一个list
使用in,只能按照一个条件批量查询, where aColumn in (……) and bColumn in (……) 这样没法满足条件。
结论
我一开始也没想到解决办法,百度了半天,终于找到了有用的线索,然后弄出来了。
想批量按照条件查询,首先想到的都是用in,上面也说了,in只能按照一个条件批量查询。想要使用两个条件批量查询。可以拼接条件和字段,SQL如下:
select * from tableA where CONCAT(code,number) in ('3249sdf0232340dfssdf34','3249sdf0242340dfssdf35',……);
在代码中遍历条件,将code和number拼接起来,然后在传给SQL的in条件里面,就完美解决了。不知道这样处理会不会有什么隐患,或者对性能有什么影响,这样应该索引没法使用了。不过相较于循环查询,即便这样索引失效,效率也更高