一、Data Lake Analytics介绍

数据湖(Data Lake)是时下大数据行业热门的概念:https://en.wikipedia.org/wiki/Data_lake。基于数据湖做分析,可以不用做任何ETL、数据搬迁等前置过程,实现跨各种异构数据源进行大数据关联分析,从而极大的节省成本和提升用户体验。

阿里云数据湖分析产品Data Lake Analytics(简称DLA):https://www.aliyun.com/product/datalakeanalytics
产品文档:https://help.aliyun.com/product/70174.html

下图是DLA的简易架构(MPP计算引擎+存储计算分离+弹性高可用+异构数据集源等):

二、自建账号

目前DLA是以MySQL协议方式对外提供服务,用户需要通过JDBC连接,连到DLA服务。DLA内部的账号和密码是独立自建的(与RAM不同),对应的账号和密码信息,在用户开通DLA服务时以站内信、邮件、短信等方式通知您。

可能您会疑惑,为什么DLA不是以RAM或AK账号做认证和授权,而需要自建账号。在这里,做一些简单的介绍:

  • DLA是数据库,在客户端建立连接(需要认证)、访问库、表、字段(需要鉴权)时,大量跨服务访问RAM系统,会给RAM系统造成很大压力,且可能会影响DLA服务延时;
  • DLA是数据库,需要兼容MySQL权限模型,库、表、字段等领域对象很难一一映射到RAM体系;同时RAM下的资源对象的权限粒度可粗可细,且更多偏向于管理数据生命周期而非详细数据层面的权限;
  • 用户习惯的Grant、Revoke、Show grants等逻辑,都是直接和传统数据库的库、表、字段一一映射。
  • 参考了阿里云上及业界云服务平台上其他数据库产品的设计,存在一样的考量;

目前DLA账号体系与RAM账号体系的关系:

三、三种账号模型

  • Root/Service账号:RAM主账号在某个Region内开通DLA服务时,系统会自动创建第一个DLA账户,并以站内信、短信、邮件方式通知RAM主账号,Root账号只有一个,不能删除;
  • User/子账号:由RAM主账号后续在Console上创建的新的DLA的User账号(注意,不是由Root账号创建的),云账号用户可以创建、删除User账号,也可以为其修改密码等;
  • Product账号:其他云产品(比如DBS)与DLA交互时,由用户在RAM中为该云产品授权过,由DLA自动产生并派发给云产品的账号;
  • Root账号和User账号,关联的RAM uid都是对应的云账号,从而Root和User账号都有机会访问云账号所有的资源(当然,这都是在授权管理之内);

四、账号实测操作

a)开通服务并初始化服务

找到服务:

购买:

开通完成,点击进入控制台:

为不同的Region初始化服务:

初始化完成,得到一个Root账号:

重新回到主页:https://openanalytics.console.aliyun.com/overview,设置服务访问点:

配置服务访问点

b)连接数据库并通过认证

连接DLA服务,并进入服务

  1. ##连接DLA服务,账号和密码都在您的收件箱内,服务访问点则在服务页面
  2. [root]# mysql -u<您的dla用户名> -p<您的dla密码> -h<您的dla服务访问点> -P10000
  3. ## 进入DLA服务,开始测试之旅
  4. mysql> show databases;
  5. Empty set (0.09 sec)

到此,我们已经完成了服务开通过程,并认证和连接成功。

c)创建子账号,并连接数据库

连接DLA服务,并进入服务,也能正常工作了:

五、权限模型

DLA中有两层权限验证机制,确保您的数据被安全访问:

a)DLA层校验原理

DLA是根据用户操作对象的范围“从大到小”验证的,从Global级(全局权限),到Schema级,再到Table级,最后到Column级(目前不支持)一层层验证权限。任何一层有权限校验成功,到最后一层也没权限时校验失败:

b)DLA层授权方法

基本上参考了MySQL的Grant/Revoke/Show Grants语法来实现:

  1. ##grant相关
  2. GRANT {SELECT | SHOW | ALTER | DROP | CREATE | INSERT | UPDATE | DELETE | GRANT OPTION | ALL | ALL PRIVILEGES | USAGE }
  3. ON {* | *.* | xxDb.* | xxDb.yyTable | yyTable }
  4. TO { oa_1234546 | 'oa_123456' | 'oa_123456'@'1.2.3.4'}
  5. [with grant option]
  6. ##revoke相关
  7. REVOKE {SELECT | SHOW | ALTER | DROP | CREATE | INSERT | UPDATE | DELETE |GRANT OPTION | ALL | ALL PRIVILEGES | USAGE}
  8. ON {* | *.* | xxDb.* | xxDb.yyTable | yyTable }
  9. FROM { oa_1234546 | 'oa_123456' | 'oa_123456'@'1.2.3.4'}
  10. ##show grants相关
  11. SHOW GRANTS
  12. [for [ current_user | current_user() | oa_123456 | 'oa_123456' | 'oa_123456'@'localhost'] ]

相关关键信息说明:

  • 授权人:

    • 只能由DLA的root账号给其他非Root账号授权;
    • 暂时不支持非Root账号给其他账号授权;
    • 不能跨云账号授权和回收权限;
  • privilege列表:

    • 可以用','连接在一起,比如SELECT,DELETE,UPDATE,INSERT,...
    • 有ALL或ALL PRIVILEGES就会全部授权或者全部回收,无视其他的Privilege;但一定要注意,grant option这个权限本身,不包含在ALL中,必须显式授权或者回收
    • 暂时不支持其他类型的授权;
    • SELECT是为Query授权;
    • SHOW为show、use命令授权(这里与mysql的逻辑差异比较大);
    • ALTER为alter或其他变更型的ddl授权;
    • CREATE为create型的ddl授权;
    • DROP为drop型的ddl授权;
    • INSERT为insert型的dml授权;
    • UPDATE为update型的dml授权;
    • DELETE为delete型的dml授权;
    • GRANT OPTION为dcl授权(grant和revoke相关);可以在Privilege中指定GRANT OPTION,也可以通过语句片段with grant option来做grant 授权;
    • USAGE其实啥也没有,表示为空;
  • ResourceType中:

    • 表示当前连接使用了某个库xxDB,然后针对xxDB做授权,库级别权限;
    • . 表示所有库的所有表授权,Global级别权限;
    • xxDb. 表示针对xxDB这个库做授权,库级别权限;
    • xxDb.yyTable 表示针对xxDB库的xxTable做授权,表级别权限;
    • yyTable 表示当前连接使用了某个库xxDB,针对xxDB库的xxTable做授权,表级别权限;
    • 暂时不支持字段级别的授权;
  • 被授权用户定义:

    • 直接写用户名:oa_123456
    • 用户字符串来表示:'oa_123456'
    • 即使写了ip、host信息,也不会用于连接的白名单校验;
  • 只有相同云账号下的Root用户才能为别人show grants;

  • 不能跨不同uid执行show grant

  • 必须有show权限和grant权限才能执行show grants,或者为本人执行;

  • SHOW GRANTS FOR 'jeffrey'@'localhost':目前不支持ip地址;

c)DLA与RAM间权限映射

因为DLA中的子账号与RAM中的子账号并不是一一对应,因而RAM中资源的权限和DLA中库表的权限也不是自然映射的,而是需要在DLA中以特殊定义的方式来做资源的映射和权限的隔离。

目前DLA中授权单位是Schema级别的,也就意味着如果Root账号给某个User账号授权了一个库的权限,那这个User账号能够访问这个库下所有的表,也就意味着能够访问该库映射到RAM上所有的资源,这些访问并不受RAM的子账号权限控制。

比如,我们看一个典型的建库语句(假设用户已经可以在DLA中创建相关的库):

  1. CREATE DATABASE db_name
  2. with dbproperties (
  3. CATALOG = 'ots',
  4. LOCATION = 'https://test-hangzhou.ots.aliyuncs.com',
  5. INSTANCE = 'test'
  6. )

如果Root账号给某个User账后执行Grant操作后,该User账号就可以访问这个库:

  1. grant all on db_name.* to xxx_s1519122757;

上述过程都假设云账号的系统角色授权已经完成,下一节我们介绍首先如何完成系统角色授权,从而允许DLA访问你在其他云产品中的数据。

d)系统角色授权

系统角色授权是指:用户给DLA授权,允许DLA访问用户相关云服务里的数据,从而实现DLA关联分析用户数据的目标,或者通过DLA实现ETL,将数据回流到用户的库。具体过程可以参考:https://help.aliyun.com/document_detail/53478.html

e)跨账号访问

DLA支持跨账号,允许A用户在DLA上,连接B用户的OSS上的数据进行分析计算,不过这需要做一些操作,后续文档会以图形化的方式来介绍和引导用户:

六、权限实测操作(以TableStore为案例)

a)准备TableStore的库表

我们来到OTS的首页,https://ots.console.aliyun.com/index,创建希望DLA做分析的库和表:

库建完后,去建表

插入一行数据

b)开通TableStore给DLA的云服务角色授权

关于访问控制和角色授权等信息,请参考:https://help.aliyun.com/product/28625.html

回到DLA主页:https://openanalytics.console.aliyun.com/overview

点击同意授权:

授权完成之后的状态:

查看角色授权已经成功:

c)在DLA中创建库和表,关联TableStore库和表

我们重新回到DLA Root账号(oa_xxx),通过JDBC协议连接到DLA(账号信息、DLA访问点、JDBC连接方式,请参考前面文档)

  1. ╰─○ mysql -u<您的DLA Root账号> -p<您的DLA Root账号的密码> -h<您的DLA-jdbc访问点> -P10000
  2. mysql: [Warning] Using a password on the command line interface can be insecure.
  3. Welcome to the MySQL monitor. Commands end with ; or \g.
  4. Your MySQL connection id is 194631
  5. Server version: 5.6.40-log Source distribution
  6. Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
  7. Oracle is a registered trademark of Oracle Corporation and/or its
  8. affiliates. Other names may be trademarks of their respective
  9. owners.
  10. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  11. mysql>

开始创建库,去关联TableStore中的实例:

  1. mysql> select user();
  2. +----------------+
  3. | user() |
  4. +----------------+
  5. | oa_xxxxxxxxxxx |
  6. +----------------+
  7. 1 row in set (0.08 sec)
  8. mysql> show databases; Empty set (0.02 sec)
  9. mysql> create database ots_account_test
  10. with dbproperties(
  11. catalog = 'ots',
  12. location = 'https://account-test.cn-shanghai.ots-internal.aliyuncs.com',
  13. instance = 'account-test'
  14. ) comment 'test account and privileges';
  15. Query OK, 0 rows affected (0.10 sec)
  16. mysql> show databases;
  17. +------------------+
  18. | Database |
  19. +------------------+
  20. | ots_account_test |
  21. +------------------+
  22. 1 row in set (0.01 sec)
  23. mysql> show create database ots_account_test;
  24. +------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  25. | Database | Create Database |
  26. +------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  27. | ots_account_test | CREATE DATABASE `ots_account_test`
  28. WITH DBPROPERTIES (
  29. catalog = 'ots',
  30. location = 'https://account-test.cn-shanghai.ots-internal.aliyuncs.com',
  31. instance = 'account-test'
  32. )
  33. COMMENT 'test account and privileges' |
  34. +------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  35. 1 row in set (0.03 sec)

开始创建表,去关联TableStore中的表,并查询数据(结果与OTS中的结果一致):

  1. mysql> use ots_account_test;
  2. Database changed
  3. mysql> show tables;
  4. Empty set (0.03 sec)
  5. mysql> create external table account_test (
  6. -> pk1 int not null primary key,
  7. -> name varchar(20)
  8. -> );
  9. Query OK, 0 rows affected (0.15 sec)
  10. mysql> show create table account_test;
  11. +--------------+-----------------------------------------------------------------------------------------------------------------------------------------------+
  12. | Table | Create Table |
  13. +--------------+-----------------------------------------------------------------------------------------------------------------------------------------------+
  14. | account_test | CREATE EXTERNAL TABLE `account_test` (
  15. `pk1` int NOT NULL COMMENT '',
  16. `name` varchar(20) NULL COMMENT '',
  17. PRIMARY KEY (`pk1`)
  18. )
  19. COMMENT '' |
  20. +--------------+-----------------------------------------------------------------------------------------------------------------------------------------------+
  21. 1 row in set (0.04 sec)
  22. mysql> select * from account_test;
  23. +------+--------------+
  24. | pk1 | name |
  25. +------+--------------+
  26. | 123 | account-test |
  27. +------+--------------+
  28. 1 row in set (1.61 sec)

至此,我们已经成功完成了数据关联并实现数据查询的过程!!

d)把库和表授权给子账号来访问

上诉都是Root账号在操作,从前面的分析可知,Root账号是可以操作对应云账号所有的云资源的,但是DLA的User账号却不行,必须通过Root账号给User账号Grant权限,DLA才能允许某个User账号访问对应的库和表:

切换到User账号/子账号连接页面,此时看不到任何库表:

  1. mysql> select user();
  2. +------------------------+
  3. | user() |
  4. +------------------------+
  5. | test_sxxxxxxxxxxxxxxxx |
  6. +------------------------+
  7. 1 row in set (0.14 sec)
  8. mysql> show databases;
  9. Empty set (0.02 sec)
  10. mysql> show grants ;
  11. +------------------------------------------------+
  12. | Grants for test_sxxxxxxxxxxxxxxxx |
  13. +------------------------------------------------+
  14. | GRANT USAGE ON *.* TO 'test_sxxxxxxxxxxxxxxxx' |
  15. +------------------------------------------------+
  16. 1 row in set (0.03 sec)

切换Root账号连接页面,我们给前面的账号授权:

  1. mysql> select user();
  2. +------------------------+
  3. | user() |
  4. +------------------------+
  5. | oa_xxxxxxxxxxx |
  6. +------------------------+
  7. 1 row in set (0.14 sec)
  8. mysql> show grants for test_sxxxxxxxxxxxxxxxx;
  9. +---------------------------------------------------------------+
  10. | Grants for test_sxxxxxxxxxxxxxxxx |
  11. +---------------------------------------------------------------+
  12. | GRANT USAGE ON *.* TO 'test_sxxxxxxxxxxxxxxxx' |
  13. +---------------------------------------------------------------+
  14. 1 rows in set (0.02 sec)
  15. mysql> grant all on ots_account_test.* to test_sxxxxxxxxxxxxxxxx;
  16. Query OK, 0 rows affected (0.05 sec)
  17. mysql> show grants for test_sxxxxxxxxxxxxxxxx;
  18. +---------------------------------------------------------------+
  19. | Grants for test_sxxxxxxxxxxxxxxxx |
  20. +---------------------------------------------------------------+
  21. | GRANT USAGE ON *.* TO 'test_sxxxxxxxxxxxxxxxx' |
  22. | GRANT ALL ON `ots_account_test`.* TO 'test_sxxxxxxxxxxxxxxxx' |
  23. +---------------------------------------------------------------+
  24. 2 rows in set (0.03 sec)

切换User账号连接页面,重新查询看看,已经有权限了,并且可以读取数据:

  1. mysql> select user();
  2. +------------------------+
  3. | user() |
  4. +------------------------+
  5. | test_sxxxxxxxxxxxxxxxx |
  6. +------------------------+
  7. 1 row in set (0.14 sec)
  8. mysql> show grants ;
  9. +---------------------------------------------------------------+
  10. | Grants for test_sxxxxxxxxxxxxxxxx |
  11. +---------------------------------------------------------------+
  12. | GRANT USAGE ON *.* TO 'test_sxxxxxxxxxxxxxxxx' |
  13. | GRANT ALL ON `ots_account_test`.* TO 'test_sxxxxxxxxxxxxxxxx' |
  14. +---------------------------------------------------------------+
  15. 2 rows in set (0.02 sec)
  16. mysql> show databases;
  17. +------------------+
  18. | Database |
  19. +------------------+
  20. | ots_account_test |
  21. +------------------+
  22. 1 row in set (0.02 sec)
  23. mysql> select * from ots_account_test.account_test;
  24. +------+--------------+
  25. | pk1 | name |
  26. +------+--------------+
  27. | 123 | account-test |
  28. +------+--------------+
  29. 1 row in set (0.43 sec)

至此,子账号授权访问就可以了!

e)支持跨账号访问

一般情况,用户大部分使用DLA的场景是,云账号A使用DLA访问云账号A在其他云产品中的数据,从前面的分析可以知道,只要用户在DLA的console上选择具体的数据源(比如TableStore)给DLA做系统角色授权之后,就可以打通数据源,创建库表和查询数据了。

但是,还有一种场景是:云账号A使用DLA来访问云账号B在其他云产品(以下以TableStore)中的数据,这需要专门的角色授权才能正常运行:

假设上述测试账号对应的云账号为A,下面就以TableStore和另一个云账号B(DLA另一个真实的测试云账号)作为案例,演示B账号给A账号针对TableStore中某个instance做跨账号授权,并且A在DLA中完成查询的过程。

首先,需要到B账号内,在"访问控制(https://ram.console.aliyun.com)"中创建一个跨账号授权的角色:

选择一个“服务角色”,选择一个合适的模板,快速创建:

重新回到角色管理页面,找到这个角色做修改(修改成支持DLA的模板):

跨账号的角色创建和修改完成,开始做“角色授权策略”的配置,这里我们以TableStore为例,其他数据源类似:

跨账号角色定义,以及角色授权都操作完成,我们开始进入DLA的实际测试,首先查看云账号B的TableStore中的instance和table的情况:

重新使用云账号A的DLA Root账号,通过MySQL-cli连接到DLA,然后连接和访问云账号B的数据:

  1. mysql> select user();
  2. +----------------+
  3. | user() |
  4. +----------------+
  5. | oa_xxxxxxxxxxx |
  6. +----------------+
  7. 1 row in set (0.06 sec)
  8. mysql> show databases;
  9. +------------------+
  10. | Database |
  11. +------------------+
  12. | ots_account_test |
  13. +------------------+
  14. 1 row in set (0.24 sec)
  15. mysql> create database ots_cross_account_test
  16. with dbproperties(
  17. catalog = 'ots',
  18. location = 'https://test-sh.cn-shanghai.ots-internal.aliyuncs.com', --云账号BTableStore instance
  19. instance = 'test-sh',
  20. cross_account_accessing_arn= 'acs:ram::1013xxxxxx:role/test-cross-account-accessing-role' --云账号B为云账号A@云服务DLA的跨账号角色授权时的Arn信息
  21. );
  22. Query OK, 0 rows affected (0.14 sec)
  23. mysql> show databases ;
  24. +------------------------+
  25. | Database |
  26. +------------------------+
  27. | ots_account_test |
  28. | ots_cross_account_test |
  29. +------------------------+
  30. 2 rows in set (0.18 sec)
  31. mysql> show create database ots_cross_account_test;
  32. +------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  33. | Database | Create Database |
  34. +------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  35. | ots_cross_account_test | CREATE DATABASE `ots_cross_account_test`
  36. WITH DBPROPERTIES (
  37. catalog = 'ots',
  38. location = 'https://test-sh.cn-shanghai.ots-internal.aliyuncs.com',
  39. instance = 'test-sh',
  40. cross_account_accessing_arn = 'acs:ram::1013xxxxxx:role/test-cross-account-accessing-role'
  41. )
  42. COMMENT '' |
  43. +------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  44. 1 row in set (0.19 sec)
  45. mysql> use ots_cross_account_test;
  46. Database changed
  47. mysql> show tables;
  48. Empty set (0.19 sec)
  49. mysql> create external table test_table1 (
  50. id1 int not null primary key,
  51. col1 int
  52. );
  53. Query OK, 0 rows affected (0.31 sec)
  54. mysql> show tables;
  55. +-------------+
  56. | Table_Name |
  57. +-------------+
  58. | test_table1 |
  59. +-------------+
  60. 1 row in set (0.20 sec)
  61. mysql> show create table test_table1;
  62. +-------------+--------------------------------------------------------------------------------------------------------------------------------------+
  63. | Table | Create Table |
  64. +-------------+--------------------------------------------------------------------------------------------------------------------------------------+
  65. | test_table1 | CREATE EXTERNAL TABLE `test_table1` (
  66. `id1` int NOT NULL COMMENT '',
  67. `col1` int NULL COMMENT '',
  68. PRIMARY KEY (`id1`)
  69. )
  70. COMMENT '' |
  71. +-------------+--------------------------------------------------------------------------------------------------------------------------------------+
  72. 1 row in set (0.20 sec)
  73. mysql> select * from test_table1;
  74. +--------+------+
  75. | id1 | col1 |
  76. +--------+------+
  77. | 0 | -111 |
  78. | 111111 | 111 |
  79. +--------+------+
  80. 2 rows in set (1.29 sec)

顺便提醒一下,普通的建库流程中是不需要cross_account_accessing_arn参数的,意味着默认是云账号自己给自己开通了DLA访问云服务的权限,而有了cross_account_accessing_arn参数,就表示跨账号服务的开启,这个DLA中的库以及库下面的表,都有了跨账号访问的权限!!

到这里,我们跨账号访问的全过程就完成啦!!如果你希望连接OSS等云服务,你也可以按照上述流程操作一遍!!

原文链接
更多技术干货 请关注阿里云云栖社区微信号 :yunqiinsight

Data Lake Analytics账号和权限体系详细介绍的更多相关文章

  1. Data Lake Analytics: 使用DataWorks来调度DLA任务

    DataWorks作为阿里云上广受欢迎的大数据开发调度服务,最近加入了对于Data Lake Analytics的支持,意味着所有Data Lake Analytics的客户可以获得任务开发.任务依赖 ...

  2. Data Lake Analytics的Geospatial分析函数

    0. 简介 为满足部分客户在云上做Geometry数据的分析需求,阿里云Data Lake Analytics(以下简称:DLA)支持多种格式的地理空间数据处理函数,符合Open Geospatial ...

  3. Data Lake Analytics + OSS数据文件格式处理大全

    0. 前言 Data Lake Analytics是Serverless化的云上交互式查询分析服务.用户可以使用标准的SQL语句,对存储在OSS.TableStore上的数据无需移动,直接进行查询分析 ...

  4. Data Lake Analytics: 读/写PolarDB的数据

    Data Lake Analytics 作为云上数据处理的枢纽,最近加入了对于PolarDB的支持, PolarDB 是阿里云自研的下一代关系型分布式云原生数据库,100%兼容MySQL,存储容量最高 ...

  5. Data Lake Analytics,大数据的ETL神器!

    0. Data Lake Analytics(简称DLA)介绍 数据湖(Data Lake)是时下大数据行业热门的概念:https://en.wikipedia.org/wiki/Data_lake. ...

  6. 使用Data Lake Analytics + OSS分析CSV格式的TPC-H数据集

    0. Data Lake Analytics(DLA)简介 关于Data Lake的概念,更多阅读可以参考:https://en.wikipedia.org/wiki/Data_lake 以及AWS和 ...

  7. 如何使用Data Lake Analytics创建分区表

    前言 Data Lake Analytics(后文简称DLA)提供了无服务化的大数据分析服务,帮助用户通过标准的SQL语句直接对存储在OSS.TableStore上的数据进行查询分析. 在关系型数据库 ...

  8. 使用Data Lake Analytics读/写RDS数据

    Data Lake Analytics 作为云上数据处理的枢纽,最近加入了对于RDS(目前支持 MySQL , SQLServer ,Postgres 引擎)的支持, 这篇教程带你玩转 DLA 的 R ...

  9. Data Lake Analytics中OSS LOCATION的使用说明

    前言 Data Lake Analytic(后文简称 DLA)可以帮助用户通过标准的SQL语句直接对存储在OSS.TableStore上的数据进行查询分析. 在查询前,用户需要根据数据文件的格式和内容 ...

随机推荐

  1. 老师的blog整理 .网络编程部分 .网络编程部分 前端部分 django基础部分

    老师的blog整理 .网络编程部分 .网络编程部分 前端部分 django基础部分   老师的blog整理 python基础部分: 宝哥blog: https://www.cnblogs.com/gu ...

  2. hibernate查询timestamp条件

    参考https://blog.csdn.net/zuozuoshenghen/article/details/50540661 Mysql中Timestamp字段的格式为yyyy-MM-dd HH-m ...

  3. SpringBoot 02_返回json数据

    在SpringBoot 01_HelloWorld的基础上来返回json的数据,现在前后端分离的情况下多数都是通过Json来进行交互,下面就来利用SpringBoot返回Json格式的数据. 1:新建 ...

  4. 关于Collection接口和Map

    Iterable才是Collection的父接口.不是Iterator. Map,SortedMap属于接口类型,不可以new的方式创建对象. HashMap基于哈希表实现Map接口的类,并允许nul ...

  5. java代码优化写法(转摘)

    本文源地址:https://blog.csdn.net/syc001/article/details/72841650 可供程序利用的资源(内存.CPU时间.网络带宽等)是有限的,优化的目的就是让程序 ...

  6. Android 开发 DNK开发将.c文件打包成os

    前言 不废话太多,Java与C之间联系的JNI的概念,这个要了解可以参考下面这个博客: https://www.jianshu.com/p/87ce6f565d37 此博客只说明如何将.C文件通过ND ...

  7. grpc之protobuf常用语法速学

    1,语法速学(1):返回商品”数组”.repeated修饰符 Repeated:是一个修饰符,返回字段可以重复任意多次(包括0次) 可以认为就是一个数组(切片) 服务端: 创建protobuf文件 s ...

  8. Spring AOP(三)--XML方式实现

    本文介绍通过XML方式实现Spring AOP,在上一篇中已经介绍了通过注解+java配置的方式,这篇文章主要是看XML中怎么配置,直接上代码了: 一.创建一个连接点 1⃣️定义接口 注意⚠️:可以定 ...

  9. 关于python的列表操作(一):取值,增加,修改,删除

    # 列表操作 name_list = ["wang", "niu", "bai", "sui"] # 取值 print( ...

  10. webServices学习三(概念详解)

    WebService通过HTTP协议完成远程调用: (深入分析) WebService只采用HTTP POST方式传输数据,不使用GET方式; -- 握手,WSDL-get, 普通http post的 ...