@Service

public class ElasticsearchServiceImpl implements ElasticsearchService {

/**

* 锁标记

*/

private static final Object obj = new Object();

/**

* TransportClient连接

*/

@Autowired

private TransportClient getTransportClient;

/**

* 通过索引id查询

* @param index

* @param type

* @param id

* @return

*/

@Override

public ElasticSearchList getIndex(String index, String type, String id) {

ElasticSearchList result = new ElasticSearchList();

try {

JSONArray jsonArray = new JSONArray();

SearchRequestBuilder searchRequestBuilder = getTransportClient.prepareSearch(index).setTypes(type);

searchRequestBuilder.setQuery(QueryBuilders.idsQuery().addIds(id));

SearchResponse searchResponse = searchRequestBuilder.setExplain(true).execute().actionGet();

SearchHits searchHits = searchResponse.getHits();

for (SearchHit searchHit : searchHits) {

Map<String, Object> source = searchHit.getSourceAsMap();

jsonArray.add(JSONObject.parseObject(JSON.toJSONString(source)));

}

JSONObject jsonObject = ElasticSearchUtil.handleAggregations(searchResponse.getAggregations());

result.setList(jsonArray);

result.setAggregation(jsonObject);

} catch (Exception e) {

throw new ApiElasticSearchException("【查询索引异常】查询索引异常,失败原因:" + e.getMessage());

}

return result;

}

/**

* 通过queryBuilder查询

*

* @param index

* @param type

* @param queryBuilder

* @return

*/

@Override

public ElasticSearchList getIndex(String index, String type, QueryBuilder queryBuilder) {

ElasticSearchList result = new ElasticSearchList();

try {

JSONArray jsonArray = new JSONArray();

SearchRequestBuilder searchRequestBuilder = getTransportClient.prepareSearch(index).setTypes(type);

if (null != queryBuilder) {

searchRequestBuilder.setQuery(queryBuilder);

}

SearchResponse searchResponse = searchRequestBuilder.setExplain(true).execute().actionGet();

SearchHits searchHits = searchResponse.getHits();

for (SearchHit searchHit : searchHits) {

Map<String, Object> source = searchHit.getSourceAsMap();

jsonArray.add(JSONObject.parseObject(JSON.toJSONString(source)));

}

result.setList(jsonArray);

} catch (Exception e) {

throw new ApiElasticSearchException("【查询索引】" + e.getMessage());

}

return result;

}

/**

* 通过queryBuilder+SortBuilder查询

*

* @param index

* @param type

* @param queryBuilder

* @param sortBuilderList

* @return

*/

@Override

public ElasticSearchList getIndex(String index, String type, QueryBuilder queryBuilder, List<SortBuilder<?>> sortBuilderList) {

ElasticSearchList result = new ElasticSearchList();

try {

JSONArray jsonArray = new JSONArray();

SearchRequestBuilder searchRequestBuilder = getTransportClient.prepareSearch(index).setTypes(type);

if (null != queryBuilder) {

searchRequestBuilder.setQuery(queryBuilder);

}

if (null != sortBuilderList) {

for (SortBuilder<?> sortBuilder : sortBuilderList) {

searchRequestBuilder.addSort(sortBuilder);

}

}

SearchResponse searchResponse = searchRequestBuilder.setExplain(true).execute().actionGet();

SearchHits searchHits = searchResponse.getHits();

for (SearchHit searchHit : searchHits) {

Map<String, Object> source = searchHit.getSourceAsMap();

jsonArray.add(JSONObject.parseObject(JSON.toJSONString(source)));

}

result.setList(jsonArray);

} catch (Exception e) {

throw new ApiElasticSearchException("【查询索引】" + e.getMessage());

}

return result;

}

/**

* 通过queryBuilder+SortBuilder+highlightBuilder查询

*

* @param index

* @param type

* @param queryBuilder

* @param sortBuilderList

* @param highlightBuilder

* @return

*/

@Override

public ElasticSearchList getIndex(String index, String type, QueryBuilder queryBuilder, List<SortBuilder<?>> sortBuilderList, HighlightBuilder highlightBuilder) {

ElasticSearchList result = new ElasticSearchList();

try {

SearchRequestBuilder searchRequestBuilder = getTransportClient.prepareSearch(index).setTypes(type);

if (null != queryBuilder) {

searchRequestBuilder.setQuery(queryBuilder);

}

if (null != sortBuilderList) {

for (SortBuilder<?> sortBuilder : sortBuilderList) {

searchRequestBuilder.addSort(sortBuilder);

}

}

if (null != highlightBuilder) {

searchRequestBuilder.highlighter(highlightBuilder);

}

SearchResponse searchResponse = searchRequestBuilder.setExplain(true).execute().actionGet();

// 处理高亮

result.setList(ElasticSearchUtil.handleHighlight(searchResponse.getHits()));

} catch (Exception e) {

throw new ApiElasticSearchException("【查询索引】" + e.getMessage());

}

return result;

}

/**

* 通过queryBuilder+SortBuilder+highlightBuilder+AggregationBuilder查询

*

* @param index

* @param type

* @param queryBuilder

* @param sortBuilderList

* @param highlightBuilder

* @param aggregationBuilderList

* @return

*/

@Override

public ElasticSearchList getIndex(String index, String type, QueryBuilder queryBuilder, List<SortBuilder<?>> sortBuilderList, HighlightBuilder highlightBuilder, List aggregationBuilderList) {

ElasticSearchList result = new ElasticSearchList();

try {

SearchRequestBuilder searchRequestBuilder = getTransportClient.prepareSearch(index).setTypes(type);

if (null != queryBuilder) {

searchRequestBuilder.setQuery(queryBuilder);

}

if (null != sortBuilderList) {

for (SortBuilder<?> sortBuilder : sortBuilderList) {

searchRequestBuilder.addSort(sortBuilder);

}

}

if (null != highlightBuilder) {

searchRequestBuilder.highlighter(highlightBuilder);

}

if (null != aggregationBuilderList) {

for (AggregationBuilder aggregationBuilder : aggregationBuilderList) {

searchRequestBuilder.addAggregation(aggregationBuilder);

}

}

SearchResponse searchResponse = searchRequestBuilder.setExplain(true).execute().actionGet();

// 处理高亮

result.setList(ElasticSearchUtil.handleHighlight(searchResponse.getHits()));

// 处理聚合

result.setAggregation(ElasticSearchUtil.handleAggregations(searchResponse.getAggregations()));

} catch (Exception e) {

throw new ApiElasticSearchException("【查询索引】" + e.getMessage());

}

return result;

}

/**

* 通过queryBuilder分页查询

*

* @param index

* @param type

* @param queryBuilder

* @param pageNo

* @param pageSize

* @return

*/

@Override

public ElasticSearchPage getIndex(String index, String type, QueryBuilder queryBuilder, int pageNo, int pageSize) {

ElasticSearchPage result = new ElasticSearchPage();

try {

SearchRequestBuilder searchRequestBuilder = getTransportClient.prepareSearch(index).setTypes(type);

if (null != queryBuilder) {

searchRequestBuilder.setQuery(queryBuilder);

}

SearchResponse searchResponse = searchRequestBuilder.setFrom((pageNo - 1) * pageSize).setSize(pageSize).setExplain(true).execute().actionGet();

result = new ElasticSearchPage(searchResponse.getHits(), pageNo, pageSize);

} catch (Exception e) {

throw new ApiElasticSearchException("【分页查询索引】" + e.getMessage());

}

return result;

}

/**

* 通过queryBuilder+SortBuilder分页查询

*

* @param index

* @param type

* @param queryBuilder

* @param sortBuilderList

* @param pageNo

* @param pageSize

* @return

*/

@Override

public ElasticSearchPage getIndex(String index, String type, QueryBuilder queryBuilder, List<SortBuilder<?>> sortBuilderList, int pageNo, int pageSize) {

ElasticSearchPage result = new ElasticSearchPage();

try {

SearchRequestBuilder searchRequestBuilder = getTransportClient.prepareSearch(index).setTypes(type);

if (null != queryBuilder) {

searchRequestBuilder.setQuery(queryBuilder);

}

if (null != sortBuilderList) {

for (SortBuilder<?> sortBuilder : sortBuilderList) {

searchRequestBuilder.addSort(sortBuilder);

}

}

SearchResponse searchResponse = searchRequestBuilder.setFrom((pageNo - 1) * pageSize).setSize(pageSize).setExplain(true).execute().actionGet();

result = new ElasticSearchPage(searchResponse.getHits(), pageNo, pageSize);

} catch (Exception e) {

throw new ApiElasticSearchException("【分页查询索引】" + e.getMessage());

}

return result;

}

/**

* 通过queryBuilder+SortBuilder+highlightBuilder分页查询

*

* @param index

* @param type

* @param queryBuilder

* @param sortBuilderList

* @param highlightBuilder

* @param pageNo

* @param pageSize

* @return

*/

@Override

public ElasticSearchPage getIndex(String index, String type, QueryBuilder queryBuilder, List<SortBuilder<?>> sortBuilderList, HighlightBuilder highlightBuilder, int pageNo, int pageSize) {

ElasticSearchPage result = new ElasticSearchPage();

try {

SearchRequestBuilder searchRequestBuilder = getTransportClient.prepareSearch(index).setTypes(type);

if (null != queryBuilder) {

searchRequestBuilder.setQuery(queryBuilder);

}

if (null != sortBuilderList) {

for (SortBuilder<?> sortBuilder : sortBuilderList) {

searchRequestBuilder.addSort(sortBuilder);

}

}

if (null != highlightBuilder) {

searchRequestBuilder.highlighter(highlightBuilder);

}

SearchResponse searchResponse = searchRequestBuilder.setFrom((pageNo - 1) * pageSize).setSize(pageSize).setExplain(true).execute().actionGet();

result = new ElasticSearchPage(searchResponse.getHits(), pageNo, pageSize);

// 处理高亮

result.setList(ElasticSearchUtil.handleHighlight(searchResponse.getHits()));

} catch (Exception e) {

throw new ApiElasticSearchException("【分页查询索引】" + e.getMessage());

}

return result;

}

/**

* 通过queryBuilder+SortBuilder+highlightBuilder+AggregationBuilder分页查询

*

* @param index

* @param type

* @param queryBuilder

* @param sortBuilderList

* @param highlightBuilder

* @param aggregationBuilderList

* @param pageNo

* @param pageSize

* @return

*/

@Override

public ElasticSearchPage getIndex(String index, String type, QueryBuilder queryBuilder, List<SortBuilder<?>> sortBuilderList, HighlightBuilder highlightBuilder, List aggregationBuilderList, int pageNo, int pageSize) {

ElasticSearchPage result = new ElasticSearchPage();

try {

SearchRequestBuilder searchRequestBuilder = getTransportClient.prepareSearch(index).setTypes(type);

if (null != queryBuilder) {

searchRequestBuilder.setQuery(queryBuilder);

}

if (null != sortBuilderList) {

for (SortBuilder<?> sortBuilder : sortBuilderList) {

searchRequestBuilder.addSort(sortBuilder);

}

}

if (null != highlightBuilder) {

searchRequestBuilder.highlighter(highlightBuilder);

}

if (null != aggregationBuilderList) {

for (AggregationBuilder aggregationBuilder : aggregationBuilderList) {

searchRequestBuilder.addAggregation(aggregationBuilder);

}

}

SearchResponse searchResponse = searchRequestBuilder.setFrom((pageNo - 1) * pageSize).setSize(pageSize).setExplain(true).execute().actionGet();

result = new ElasticSearchPage(searchResponse.getHits(), pageNo, pageSize);

// 处理高亮

result.setList(ElasticSearchUtil.handleHighlight(searchResponse.getHits()));

// 处理聚合

result.setAggregation(ElasticSearchUtil.handleAggregations(searchResponse.getAggregations()));

} catch (Exception e) {

throw new ApiElasticSearchException("【分页查询索引】" + e.getMessage());

}

return result;

}

@Override

public boolean createIndex(String index, String type, String id, T vo){

synchronized (obj) {

try {

XContentBuilder xContentBuilder = jsonBuilder();

if (null != vo) {

xContentBuilder = ElasticSearchUtil.ObjectToJXContentBuilder(xContentBuilder, vo);

}

IndexRequestBuilder indexRequestBuilder = getTransportClient.prepareIndex(index, type, id).setSource(xContentBuilder);

IndexResponse indexResponse = indexRequestBuilder.get();

if (Constants.ELASTICSEARCH_SUCCESS.equals(indexResponse.status())) {

return true;

}

} catch (Exception e) {

throw new ApiElasticSearchException("【创建索引】创建索引失败,失败原因:"+e.getMessage());

}

return true;

}

}

@Override

public boolean createIndex(String index, String type, List ids, List<? extends T> list) {

synchronized (obj) {

try {

if (null != ids && null != list && ids.size() == list.size()) {

BulkRequestBuilder bulkRequestBuilder = getTransportClient.prepareBulk();

for (int i = 0; i < ids.size(); i++) {

XContentBuilder xContentBuilder = ElasticSearchUtil.ObjectToJXContentBuilder(jsonBuilder(), list.get(i));

IndexRequestBuilder indexRequestBuilder = getTransportClient.prepareIndex(index, type, ids.get(i)).setSource(xContentBuilder);

bulkRequestBuilder.add(indexRequestBuilder);

}

BulkResponse bulkResponse = bulkRequestBuilder.execute().actionGet();

if (bulkResponse.hasFailures()) {

throw new ApiElasticSearchException("【批量创建索引】量创建索引失败,失败原因:" + bulkResponse.buildFailureMessage());

} else {

if (Constants.ELASTICSEARCH_SUCCESS.equals(bulkResponse.status())) {

return true;

}

}

} else {

throw new ApiElasticSearchException("【批量创建索引】创建索引失败,createIndex传入的ids与list参数必须对应一致。");

}

} catch (Exception e) {

throw new ApiElasticSearchException("【批量创建索引】量创建索引失败,失败原因:" + e.getMessage());

}

return false;

}

}

@Override

public boolean modifyIndex(String index, String type, String id, T vo) {

synchronized (obj) {

try {

XContentBuilder xContentBuilder = jsonBuilder();

if (null != vo) {

xContentBuilder = ElasticSearchUtil.ObjectToJXContentBuilder(xContentBuilder, vo);

}

UpdateRequestBuilder updateRequestBuilder = getTransportClient.prepareUpdate(index, type, id).setDoc(xContentBuilder);

UpdateResponse updateResponse = updateRequestBuilder.execute().actionGet();

if (Constants.ELASTICSEARCH_SUCCESS.equals(updateResponse.status())) {

return true;

}

} catch (Exception e) {

throw new ApiElasticSearchException("【更新索引】更新索引失败,失败原因:" + e.getMessage());

}

return false;

}

}

@Override

public boolean modifyIndex(String index, String type, List ids, List<? extends T> list) {

synchronized (obj) {

try {

if (null != ids && null != list && ids.size() == list.size()) {

BulkRequestBuilder bulkRequestBuilder = getTransportClient.prepareBulk();

for (int i = 0; i < ids.size(); i++) {

XContentBuilder xContentBuilder = xContentBuilder = ElasticSearchUtil.ObjectToJXContentBuilder(jsonBuilder(), list.get(i));

UpdateRequestBuilder updateRequestBuilder = getTransportClient.prepareUpdate(index, type, ids.get(i)).setDoc(xContentBuilder);

bulkRequestBuilder.add(updateRequestBuilder);

}

BulkResponse bulkResponse = bulkRequestBuilder.execute().actionGet();

if (bulkResponse.hasFailures()) {

throw new ApiElasticSearchException("【批量更新索引】批量创建索引失败,失败原因::" + bulkResponse.buildFailureMessage());

} else {

if (Constants.ELASTICSEARCH_SUCCESS.equals(bulkResponse.status())) {

return true;

}

}

} else {

throw new ApiElasticSearchException("【批量更新索引】更新索引失败,updateIndex传入的ids与list参数必须对应一致。");

}

} catch (Exception e) {

throw new ApiElasticSearchException("【批量更新索引】" + e.getMessage());

}

return false;

}

}

@Override

public boolean removeIndex(String index, String type, String id) {

synchronized (obj) {

try {

DeleteRequestBuilder deleteRequestBuilder = getTransportClient.prepareDelete(index, type, id);

DeleteResponse deleteResponse = deleteRequestBuilder.execute().actionGet();

if (Constants.ELASTICSEARCH_SUCCESS.equals(deleteResponse.status())) {

return true;

}

} catch (Exception e) {

throw new ApiElasticSearchException("【删除索引】" + e.getMessage());

}

return false;

}

}

@Override

public boolean removeIndex(String index, String type, List ids) {

synchronized (obj) {

try {

BulkRequestBuilder bulkRequestBuilder = getTransportClient.prepareBulk();

if (null != ids) {

for (String id : ids) {

DeleteRequestBuilder deleteRequestBuilder = getTransportClient.prepareDelete(index, type, id);

bulkRequestBuilder.add(deleteRequestBuilder);

}

}

BulkResponse bulkResponse = bulkRequestBuilder.execute().actionGet();

if (bulkResponse.hasFailures()) {

throw new ApiElasticSearchException("【批量删除索引失败,失败原因:】" + bulkResponse.buildFailureMessage());

} else {

if (Constants.ELASTICSEARCH_SUCCESS.equals(bulkResponse.status())) {

return true;

}

}

} catch (Exception e) {

throw new ApiElasticSearchException("【批量删除索引】" + e.getMessage());

}

return false;

}

}

}

从代码里面,大家也可以看出泛型的作用是什么,这边我们统一抛出自定义api错误,将异常进行转型处理。还有最重要的一点是,我们在添加,修改,删除索引的时候采用了锁,这样就可以保证在并发情况下,不会造成数据错误。

3.上面可以很明显的看到,我们通过工具类来处理高亮和聚合,所有这边也给大家介绍一下工具类里面的实现,如下所示:

package com.infun.platform.es.util;

import com.alibaba.fastjson.JSON;

import com.alibaba.fastjson.JSONArray;

import com.alibaba.fastjson.JSONObject;

import com.infun.platform.es.constant.ElasticsearchConstant;

import com.infun.platform.model.entity.EsConfig;

import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;

import org.elasticsearch.client.transport.TransportClient;

import org.elasticsearch.common.text.Text;

import org.elasticsearch.common.xcontent.XContentBuilder;

import org.elasticsearch.common.xcontent.XContentFactory;

import org.elasticsearch.search.SearchHit;

import org.elasticsearch.search.SearchHits;

import org.elasticsearch.search.aggregations.Aggregation;

import org.elasticsearch.search.aggregations.Aggregations;

import org.elasticsearch.search.aggregations.bucket.range.Range;

import org.elasticsearch.search.aggregations.bucket.terms.Terms;

import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;

import org.elasticsearch.search.sort.SortBuilder;

import org.elasticsearch.search.sort.SortBuilders;

import org.elasticsearch.search.sort.SortOrder;

import java.io.IOException;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

/**

* ElasticSearch工具类

* @author linzhiqiang

*/

public class ElasticSearchUtil {

/**

* ES桶聚合数目(默认是10条,设为1000条)

*/

public final static int ES_BUCKETS_NUMBER = 1000;

/**

* 处理高亮

*

* @param searchHits

* @return

*/

public static JSONArray handleHighlight(SearchHits searchHits) {

JSONArray result = new JSONArray();

if (null != searchHits) {

for (SearchHit searchHit : searchHits) {

Map<String, Object> source = searchHit.getSourceAsMap();

// 获取高亮

Map<String, HighlightField> highlightMap = searchHit.getHighlightFields();

for (String key : highlightMap.keySet()) {

for (Text text : highlightMap.get(key).getFragments()) {

// 高亮字段,如name的高亮字段为nameHighlight

source.put(key + “Highlight”, text.toString());

}

}

result.add(JSONObject.parseObject(JSON.toJSONString(source)));

}

}

return result;

}

/**

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

* 处理聚合

*

* @param aggregations

* @return

*/

public static JSONObject handleAggregations(Aggregations aggregations) {

JSONObject result = new JSONObject();

if (null != aggregations) {

Map<String, Aggregation> aggregationMap = aggregations.asMap();

for (String aggregationKey : aggregationMap.keySet()) {

// 遍历聚合字段

Aggregation aggregation = aggregations.get(aggregationKey);

if (aggregation instanceof Terms) {

// term聚合

Terms terms = (Terms) aggregation;

if (null != terms && null != terms.getBuckets()) {

JSONArray bucketJsonArray = new JSONArray();

for (Terms.Bucket bucket : terms.getBuckets()) {

// 封装组合字段

JSONObject bucketJsonObject = new JSONObject();

bucketJsonObject.put(“key”, bucket.getKey());

bucketJsonObject.put(“docCount”, bucket.getDocCount());

bucketJsonArray.add(bucketJsonObject);

}

result.put(aggregationKey, bucketJsonArray);

} else {

result.put(aggregationKey, new JSONArray());

}

} else if (aggregation instanceof Range) {

// range、daterange聚合

Range range = (Range) aggregation;

if (null != range && null != range.getBuckets()) {

JSONArray bucketJsonArray = new JSONArray();

for (Range.Bucket bucket : range.getBuckets()) {

// 封装组合字段

JSONObject bucketJsonObject = new JSONObject();

bucketJsonObject.put(“key”, bucket.getKey());

bucketJsonObject.put(“docCount”, bucket.getDocCount());

bucketJsonObject.put(“from”, bucket.getFrom());

bucketJsonObject.put(“to”, bucket.getTo());

bucketJsonArray.add(bucketJsonObject);

}

result.put(aggregationKey, bucketJsonArray);

} else {

result.put(aggregationKey, new JSONArray());

}

}

}

}

return result;

}

/**

* 数据类型处理

* @param xContentBuilder

* @param object

* @return

* @throws IOException

*/

public static XContentBuilder ObjectToJXContentBuilder(XContentBuilder xContentBuilder, Object object) throws IOException {

// 数据类型格式处理

JSONObject jsonObject = JSONObject.parseObject(JSON.toJSONString(object));

// 判断是否为null

if (!jsonObject.isEmpty()) {

xContentBuilder.startObject();

for (Object keyObject : jsonObject.keySet()) {

// 设置值到content中

xContentBuilder.field(keyObject.toString(), jsonObject.get(keyObject));

}

xContentBuilder.endObject();

}

return xContentBuilder;

}

/**

* 创建索引与mapping模板

*

* @param index 索引字段

* @param type 类型

* @param client 客户端

* @throws IOException

elasticsearch实践之代码结构设计,java银行项目面试题相关推荐

  1. java 银行项目对于金额的面试题_2019年面试题小结

    最近大大小小面试了一些公司包括某软.某宝和其他小公司,结果都还令人满意,因此打算做一个小的总结,帮助一些同样面临跳槽或者找工作的同学抓住一些重点.就像期末考试,如果时间多,你确实需要尽可能吸收整本书的 ...

  2. java商城项目面试题,Java基础视频教程

    摘要 Apache Kafka是一个分布式消息发布订阅系统.它最初由LinkedIn公司基于独特的设计实现为一个分布式的提交日志系统( a distributed commit log),之后成为Ap ...

  3. java银行项目对于金额的面试题,华为java面试视频直播

    前言 微架构的出现,很好地适应了这个时代对快速发展变化的要求.它不再提倡一体化的项目设计,而是对项目进行有效的"业务区"(可以简单理解为不同的子系统〉划分,并利用合理的技术对业务性 ...

  4. 分析如下java代码片段,Java内部测试笔试题

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 while (pointer <= 10) { switch (pointer % 3) { case 1: pointer += 1; break ...

  5. 第一行Java代码,java高级面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  6. java qq项目_Java版QQ项目

    Java版QQ项目详细设计之:概述 2012-03-16 10:40 wangchangshuai0010 wangchangshuai0010的博客 前两天在博客上,发了一篇博文,概述了java q ...

  7. java web银行项目

    java web银行项目 一.项目简介 ​ 本项目是基于idea,后台实现的技术:jsp,servlet,前端开发技术:javascript.css.bootstrap本项目主要实现一个模拟ATM机存 ...

  8. java银行管理系统(MySql+JDBC+数据库(Druid数据库连接池)+GUI)重要代码有解析注释

    java银行管理系统 小白又来水博客了 文章目录 java银行管理系统 一.项目需求与分析: 二.知识及有关技术的概述: 三.银行管理系统需求的具体实现: 四.部分功能预览: 五.Last: 一.项目 ...

  9. 微软nni_实践空间站 | 为微软官方开源项目贡献代码,你准备好了吗?

    亟需一个契机重新驱动你在冬日沉睡的大脑? 2020 年春季学期微软学生俱乐部实践空间站项目正等待你大展身手! 实践空间站是微软学生俱乐部打造的全学年持续性活动,通过项目导师指导与自主创新结合的方式,帮 ...

最新文章

  1. C# ASP.Net 设置外网访问
  2. java不支持发行版本12_主要发行版本后Java开发人员应使用的15种工具
  3. Brainstorm-the walkthrough example: Image Classification
  4. 四合一图床HTML网站源码
  5. ubuntu上安装python3.7教程_Day1: 如何在ubuntu 18.04中升级python 3.6到3.7
  6. python学习课后练习题_python初步学习-练习题
  7. MVC面试问题与答案
  8. SAP License:2021年最新FICO面试答案
  9. 设计模式09_代理模式
  10. mybatis ${}使用注意事项
  11. [毕业生的商业软件开发之路]解决方案资源管理器
  12. 换IP软件用户如何选择?
  13. 站长屋VPS独家erphpdown10.2会员中心美化页面wordpress通用插件
  14. 基于Android studio开发的图灵智能聊天机器人
  15. 计算机视觉开篇---读史可以明智
  16. 修复下载后已发生损坏的压缩包(.rar)文件
  17. WEB安全 HTML基础
  18. BST中序遍历(Iterative)
  19. 监控里的主码流和子码流是什么意思
  20. Matlab代码区出现中文乱码的情况

热门文章

  1. 淘宝王琤:Taobao JVM的性能优势与价值体现
  2. 由点及面,一叶知秋------集合大家庭
  3. 非线性控制2.0——模糊逼近
  4. 《数值分析》-- The great 平方逼近
  5. 【GPU精粹与Shader编程】(四) 《GPU Gems 2》全书核心内容提炼总结 · 上篇
  6. 使用security和jwt进行安全登录
  7. 【Faiss】indexes 前(后)处理(五)
  8. HTML设置格式化时间
  9. python中mapping_python-学习-ORM中遇到的 mapping 详解并再总结字典dict
  10. 数据结构大作业——银行排队系统