亚马逊DynamoDB

介绍

  • Amazon DynamoDB是一项完全托管的NoSQL数据库服务,可提供无缝的可扩展性和快速可预测的性能。
  • Amazon DynamoDB自动将表的数据和流量分布在足够数量的服务器上,以处理客户指定的请求容量和存储的数据量,同时保持一致且快速的性能。
  • 所有数据项都存储在固态磁盘(SSD)上,并自动跨区域中的多个可用区复制,以提供内置的高可用性和数据持久性。
  • 您可以通过AWS管理控制台启动新的Amazon DynamoDB数据库表,在不停机或性能下降的情况下扩展或缩减对该表的请求容量,并获得对资源利用率和性能指标的可见性。
  • 借助Amazon DynamoDB,您可以将操作和扩展分布式数据库的管理负担转移到AWS,因此您不必担心硬件设置,设置和配置,复制,软件修补或集群扩展。
  • SDK: http : //aws.amazon.com/sdkforjava/

Amazon DynamoDB注释

  • @DynamoDBTable

标识Amazon DynamoDB中的目标表。 例如,以下Java代码段定义了一个类Developer,并将其映射到Amazon DynamoDB中的People表。

@DynamoDBTable(tableName="People")
public class Developer { ...}
  • @DynamoDBIgnore

向DynamoDBMapper实例指示应该忽略关联的属性。 将数据保存到表时,DynamoDBMapper不会将此属性保存到表中。

  • @DynamoDBAttribute

将属性映射到表属性。 默认情况下,每个类属性都映射到具有相同名称的item属性。 但是,如果名称不同,则可以使用此标记将属性映射到属性。 在以下Java代码段中,DynamoDBAttribute将BookAuthors属性映射到表中的Authors属性名称。

@DynamoDBAttribute(attributeName = "Authors")
public List<String> getBookAuthors() { return BookAuthors; }
public void setBookAuthors(List<String> BookAuthors) { this.BookAuthors = BookAuthors; }

将对象保存到表时,DynamoDBMapper使用作者作为属性名称。

  • @DynamoDBHashKey

将类属性映射到表的hash属性。 该属性必须是受支持的String或Numeric类型之一,并且不能是集合类型。

假设您有一个表ProductCatalog,该表具有ID作为主键。 以下Java代码段定义了CatalogItem类,并使用@DynamoDBHashKey标记将其id属性映射到ProductCatalog表的主键。

@DynamoDBTable(tableName="ProductCatalog")
public class CatalogItem {private String Id;   @DynamoDBHashKey(attributeName="Id")public String getId() {return Id;}public void setId(String Id) {this.Id = Id;}// Additional properties go here.
}
  • @DynamoDBRangeKey

将类属性映射到表的范围键属性。 如果主键是由哈希键和范围键属性组成的,则可以使用此标记将您的类字段映射到范围属性。 例如,假定您有一个“回复”表,其中存储有论坛主题的回复。 每个线程可以有很多回复。 因此,该表的主键是ThreadId和ReplyDateTime。 ThreadId是哈希属性,ReplyDateTime是范围属性。 以下Java代码段定义了Reply类,并将其映射到Reply表。 它同时使用@DynamoDBHashKey和@DynamoDBRangeKeytags来标识映射到主键的类属性。

@DynamoDBTable(tableName="Reply")
public class Reply {private String id;private String replyDateTime;@DynamoDBHashKey(attributeName="Id")public String getId() { return id; }public void setId(String id) { this.id = id; }@DynamoDBRangeKey(attributeName="ReplyDateTime")public String getReplyDateTime() { return replyDateTime; }public void setReplyDateTime(String replyDateTime) { this.replyDateTime = replyDateTime; }// Additional properties go here.
}
  • @DynamoDBAutoGeneratedKey

将哈希键或范围键属性标记为自动生成。 保存这些属性时,对象持久性模型将生成一个随机UUID。 只能将字符串属性标记为自动生成的键。

以下代码段演示了如何使用自动生成的密钥。

@DynamoDBTable(tableName="AutoGeneratedKeysExample")
public class AutoGeneratedKeys {private String id;private String payload;@DynamoDBHashKey(attributeName = "Id")@DynamoDBAutoGeneratedKeypublic String getId() { return id; }public void setId(String id) { this.id = id; }@DynamoDBAttribute(attributeName="payload")public String getPayload() { return this.payload };public String setPayload(String payload) { this.payload = payload };   public static void saveItem() {AutoGeneratedKeys obj = new AutoGeneratedKeys();obj.setPayload("abc123");// id field is null at this point       DynamoDBMapper mapper = new DynamoDBMapper(dynamoDBClient);mapper.save(obj);System.out.println("Object was saved with id " + obj.getId());}
}
  • @DynamoDBVersionAttribute

标识用于存储乐观锁定版本号的类属性。 DynamoDBMapper保存新项目时,会为此属性分配一个版本号,并在每次更新该项目时将其递增。 仅支持数字标量类型。

DynamoDBMapper类别

DynamoDBMapper类是Amazon DynamoDB的入口点。 它提供了与Amazon DynamoDB的连接,并使您能够访问各种表中的数据,对项目执行各种CRUD操作以及对表执行查询和扫描。 此类提供以下关键操作,供您使用Amazon DynamoDB。

    • 将指定的对象保存到表中。
mapper.save(obj, new DynamoDBMapperConfig(DynamoDBMapperConfig.SaveBehavior.CLOBBER));
  • 加载
    • 从表中检索项目。
CatalogItem item = mapper.load(CatalogItem.class, item.getId(),new DynamoDBMapperConfig(DynamoDBMapperConfig.ConsistentReads.CONSISTENT));
  • 删除
    • 从表中删除一个项目。
  • 询问
    • 启用表查询。
String forumName = "Amazon DynamoDB";
String forumSubject = "DynamoDB Thread 1";
String hashKey = forumName + "#" + forumSubject;long twoWeeksAgoMilli = (new Date()).getTime() - (14L*24L*60L*60L*1000L);
Date twoWeeksAgo = new Date();
twoWeeksAgo.setTime(twoWeeksAgoMilli);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
String twoWeeksAgoStr = df.format(twoWeeksAgo);Condition rangeKeyCondition = new Condition()
.withComparisonOperator(ComparisonOperator.GT.toString())
.withAttributeValueList(new AttributeValue().withS(twoWeeksAgoStr.toString()));Reply replyKey = new Reply();
replyKey.setId(hashKey);DynamoDBQueryExpression<Reply> queryExpression = new DynamoDBQueryExpression<Reply>()
.withHashKeyValues(replyKey)
.withRangeKeyCondition("ReplyDateTime", rangeKeyCondition);List<Reply> latestReplies = mapper.query(Reply.class, queryExpression);

该查询返回Reply对象的集合。

  • 扫描
    • 扫描整个表。
DynamoDBScanExpression scanExpression = new DynamoDBScanExpression();Map<String, Condition> scanFilter = new HashMap<String, Condition>();
Condition scanCondition = new Condition()
.withComparisonOperator(ComparisonOperator.EQ.toString())
.withAttributeValueList(new AttributeValue().withN("0"));scanFilter.put("Answered", scanCondition);scanExpression.setScanFilter(scanFilter);List<Thread> unansweredThreads = mapper.scan(Thread.class, scanExpression);
  • 扫描方法返回“延迟加载”集合。 它最初仅返回一页结果,然后在需要时对下一页进行服务调用。 要获取所有匹配项,您仅需要遍历unansweredThreads集合。
  • batchDelete
    • 使用对AmazonDynamoDB.batchWriteItem方法的一个或多个调用从一个或多个表中删除对象。
Book book1 = mapper.load(Book.class, 901);
Book book2 = mapper.load(Book.class, 902);
mapper.batchDelete(Arrays.asList(book1, book2));
  • batchSave
    • 使用对AmazonDynamoDB.batchWriteItem方法的一个或多个调用将对象保存到一个或多个表。
Book book1 = new Book();
book1.id = 901;
book1.productCategory = "Book";
book1.title = "Book 901 Title";Book book2 = new Book();
book2.id = 902;
book2.productCategory = "Book";
book2.title = "Book 902 Title";mapper.batchSave(Arrays.asList(book1, book2));
  • batchWrite
    • 使用对AmazonDynamoDB.batchWriteItem方法的一个或多个调用,将对象保存到一个或多个表并从一个或多个表中删除对象。
// Create a Forum item to save
Forum forumItem = new Forum();
forumItem.name = "Test BatchWrite Forum";// Create a Thread item to save
Thread threadItem = new Thread();
threadItem.forumName = "AmazonDynamoDB";
threadItem.subject = "My sample question";// Load a ProductCatalog item to delete
Book book3 = mapper.load(Book.class, 903);List<Object> objectsToWrite = Arrays.asList(forumItem, threadItem);
List<Book> objectsToDelete = Arrays.asList(book3);mapper.batchWrite(objectsToWrite, objectsToDelete);
  • 计数
    • 计算指定的扫描表达式并返回匹配项的计数。
  • marshallIntoObject
    • 一种将结果从低级API转换为域对象的实用程序方法。

支持的数据类型

Amazon DynamoDB支持以下原始数据类型和原始包装器类。

  • 布尔,布尔
  • 字节,字节
  • 日期(作为ISO8601毫秒精度的字符串,转换为UTC)
  • 日历(作为ISO8601毫秒精度的字符串,已转换为UTC)
  • 好久好久
  • 整数,整数
  • 双倍
  • 浮,浮
  • 大十进制
  • 大整数

Amazon DynamoDB支持Java Set集合类型。 如果映射的集合属性不是Set,则将引发异常。

下表总结了前面的Java类型如何映射到Amazon DynamoDB类型。

Java类型 Amazon DynamoDB类型
所有数字类型 N(数字类型)
弦乐 S(字符串类型)
布尔值 N(数字类型),0或1。
字节缓冲区 B(二进制类型)
日期 S(字符串类型)。 日期值存储为ISO-8601格式的字符串。
设置收集类型 SS(字符串集)类型,NS(数字集)类型或BS(二进制集)类型。

Java示例:CRUD操作

CatalogItem.java

import java.util.Set;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;
@DynamoDBTable(tableName="ProductCatalog")
public class CatalogItem {private Integer id;private String title;private String ISBN;private Set bookAuthors;@DynamoDBHashKey(attributeName="Id")public Integer getId() { return id; }public void setId(Integer id) { this.id = id; }@DynamoDBAttribute(attributeName="Title")public String getTitle() { return title; }    public void setTitle(String title) { this.title = title; }@DynamoDBAttribute(attributeName="ISBN")public String getISBN() { return ISBN; }    public void setISBN(String ISBN) { this.ISBN = ISBN;}@DynamoDBAttribute(attributeName = "Authors")public Set getBookAuthors() { return bookAuthors; }    public void setBookAuthors(Set bookAuthors) { this.bookAuthors = bookAuthors; }@Overridepublic String toString() {return "Book [ISBN=" + ISBN + ", bookAuthors=" + bookAuthors+ ", id=" + id + ", title=" + title + "]";            }
}

ObjectPersistenceCRUDExample.java

import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Random;import com.amazonaws.AmazonClientException;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.ClasspathPropertiesFileCredentialsProvider;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig;
import com.amazonaws.services.dynamodbv2.model.AttributeDefinition;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
import com.amazonaws.services.dynamodbv2.model.ComparisonOperator;
import com.amazonaws.services.dynamodbv2.model.Condition;
import com.amazonaws.services.dynamodbv2.model.CreateTableRequest;
import com.amazonaws.services.dynamodbv2.model.DescribeTableRequest;
import com.amazonaws.services.dynamodbv2.model.KeySchemaElement;
import com.amazonaws.services.dynamodbv2.model.KeyType;
import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput;
import com.amazonaws.services.dynamodbv2.model.ScalarAttributeType;
import com.amazonaws.services.dynamodbv2.model.ScanRequest;
import com.amazonaws.services.dynamodbv2.model.ScanResult;
import com.amazonaws.services.dynamodbv2.model.TableDescription;
import com.amazonaws.services.dynamodbv2.model.TableStatus;public class ObjectPersistenceCRUDExample {static AmazonDynamoDBClient client;private DynamoDBMapper mapper;private static int PRODUCT_ID;public static void main(String[] args) throws IOException {ObjectPersistenceCRUDExample demo = new ObjectPersistenceCRUDExample();demo.init();demo.createTable("ProductCatalog");for (int i = 0; i < 100; i++) {System.out.println(i);PRODUCT_ID = PRODUCT_ID + i;demo.insert();}demo.getAllRows();CatalogItem itemRetrieved = demo.load(PRODUCT_ID);demo.update(itemRetrieved);CatalogItem updatedItem = demo.load(PRODUCT_ID);demo.delete(updatedItem);demo.load(updatedItem.getId());System.out.println("Example complete!");}private void init() {PRODUCT_ID = new Random().nextInt(1000);AWSCredentials credentials = new ClasspathPropertiesFileCredentialsProvider().getCredentials();client = new AmazonDynamoDBClient(credentials);Region usWest2 = Region.getRegion(Regions.US_WEST_2);client.setRegion(usWest2);mapper = new DynamoDBMapper(client);}private void createTable(String tableName) {try {CreateTableRequest createTableRequest = new CreateTableRequest().withTableName(tableName);createTableRequest.withKeySchema(new KeySchemaElement().withAttributeName("Id").withKeyType(KeyType.HASH));createTableRequest.withAttributeDefinitions(new AttributeDefinition().withAttributeName("Id").withAttributeType(ScalarAttributeType.N));createTableRequest.withProvisionedThroughput(new ProvisionedThroughput().withReadCapacityUnits(10L).withWriteCapacityUnits(10L));TableDescription createdTableDescription = client.createTable(createTableRequest).getTableDescription();System.out.println("Created Table: " + createdTableDescription);// Wait for it to become activewaitForTableToBecomeAvailable(tableName);} catch (AmazonServiceException e) {e.printStackTrace();} catch (AmazonClientException e) {e.printStackTrace();}}private void waitForTableToBecomeAvailable(String tableName) {System.out.println("Waiting for " + tableName + " to become ACTIVE...");long startTime = System.currentTimeMillis();long endTime = startTime + (10 * 60 * 1000);while (System.currentTimeMillis() < endTime) {try {Thread.sleep(1000 * 20);} catch (Exception e) {}try {DescribeTableRequest request = new DescribeTableRequest().withTableName(tableName);TableDescription tableDescription = client.describeTable(request).getTable();String tableStatus = tableDescription.getTableStatus();System.out.println("  - current state: " + tableStatus);if (tableStatus.equals(TableStatus.ACTIVE.toString()))return;} catch (AmazonServiceException ase) {if (ase.getErrorCode().equalsIgnoreCase("ResourceNotFoundException") == false)throw ase;}}throw new RuntimeException("Table " + tableName + " never went active");}private void insert() {CatalogItem item = new CatalogItem();item.setId(PRODUCT_ID);item.setTitle("Book PRODUCT_ID");item.setISBN("611-1111111111");item.setBookAuthors(new HashSet(Arrays.asList("Author1","Author2")));// Save the item (book).mapper.save(item);}private void update(CatalogItem itemRetrieved) {itemRetrieved.setISBN("622-2222222222");itemRetrieved.setBookAuthors(new HashSet(Arrays.asList("Author1", "Author3")));mapper.save(itemRetrieved);System.out.println("Item updated:");System.out.println(itemRetrieved);}private void delete(CatalogItem updatedItem) {// Delete the item.mapper.delete(updatedItem);}private CatalogItem load(int id) {// Retrieve the updated item.DynamoDBMapperConfig config = new DynamoDBMapperConfig(DynamoDBMapperConfig.ConsistentReads.CONSISTENT);CatalogItem updatedItem = mapper.load(CatalogItem.class, id, config);if (updatedItem == null) {System.out.println("Done - Sample item is deleted.");} else {System.out.println("Retrieved item:");System.out.println(updatedItem);}return updatedItem;}private void getAllRows() {ScanRequest scanRequest = new ScanRequest().withTableName("ProductCatalog");scanRequest.setLimit(10);HashMap scanFilter = new HashMap();Condition condition = new Condition().withComparisonOperator(ComparisonOperator.EQ.toString()).withAttributeValueList(new AttributeValue().withS("611-1111111111"));scanFilter.put("ISBN", condition);Condition condition2 = new Condition().withComparisonOperator(ComparisonOperator.LE.toString()).withAttributeValueList(new AttributeValue().withN("1000"));scanFilter.put("Id", condition2);scanRequest.withScanFilter(scanFilter);try {System.out.println("Scan Request: " + scanRequest);ScanResult scanResponse = client.scan(scanRequest);for (Map item : scanResponse.getItems()) {System.out.println(item.get("Id").getN() + " , " +item.get("ISBN").getS() + " , " +item.get("Authors").getSS() + " , " +item.get("Title").getS());}System.out.println("Scan Response: " + scanResponse);System.out.println("Count: " + scanResponse.getCount());System.out.println("Scanned Count: "+ scanResponse.getScannedCount());System.out.println("Items: " + scanResponse.getItems());} catch (AmazonServiceException e) {e.printStackTrace();} catch (AmazonClientException e) {e.printStackTrace();}}
}

参考: Sunil Gulabani博客上的JCG合作伙伴 Sunil Gulabani的Amazon DynamoDB 。

翻译自: https://www.javacodegeeks.com/2013/08/amazon-dynamodb.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367321.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

随机验证码 pillow

安装 pip3 install pillow 基本使用 import PILfrom PIL import Imagefrom PIL import ImageDraw, ImageFontimport random 1.创建图片 from PIL import Image img Img.new(mode"RGB",size(120.30),color(255,255,255))# 在图片查看器中打开 # img.show()# 保存在本地…

微信小程序裁剪图片成圆形

前言 最近在开发小程序&#xff0c;产品经理提了一个需求&#xff0c;要求微信小程序换头像&#xff0c;用户剪裁图片必须是圆形&#xff0c;也在github上看了一些例子&#xff0c;一般剪裁图片用的都是方形&#xff0c;所以自己打算写一个小组件&#xff0c;可以把图片剪裁成圆…

android 系统挂载ext4格式U盘,macOS 系统下格式化 U 盘为 ext4 格式

您好&#xff0c;我是小白&#xff0c;和您请教一下哦。如果您有空QQ回复的话&#xff0c;非常感谢&#xff01;我在第一步输入完安装homebrew的命令后&#xff0c;终端报错wangneddeMBP:~ ned$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebr…

MFC控件编程之组合框跟列表框

MFC控件编程之组合框跟列表框 一丶简介 如果要使用组合框跟列表框.那么就要知道.组合框列表框是最核心的东西就是索引. 索引是从0开始的. 二丶组合框列表框常用的方法 AddString(字符串) 添加一个字符串.放到最后面. DeleteString(索引); 删除指定索引的字符串. int GetCurSe…

使用JaCoCo Maven插件为单元和集成测试创建代码覆盖率报告

当我开始使用Java 7时&#xff0c;我立即注意到Cobertura Maven插件不支持它 。 这对我来说是个大问题&#xff0c;因为我每天都使用代码覆盖率报告。 我做了一些研究&#xff0c;发现了JaCoCo代码覆盖库 。 看起来很有趣&#xff0c;我决定试一试。 问题在于配置它确实很困难…

多重继承_Python 和 Java 基础对比 10 —— 类的封装、继承和多态

Python大星一、Python 类的封装、继承和多态封装继承Python 支持多父类的继承机制&#xff0c;所以需要注意圆括号中基类的顺序&#xff0c;若是基类中有相同的方法名&#xff0c;并且在子类使用时未指定&#xff0c;Python 会从左至右搜索基类中是否包含该方法。一旦查找到则直…

前端也要会的数据结构 (不定期更新篇)

前端的软肋 一说到前端大家脑子里只有&#xff0c;布局、展示数据、修改样式等等。可是数据是哪里来的呢&#xff1f;后端给的后端给的。数据的结构呢&#xff1f;后端给啥用啥。 这就是前端的一个软肋。我们的业务让我们并不需要过深入的了解数据结构&#xff0c;数据结构和…

鸿蒙系统8月9日发布,8月9日,华为发布EMUI10.0系统+展示鸿蒙系统

8月9日&#xff0c;华为将召开华为全球开发者大会&#xff0c;本次大会邀请了5000名全球开发者、1500位合作伙伴&#xff0c;是华为历来规模最大的一次会议。在华为开发者大会上&#xff0c;华为将推出EMUI 10.0系统&#xff0c;由华为消费也业务软件总裁王成录主讲。EMUI是手机…

EclipseLink MOXy和用于JSON处理的Java API –对象模型API

用于JSON处理的Java API&#xff08;JSR-353&#xff09;是用于生成和使用JSON的Java标准&#xff0c;它是Java EE 7的一部分引入。JSR-353包括对象&#xff08;类似于DOM&#xff09;和流&#xff08;类似于StAX&#xff09;API。 在本文中&#xff0c;我将演示我们在EclipseL…

matlab main函数_Python 和MATLAB 制作Gif 图像

主要内容概述&#xff1a;预备知识MATLAB 代码实现GIF使用imageio 生成GIF使用animation 交互式方式生成GIF总结0&#xff0c;预备知识首先了解下什么是GIF 图片&#xff0c;以及常用的图片格式。GIF的全称是Graphics Interchange Format&#xff0c;可译为图形交换格式&#x…

C# MVC IOC、依赖注入

在MVC5中依赖注入&#xff0c;本文介绍通过扫描类型RegisterAssemblyTypes来进行注册 另外还有扫描模块RegisterAssemblyModules来注册 使用Autofac框架进行组件的依赖注入 Autofac是.NET领域最为流行的IOC框架之一&#xff0c;传说是速度最快的一个 先通过Nuget安装程序包 PM&…

ORB-SLAM2的特征提取算法

ORB-SLAM2跟踪线程对相机输入的每一帧图像进行跟踪处理&#xff0c;如下图所示&#xff0c;主要包括4步&#xff0c;提取ORB特征、从上一帧或者重定位来估计初始位姿、局部地图跟踪和关键帧处理。 以下结合相关理论知识&#xff0c;阅读ORB-SLAM2源代码&#xff0c;从而理解ORB…

在vue中使用SockJS实现webSocket通信

最近接到一个业务需求,需要做一个聊天信息的实时展示的界面,这就需要和服务器端建立webSocket连接,从而实现数据的实时获取和视图的实时刷新.在此将我的实现记录下来,希望可以给有同样需求的人一些帮助.废话少说,下面我就来讲一下我的实现过程: 前提 要进行文章中的代码的测试…

DI / CDI –基础

简介&#xff08;DI / CDI基础&#xff09; 首先&#xff0c;我认为对此会有一些困惑&#xff0c;但事实是&#xff0c;它们是相同的–不同之处在于用法及其用途。 DI&#xff08;依赖注入&#xff09;是通用术语–该功能基本上是在任何应用程序上进行Bean发现和Bean连接过程的…

引导界面图标好大_游戏里那些图标和界面,原来是这么设计出来的?

UI设计最硬核的思维 就是功能微信现在在做一种全面连接的功能&#xff0c;而游戏需要实现的是人机互动的功能。实现并完善功能&#xff0c;是互联网、游戏、网站、渴望UI人才的根本原因。如果说有电脑的世界是一片很大的面&#xff0c;那么可视化的操作&#xff0c;都是UI设计师…

爬格子呀9.17(图论)

刘汝佳的紫书差不多就告一段落吧&#xff0c;我觉得可以了&#xff0c;怎么说呢&#xff0c;这书也陪着自己走了一年多了吧&#xff0c;也目睹了从一个啥也不会的萌新到一个稍微会一点的萌新的转变。 差不多开始下本书吧&#xff0c;自己也大三了&#xff0c;时间真的有点紧啊w…

一个vue加egg.js的博客

之前自己的博客是用hexo做的&#xff0c;后面想做一个有后台的博客就打算用vue加node来试试&#xff0c;于是就有了这个博客。 项目地址 W-Blog W-Blog是一个基于vue和node的小小小博客 前端用vue&#xff0c;后端用egg.js 快速入门 技术栈 前端&#xff1a; 用户端&#…

js判断处理undefined类型的数据

code: resFlag response.result.data.result; /查询客户为白名单用户时,将"*该企业已被列入黑名单"标记清除 if(typeof resFlag "undefined"){$("#companynameisblack").text(""); }转载于:https://www.cnblogs.com/YLQBL/p/8819696…

批处理写入以及动态与参数化SQL,数据库的性能如何?

批处理写入是最有效的数据库优化之一。 批处理写入受大多数现代数据库和JDBC标准的一部分支持&#xff0c;并且受大多数JPA提供程序支持。 普通数据库访问包括在单独的数据库/网络访问中将每个DML&#xff08;插入&#xff0c;更新&#xff0c;删除&#xff09;语句发送到数据…

android音量图标不见了,电脑声音图标不见了如何解决?

最近有电脑用户反映&#xff0c;看视频时觉得声音太小了&#xff0c;要调大点声&#xff0c;却发现任务栏上的声音图标不见了&#xff0c;想调个声音都难。那么&#xff0c;电脑声音图标不见了如何解决呢?我们一起往下看看。方法步骤一、XP系统下找回任务栏上的声音图标1、重启…