精华内容
下载资源
问答
  • ElasticSearch批量查询JavaApi实现

    千次阅读 2020-08-10 16:02:28
    Elasticsearch 允许通过一次查询请求执行多个文档的检索,虽然 Elasticsearch 内部还是一条一条去检索,但是这样可以避免多次请求造成的单独网络开销,相对于一个一个的检索,这样的效率更高。 之前项目处理是一条一...

    ElasticSearch 版本 6.8

    背景

    Elasticsearch 允许通过一次查询请求执行多个文档的检索,虽然 Elasticsearch 内部还是一条一条去检索,但是这样可以避免多次请求造成的单独网络开销,相对于一个一个的检索,这样的效率更高。
    之前项目处理是一条一条去检索,后来改造为批处理后,单处理差不多优化了10s的效率左右,测试数据量大概在2w左右

    java实现

    es官方文档

    相比单处理,我们批处理肯定是要先获取 单个 SearchRequest, 然后再装入一个请求中类似list中,然后发一次请求

    获取单个请求

    public SearchRequest getQuery(Drug drug, Boolean specFlag) {
    
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    
    
            BoolQueryBuilder builder = QueryBuilders.boolQuery();
            BoolQueryBuilder nameMatch = QueryBuilders.boolQuery().minimumShouldMatch(1)
                    .should(QueryBuilders.matchQuery("drugName",drug.getDrugName()))
                    .should(QueryBuilders.matchQuery("productName",drug.getDrugName()));
    
    
    
            BoolQueryBuilder must = QueryBuilders.boolQuery().minimumShouldMatch(2)
                    .should(nameMatch)
                    .should(QueryBuilders.matchQuery("companyName", drug.getCompany()))
                    .should(QueryBuilders.matchQuery("approvalIndex", drug.getApproval()));
    
            builder.must(must);
            if (specFlag) {
                BoolQueryBuilder specMatch = QueryBuilders.boolQuery().minimumShouldMatch(1)
                        .should(QueryBuilders.matchQuery("specIndex",drug.getSpec()))
                        .should(QueryBuilders.matchQuery("otherSpec",drug.getSpec()));
                builder.must(specMatch);
                builder.should(QueryBuilders.termQuery("specIndex.full", drug.getSpec()))
                        .should(QueryBuilders.termQuery("otherSpec.full", drug.getSpec()));
    
            }
            // 分页只要第一条查询结果
            searchSourceBuilder.query(builder).from(0).size(1);
    
    
            SearchRequest firstSearchRequest = new SearchRequest();
            firstSearchRequest.source(searchSourceBuilder);
    
            return firstSearchRequest;
    
        }
    

    构造批处理请求

    List<SearchRequest> searchRequests = Lists.newArrayListWithExpectedSize(sources.size());
    // getQuery 为上面方法
    SearchRequest query = clearSearch.getQuery(drug, false);
                searchRequests.add(query);
    

    发送请求获取查询结果

    
    @Autowired
    ElasticsearchRestTemplate restTemplate;
    
     public List<DscStandardProduct> clearProduct(List<SearchRequest> searchRequests) {
    
            List<DscStandardProduct> products = new ArrayList<>();
            MultiSearchRequest request = new MultiSearchRequest();
            // 添加批量查询
            for (SearchRequest searchRequest : searchRequests) {
                request.add(searchRequest);
            }
    
            try {
                MultiSearchResponse multiResponse = restTemplate.getClient().msearch(request, RequestOptions.DEFAULT);
                for (MultiSearchResponse.Item item : multiResponse.getResponses()) {
                    SearchHits hits = item.getResponse().getHits();
    
                    if (CollectionUtil.isEmpty(hits)) {
                        products.add(null);
                        continue;
                    }
                    for (SearchHit hit : hits) {
                        String sourceAsString = hit.getSourceAsString();
                        DscStandardProduct product = JSONObject.parseObject(sourceAsString, DscStandardProduct.class);
                        products.add(product);
                    }
    
                }
    
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            return products;
    
        }
    
    展开全文
  • 片文章介绍了一个Java批量添加数据,多个字段同时添加多条数据具体实例,面向的是Oracle数据库,需要的朋友可以参考下
  • 1.批量插入 mapper int insertBrandBusinessByExcel(List<Label> list); .xml <!--批量插入--> <insert id="insertBrandBusinessByExcel" parameterType="com.mj.linen.pojo.label.Labe...

    随笔记录。亲测可用

    1.批量插入

    mapper

    int insertBrandBusinessByExcel(List<Label> list);

    .xml

      <!--批量插入-->
      <insert id="insertBrandBusinessByExcel" parameterType="com.mj.linen.pojo.label.Label">
          insert into tb_label (ecp,pid,ehco)<!--对应字段-->
          values 
          <foreach collection="list" separator="," item="label"><!--循环插入,item:别名-->
             (#{label.ecp,jdbcType=VARCHAR},#{label.pid,jdbcType=INTEGER},#{label.ehco,jdbcType=VARCHAR})
          </foreach>
      </insert>

    controller:

    /**
    	 * 批量入库
    	 * @param list
    	 * @param pid
    	 * @return
    	 */
    	@PostMapping("/insertAll")//@RequestParam 不写会报List错误
    	public Object insertLabel(@RequestParam("list")List<Label> list,String ehco,int pid,String user){

    postman:

    批量插入图片

    相应事物层控制层就不写了都是相应的调用(我是测试),或处理下逻辑。

    2.批量更新1

    mapper

    int batchUpdateLabelDTO(List<Label> list);

    .xml

    <!--批量更新(回收)-->
      <update id="batchUpdateLabelDTO" parameterType="java.util.List">
           <foreach collection="list" separator=";" item="label">
             update tb_label
             <set> 
                state = #{label.state,jdbcType=INTEGER},
                hid = #{label.hid,jdbcType=INTEGER},
                frequency = #{label.frequency,jdbcType=INTEGER}
             </set>
             <where> 
                id = #{label.id,jdbcType=INTEGER}
             </where> 
          </foreach>
      </update>

    controller:

    /**
    	 * 批量更新
    	 * @param list
    	 * @param
    	 * @return
    	 */
    	@PostMapping("/CascadeUpdate")
    	public Object batchUpdateLabelDTO(@RequestBody List<Label> list){

    postman:

    批量更新图

    批量更新2

    mapper

    int  batchUpdateResponsiblePersonnel(String responsiblepersonnelid);

    .xml

     <update id="batchUpdateResponsiblePersonnel" parameterType="java.lang.String">
            update responsiblepersonnel set DataState='5' where ResponsiblePersonnelId IN
            <foreach collection="responsiblepersonnelid.split(',')" item="item" open="(" separator="," close=")">
               '${item}'
            </foreach>
        </update>

    controller:

    @PutMapping("/ResponsiblePerson/BatchDeleteResponsible")
        @ApiOperation(value = "批量更新", notes="")
        @ApiImplicitParams({
                @ApiImplicitParam(name = "responsiblepersonnelid", value = "String数组逗号隔开 ", required = true, paramType = "query", dataType = "String"),
        })
        public Map updateDelResponsiblePersonnelById(String responsiblepersonnelid){

    postman:

    批量更新图2

    批量更新3

    mapper

     int updateUserPerformance(List<TUserPerformance> list);

    xml

    <update id="updateUserPerformance" parameterType="com.hy.modules.hy.entity.TUserPerformance">
    		update t_user_performance
    		<trim prefix="set" suffixOverrides=",">
    			<trim prefix="percentage=case" suffix="end,">
    				<foreach collection="list" item="item" index="index">
    					<if test="item.percentage!=null">
    						when user_id=#{item.userId} then #{item.percentage}
    					</if>
    				</foreach>
    			</trim>
    			<trim prefix="money =case" suffix="end,">
    				<foreach collection="list" item="item" index="index">
    					<if test="item.money!=null">
    						when user_id=#{item.userId} then #{item.money}
    					</if>
    				</foreach>
    			</trim>
    		</trim>
    		where
    		performance_details_id=#{list[0].performanceDetailsId} and user_id in (
    			<foreach collection="list" separator="," item="item" index="index">
    				#{item.userId}
    			</foreach>
    		)
    	</update>

    解释:如果 user_id= 1 then 1  user_id= 2 then 2 (执行了三条数据更改 所以有三个when)自行理会。

    上述执行SQL为 (1,2,3 为了演示而标注 ):

    update t_user_performance 
    set 
      percentage=case when user_id=? then 1 
    				  when user_id=? then 2
    				  when user_id=? then 3 end,
     money =case when user_id=? then ?
                 when user_id=? then ?
                 when user_id=? then ? end
     where 
         performance_details_id=? and user_id in ( ? , ? , ? ) 

    3.批量查询

    mapper

    List<LabelDTO> selectLabelDTO(List<String> list);

    .xml

      <select id="selectLabelDTO"  parameterType="java.util.List" resultMap="lable_variety_BaseResultMap">
         SELECT l.id,l.ecp,l.pid,l.frequency,l.ehco,l.state,l.hid,l.gross,l.employ,l.unused,l.account_balance,
          l.total_cost,l.created,l.updated,l.delivery_time,
          v.id v_id,v.variety_name,v.category_id,v.grade_id,v.image,v.specification,v.rental_price,v.occupancy_expenses,
         v.frequency v_frequency,v.echo,v.created v_created,v.updated v_updated
         FROM tb_label l LEFT JOIN tb_variety v ON v.id = l.pid
          WHERE l.ecp in
          <foreach collection="list" item="label" open="(" close=")" separator=",">
              #{label}<!--数组类型为对象时可调用多个字段,我的类型只是是字符串,所以没调用,像:#{label.id}-->
          </foreach>
      </select>

    查询和同样上两个同样。

     

    记录,方便以后查阅。

    展开全文
  • 主要为大家详细介绍了java实现批量生成二维码的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • Java Redis Template批量查询指定键值对

    千次阅读 2019-07-23 17:10:05
    一.Redis使用pipeline批量查询所有键值对 一次性获取所有键值对的方式: private RedisTemplate redisTemplate; @SuppressWarnings({ "rawtypes", "unchecked" }) public List executePipelined(Collection&...

    一.Redis使用pipeline批量查询所有键值对

    一次性获取所有键值对的方式:

    private RedisTemplate redisTemplate;
    
    @SuppressWarnings({ "rawtypes", "unchecked" })
    	public List executePipelined(Collection<String> keySet) {
    		return redisTemplate.executePipelined(new SessionCallback<Object>() {
    			@Override
    			public <K, V> Object execute(RedisOperations<K, V> operations) throws DataAccessException {
    				HashOperations hashOperations = operations.opsForHash();
    				for (String key : keySet) {
    					hashOperations.entries(key);
    				}
    				return null;
    			}
    		});
    	}
    

    说明: 上面的方法,可以将多个Redis 哈希表一次性取出,只有一次IO的时间。但也有个缺点,当哈希表中有个键值对中的内容特别长的时候,效率明显下降。如果我们根本不需要这个键值对,但每次都要将它取出,会大大浪费性能,解决方案就是第二种方式。

    二.批量获取指定的键值对列表

    /**
    	 * 获取批量keys对应的列表中,指定的hash键值对列表
    	 * @param keys redis 键
    	 * @param hashKeys 哈希表键的集合(你需要获取的那些键)
    	 * @return
    	 */
    	@SuppressWarnings("unchecked")
    	public List<Map<String, String>> getSelectiveHashsList(List<String> keys, List<String> hashKeys) {
    		List<Map<String, String>> hashList = new ArrayList<Map<String, String>>();
    		List<List<String>> pipelinedList = redisTemplate.executePipelined(new RedisCallback<Object>() {
    			@Override
    			public Object doInRedis(RedisConnection connection) throws DataAccessException {
    				StringRedisConnection stringRedisConnection = (StringRedisConnection) connection;
    				for (String key : keys) {
    					stringRedisConnection.hMGet(key, hashKeys.toArray(new String[hashKeys.size()]));
    				}
    				return null;
    			}
    
    		});
    		for (List<String> hashValueList : pipelinedList) {
    			Map<String, String> map = new LinkedHashMap<String, String>();
    			for (int i = 0; i < hashValueList.size(); i++) {
    				map.put(hashKeys.get(i), hashValueList.get(i));
    			}
    			hashList.add(map);
    		}
    		return hashList;
    	}
    

    使用示例:
    可以批量取出你想要的人物属性:

    调用上述方法示例:

    "tom","jack"是你想要操作的表;"name","age"是你想要获取的属性,想要几个属性,写几个,提升请求速度。

    getSelectiveHashsList(Arrays.asList("tom","jack"),Arrays.asList("name","age"));
    
    展开全文
  • java批量执行SQL

    热门讨论 2009-04-04 07:32:28
    java批量执行SQL java批量执行SQL.txt
  • java批量图片上传

    2016-08-23 08:44:06
    oracle,java,图片批量上传
  • java批量删除

    2016-03-22 11:17:04
    界面批量删除
  • java多线程实现大批量数据切分成指定份数的数据,然后多线程处理入库或者导出,线程的个数和每份数据的数量都可以控制
  • 主要介绍了Java快速批量移动文件的实现方法,需要的朋友可以参考下
  • 主要介绍了Java实现批量向mysql写入数据的方法,涉及java基于JDBC连接mysql数据库及写入数据的相关操作技巧,非常简单实用,需要的朋友可以参考下
  • 主要为大家详细介绍了java实现批量下载、将多文件打包成zip格式下载,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 主要为大家详细介绍了java后台批量下载文件并压缩成zip下载的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 主要为大家详细介绍了java线程池实现批量下载文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • java批量读取Excel表格

    2016-08-10 14:14:47
    用于批量读取excel表格。工作写时非常好用。2003-2010都支持。
  • 批量执行post请求,post参数读取本地txt文件,请求后,获取结果,生成相应的结果txt,与基础数据作对比。
  • java 批量打印工具

    千次阅读 2018-08-16 20:56:00
    本来觉得应该是很简单的事,想想下载一个批量打印工具就搞定了啊,网络上找啊找,要么是病毒,要么是没给钱,有打印限制(一次10张),我晕,这玩意这么简单的事,想想就伤,整天大数据,人工智能的吹着,这TMD的...

    从3d软件里面导出很一张cad总图,然后在总图里面分选各个分部,弄出几十张pdf文件。需要打印出来。

    本来觉得应该是很简单的事,想想下载一个批量打印工具就搞定了啊,网络上找啊找,要么是病毒,要么是没给钱,有打印限制(一次10张),我晕,这玩意这么简单的事,想想就伤,整天大数据,人工智能的吹着,这TMD的批量打印点文件还这么折腾。

    必须弄一个,查资料,先想肯定是c++这东东好弄吧,但这玩意ui是个事,弄成web的吧,感觉又不太好,毕竟是客户端程序,那跨平台的感觉QT应该可以,代码量是少,QT得先把pdf转成图片,然后才能调用打印机,绕。

    本人java出生,又仔细看了看java的打印代码,网上的代码就别提有多伤了,弄下来要么依赖windows组件,要么运行不了。

    无赖,不能直接copy,那就只能自己撸。

    经查,pdfbox带打印功能,https://pdfbox.apache.org/ ,这货也是醉了,官方网页里面没有maven的配置 。

    maven 配置地址: http://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox ,我使用的是2.0.11版本。

    核心代码很少,很简单:

    public class PrintWork {
        public static PDDocument document;
        public static void print(File file) throws IOException, PrinterException {
                PDDocument document = PDDocument.load(file);
                print(document);
                document.close();
        }
        private static void print(PDDocument document) throws IOException, PrinterException
        {
            PrinterJob job = PrinterJob.getPrinterJob();
            job.setPageable(new PDFPageable(document));
            job.print();
        }
    }

    这还是官方文档里面的example。

    经过测试没有问题,多个文档打印也没问题,直接循环调用 print 方法即可:

    for (int i = 0; i < total; i++) {
                if (this.workStatus == false) {
                    break;
                }
                try {
                    item = this.printList.get(i);
                    if (item.printStatus == PrintItem.PrintStatus.PRINTED_SUCCESS) {
                        continue;
                    }
                    PrintWork.print(item.file);//这里传入文件对象
                    item.printStatus = PrintItem.PrintStatus.PRINTED_SUCCESS;
                    this.tableModel.fireTableDataChanged();
                } catch (IOException ex) {
                    Logger.getLogger(MainJFrame.class.getName()).log(Level.SEVERE, null, ex);
                    item.printStatus = PrintItem.PrintStatus.PRINTED_ERROR;
                } catch (PrinterException ex) {
                    Logger.getLogger(MainJFrame.class.getName()).log(Level.SEVERE, null, ex);
                    item.printStatus = PrintItem.PrintStatus.PRINTED_ERROR;
                }
                this.tableModel.fireTableDataChanged();
    }

    从表现上看,for循环提交的文档,pdfwork会合并成一个文件给打印机,因为打印机队列里面只有一个文件,而且java程序关闭后,打印不会停止。

    加点UI:

     

    最后是重点,源码,欢迎大家撸,程序使用maven管理, netbean开发ui,eclipse再修正一下,主要是netbeans里面ui自动生成的代码不让更改。

    源码 :https://gitee.com/asdtiang/batch-printing

    java运行包:https://gitee.com/asdtiang/batch-printing/repository/archive/master.zip 

     

    转载于:https://my.oschina.net/asdtiang/blog/1929206

    展开全文
  • 批量打印(java

    2016-12-16 16:29:11
    web批量打印。详细说明见博客地址:https://my.oschina.net/u/266034/blog/807252
  • Java实现快速的批量插入数据

    千次阅读 2020-12-23 16:03:48
    Java开发中,不论是导入Excel还是单纯的批量插入数据,都绕不开insert into这个话题。不同的是导入Excel有两个重要环节,一是解析Excel,二是插入数据。在之前的文章中已经实现,今天我们来实现一个单纯的批量插入...
  • 批量查询IP归属地

    2018-09-29 10:49:52
    java开发的小工具,可以批量查询IP地址的归属地信息。
  • 主要介绍了Java OSS批量下载并压缩为ZIP代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 背景:由于之前程序是将图片以16进制数的形式直接保存到数据库的。现需要将图片批量导出所以写了下面的简易代码,供大家学习交流使用。 目的:将mssql数据库中类型为image的图片信息,导出到文件(*.jpg)
  • Java 批量处理工具

    2014-12-01 09:14:11
    批量工具主要实现批量文件移动、批量重命名和批量解压ZIP文件
  • java批量删除列表内容

    2014-07-30 11:16:27
    java实现列表中内容的批量删除,绝对是网页中的实用
  • JAVA批量下载图片

    2015-08-21 16:42:31
    用来下载CSDN论坛图片的小DEMO,如果有其他的网络图片,也可以批量下载
  • 本篇文章主要介绍了Java使用Pipeline对Redis批量读写(hmset&hgetall),具有一定的参考价值,有兴趣的可以了解一下。
  • 本篇文章主要介绍了JAVA SFTP文件上传、下载及批量下载实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
  • java实现文件批量上传

    2015-01-05 10:38:19
    java使用swf+ext实现文件批量上传,直接导入Eclipse就可以使用。
  • //mysql连接 rewriteBatchedStatements=true打开批量写入 public static Connection getConn() throws SQLException { String userName="root"; String password="123"; String url="jdbc:mysql:

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 224,991
精华内容 89,996
关键字:

java批量查询

java 订阅