elasticsearch实践之代码结构设计,java银行项目面试题
@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银行项目面试题相关推荐
- java 银行项目对于金额的面试题_2019年面试题小结
最近大大小小面试了一些公司包括某软.某宝和其他小公司,结果都还令人满意,因此打算做一个小的总结,帮助一些同样面临跳槽或者找工作的同学抓住一些重点.就像期末考试,如果时间多,你确实需要尽可能吸收整本书的 ...
- java商城项目面试题,Java基础视频教程
摘要 Apache Kafka是一个分布式消息发布订阅系统.它最初由LinkedIn公司基于独特的设计实现为一个分布式的提交日志系统( a distributed commit log),之后成为Ap ...
- java银行项目对于金额的面试题,华为java面试视频直播
前言 微架构的出现,很好地适应了这个时代对快速发展变化的要求.它不再提倡一体化的项目设计,而是对项目进行有效的"业务区"(可以简单理解为不同的子系统〉划分,并利用合理的技术对业务性 ...
- 分析如下java代码片段,Java内部测试笔试题
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 while (pointer <= 10) { switch (pointer % 3) { case 1: pointer += 1; break ...
- 第一行Java代码,java高级面试笔试题
我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...
- java qq项目_Java版QQ项目
Java版QQ项目详细设计之:概述 2012-03-16 10:40 wangchangshuai0010 wangchangshuai0010的博客 前两天在博客上,发了一篇博文,概述了java q ...
- java web银行项目
java web银行项目 一.项目简介 本项目是基于idea,后台实现的技术:jsp,servlet,前端开发技术:javascript.css.bootstrap本项目主要实现一个模拟ATM机存 ...
- java银行管理系统(MySql+JDBC+数据库(Druid数据库连接池)+GUI)重要代码有解析注释
java银行管理系统 小白又来水博客了 文章目录 java银行管理系统 一.项目需求与分析: 二.知识及有关技术的概述: 三.银行管理系统需求的具体实现: 四.部分功能预览: 五.Last: 一.项目 ...
- 微软nni_实践空间站 | 为微软官方开源项目贡献代码,你准备好了吗?
亟需一个契机重新驱动你在冬日沉睡的大脑? 2020 年春季学期微软学生俱乐部实践空间站项目正等待你大展身手! 实践空间站是微软学生俱乐部打造的全学年持续性活动,通过项目导师指导与自主创新结合的方式,帮 ...
最新文章
- C# ASP.Net 设置外网访问
- java不支持发行版本12_主要发行版本后Java开发人员应使用的15种工具
- Brainstorm-the walkthrough example: Image Classification
- 四合一图床HTML网站源码
- ubuntu上安装python3.7教程_Day1: 如何在ubuntu 18.04中升级python 3.6到3.7
- python学习课后练习题_python初步学习-练习题
- MVC面试问题与答案
- SAP License:2021年最新FICO面试答案
- 设计模式09_代理模式
- mybatis ${}使用注意事项
- [毕业生的商业软件开发之路]解决方案资源管理器
- 换IP软件用户如何选择?
- 站长屋VPS独家erphpdown10.2会员中心美化页面wordpress通用插件
- 基于Android studio开发的图灵智能聊天机器人
- 计算机视觉开篇---读史可以明智
- 修复下载后已发生损坏的压缩包(.rar)文件
- WEB安全 HTML基础
- BST中序遍历(Iterative)
- 监控里的主码流和子码流是什么意思
- Matlab代码区出现中文乱码的情况
热门文章
- 淘宝王琤:Taobao JVM的性能优势与价值体现
- 由点及面,一叶知秋------集合大家庭
- 非线性控制2.0——模糊逼近
- 《数值分析》-- The great 平方逼近
- 【GPU精粹与Shader编程】(四) 《GPU Gems 2》全书核心内容提炼总结 · 上篇
- 使用security和jwt进行安全登录
- 【Faiss】indexes 前(后)处理(五)
- HTML设置格式化时间
- python中mapping_python-学习-ORM中遇到的 mapping 详解并再总结字典dict
- 数据结构大作业——银行排队系统