【转载】sql-builder介绍
原文链接:sql-builder介绍
关于sql-builder
sql-builder尝试使用java对象,通过类SQL的拼接方式,动态快速的生成SQL。它可作为稍后的开源项目ibit-mybatis的核心类库。
sql-builder提供了对象拼接的构造类Sql和字符串拼接的构造类StringSql。
Sql构造示例
详细测试用例查看:tech.ibit.sqlbuilder.SqlTest
select
// 传入列
Sql sql = new Sql()
.select(Arrays.asList(UserProperties.userId, UserProperties.name))
.from(UserProperties.TABLE);
assertParamsEquals("SELECT u.user_id, u.name FROM user u", sql.getSqlParams());
// 支持聚合函数
sql = new Sql().select(Arrays.asList(new SumColumn(UserProperties.userId, "user_id_sum")
, new AvgColumn(UserProperties.userId, "user_id_avg")))
.from(UserProperties.TABLE).groupBy(UserProperties.userId);
assertParamsEquals("SELECT SUM(u.user_id) AS user_id_sum, AVG(u.user_id) AS user_id_avg FROM user u GROUP BY u.user_id"
, sql.getSqlParams());
selectDistinct
Sql sql = new Sql()
.selectDistinct(UserProperties.email)
.from(UserProperties.TABLE);
assertParamsEquals("SELECT DISTINCT u.email FROM user u", Collections.emptyList(), sql.getSqlParams());
selectPo(解析传入类)
Sql sql = new Sql()
.selectPo(UserPo.class)
.from(UserProperties.TABLE);
assertParamsEquals("SELECT u.user_id, u.login_id, u.email, u.mobile_phone, u.type FROM user u",
Collections.emptyList(), sql.getSqlParams());
selectDistinctPo
Sql sql = new Sql()
.selectDistinctPo(UserPo.class)
.from(UserProperties.TABLE).limit(1000);
assertParamsEquals("SELECT DISTINCT u.user_id, u.login_id, u.email, u.mobile_phone, u.type FROM user u LIMIT ?, ?",
Arrays.asList("$start", 0, "$limit", 1000), sql.getSqlParams());
count
Sql sql = new Sql()
.count()
.from(UserProperties.TABLE);
assertParamsEquals("SELECT COUNT(*) FROM user u", sql.getSqlParams());
countDistinct
// 传入单列
Sql sql = new Sql()
.countDistinct(UserProperties.userId)
.from(UserProperties.TABLE);
assertParamsEquals("SELECT COUNT(DISTINCT u.user_id) FROM user u", sql.getSqlParams());
// 传入多列
sql = new Sql()
.countDistinct(Arrays.asList(UserProperties.name, UserProperties.email))
.from(UserProperties.TABLE);
assertParamsEquals("SELECT COUNT(DISTINCT u.name, u.email) FROM user u", sql.getSqlParams());
deleteFrom
// 删除操作必须包含where语句,不然这个操作很危险
Sql sql = new Sql().deleteFrom(UserProperties.TABLE);
thrown.expect(RuntimeException.class);
thrown.expectMessage("Where cannot be empty when do deleting!");
sql.getSqlParams();
// 正常删除
Sql sql = new Sql()
.deleteFrom(UserProperties.TABLE)
.andWhere(CriteriaItemMaker.equalsTo(UserProperties.userId, 1));
assertParamsEquals("DELETE FROM user WHERE user_id = ?",
Arrays.asList("user_id", 1), sql.getSqlParams());
deleteTableFrom(支持别名)
// 正常删除
Sql sql = new Sql()
.deleteTableFrom(UserProperties.TABLE)
.andWhere(CriteriaItemMaker.equalsTo(UserProperties.userId, 1));
assertParamsEquals("DELETE u.* FROM user u WHERE u.user_id = ?",
Arrays.asList("u.user_id", 1), sql.getSqlParams());
// 支持join的删除
sql = new Sql()
.deleteTableFrom(UserProperties.TABLE)
.andWhere(CriteriaItemMaker.equalsTo(UserProperties.userId, 1))
.leftJoinOn(OrganizationProperties.TABLE, Arrays.asList(UserProperties.orgId, OrganizationProperties.orgId));
assertParamsEquals("DELETE u.* FROM user u LEFT JOIN organization o ON u.org_id = o.org_id WHERE u.user_id = ?",
Arrays.asList("u.user_id", 1), sql.getSqlParams());
update
// update操作必须包含where语句,不然这操作很危险
Sql sql = new Sql()
.update(UserProperties.TABLE)
.set(new ColumnValue(UserProperties.name, "IBIT"));
thrown.expect(RuntimeException.class);
thrown.expectMessage("Where cannot be empty when do updating!");
sql.getSqlParams();
// 正常删除
sql = new Sql()
.update(UserProperties.TABLE)
.set(new ColumnValue(UserProperties.name, "IBIT"))
.andWhere(CriteriaItemMaker.equalsTo(UserProperties.userId, 1));
assertParamsEquals("UPDATE user u SET u.name = ? WHERE u.user_id = ?",
Arrays.asList("u.name", "IBIT", "u.user_id", 1), sql.getSqlParams());
insertInto & values
Sql sql = new Sql()
.insertInto(UserProperties.TABLE)
.values(Arrays.asList(new ColumnValue(UserProperties.name, "IBIT")
, new ColumnValue(UserProperties.loginId, "188")
, new ColumnValue(UserProperties.avatarId, null)));
assertParamsEquals("INSERT INTO user(name, login_id, avatar_id) VALUES(?, ?, ?)",
Arrays.asList("name", "IBIT", "login_id", "188", "avatar_id", null), sql.getSqlParams());
set
Sql sql = new Sql()
.update(UserProperties.TABLE)
.set(Arrays.asList(new ColumnValue(UserProperties.name, "IBIT")
, new ColumnValue(UserProperties.loginId, "188")
, new ColumnValue(UserProperties.avatarId, null)))
.andWhere(CriteriaItemMaker.equalsTo(UserProperties.userId, 1));
assertParamsEquals("UPDATE user u SET u.name = ?, u.login_id = ?, u.avatar_id = ? WHERE u.user_id = ?",
Arrays.asList("u.name", "IBIT", "u.login_id", "188", "u.avatar_id", null, "u.user_id", 1), sql.getSqlParams());
increaseSet(字段增长)
Sql sql = new Sql()
.update(UserProperties.TABLE)
.increaseSet(new ColumnValue(UserProperties.loginTimes, 2))
.andWhere(CriteriaItemMaker.equalsTo(UserProperties.userId, 1));
assertParamsEquals("UPDATE user u SET u.login_times = u.login_times + ? WHERE u.user_id = ?",
Arrays.asList("u.login_times", 2, "u.user_id", 1), sql.getSqlParams());
decreaseSet(字段递减)
Sql sql = new Sql()
.update(UserProperties.TABLE)
.decreaseSet(new ColumnValue(UserProperties.loginTimes, 2))
.andWhere(CriteriaItemMaker.equalsTo(UserProperties.userId, 1));
assertParamsEquals("UPDATE user u SET u.login_times = u.login_times - ? WHERE u.user_id = ?"
, Arrays.asList("u.login_times", 2, "u.user_id", 1), sql.getSqlParams());
from
Sql sql = new Sql()
.select(Arrays.asList(UserProperties.userId, UserProperties.name, ProjectProperties.name))
.from(UserProperties.TABLE)
.from(ProjectProperties.TABLE)
.andWhere(CriteriaItemMaker.equalsTo(UserProperties.currentProjectId, ProjectProperties.projectId));
assertParamsEquals("SELECT u.user_id, u.name, p.name FROM user u, project p WHERE u.current_project_id = p.project_id",
Collections.emptyList(), sql.getSqlParams());
sql = new Sql()
.select(Arrays.asList(ProjectProperties.projectId, ProjectProperties.name))
.from(ProjectProperties.TABLE);
assertParamsEquals("SELECT p.project_id, p.name FROM project p",
Collections.emptyList(), sql.getSqlParams());
joinOn(left, right, full, inner)
Sql sql = new Sql()
.select(Arrays.asList(UserProperties.userId, UserProperties.name, ProjectProperties.name))
.from(UserProperties.TABLE)
.joinOn(ProjectProperties.TABLE, Arrays.asList(UserProperties.currentProjectId, ProjectProperties.projectId));
assertParamsEquals("SELECT u.user_id, u.name, p.name FROM user u JOIN sz_project p ON u.current_project_id = p.project_id", sql.getSqlParams());
// left join on
sql = new Sql()
.select(Arrays.asList(UserProperties.userId, UserProperties.name, ProjectProperties.name))
.from(UserProperties.TABLE)
.leftJoinOn(ProjectProperties.TABLE, Arrays.asList(UserProperties.currentProjectId, ProjectProperties.projectId));
assertParamsEquals("SELECT u.user_id, u.name, p.name FROM user u LEFT JOIN sz_project p ON u.current_project_id = p.project_id", sql.getSqlParams());
// 省略其他join
complexJoinOn(支持on后面增加条件,left, right, full, inner)
Sql sql = new Sql()
.select(Arrays.asList(UserProperties.userId, UserProperties.name, ProjectProperties.name))
.from(UserProperties.TABLE)
.complexLeftJoinOn(ProjectProperties.TABLE, Collections.singletonList(CriteriaItemMaker.equalsTo(UserProperties.currentProjectId, ProjectProperties.projectId)));
SqlParams sqlParams = sql.getSqlParams();
assertEquals("SELECT u.user_id, u.name, p.name FROM user u LEFT JOIN project p ON u.current_project_id = p.project_id", sqlParams.getSql());
assertTrue(sqlParams.getParamDetails().isEmpty());
sql = new Sql()
.select(Arrays.asList(UserProperties.userId, UserProperties.name, ProjectProperties.name))
.from(UserProperties.TABLE)
.complexLeftJoinOn(ProjectProperties.TABLE, Arrays.asList(
CriteriaItemMaker.equalsTo(UserProperties.currentProjectId, ProjectProperties.projectId),
CriteriaItemMaker.like(ProjectProperties.name, "小%")));
sqlParams = sql.getSqlParams();
assertEquals("SELECT u.user_id, u.name, p.name FROM user u LEFT JOIN project p "
+ "ON u.current_project_id = p.project_id AND p.name LIKE ?", sqlParams.getSql());
assertList(sqlParams.getParamDetails(), 1, Arrays.asList("p.name", "小%"));
// 省略其他join
where(支持构造复杂的where语句)
List<CriteriaItem> xiaoLikeItems = Arrays.asList(
CriteriaItemMaker.like(UserProperties.name, "小%"),
CriteriaItemMaker.like(UserProperties.email, "xiao%"));
CriteriaItem userIdItem = CriteriaItemMaker.greaterThan(UserProperties.userId, 100);
CriteriaItem type1Item = CriteriaItemMaker.equalsTo(UserProperties.type, 1);
CriteriaItem type2Item = CriteriaItemMaker.equalsTo(UserProperties.type, 2);
Sql sql = new Sql()
.select(Arrays.asList(UserProperties.userId, UserProperties.name))
.from(UserProperties.TABLE)
.where(Criteria.ands(Arrays.asList(Criteria.ors(xiaoLikeItems), userIdItem)));
SqlParams sqlParams = sql.getSqlParams();
assertList(sqlParams.getParams(), 3, Arrays.asList("小%", "xiao%", 100));
sql = new Sql()
.select(Arrays.asList(UserProperties.userId, UserProperties.name))
.from(UserProperties.TABLE)
.where(
Criteria.ands(
Arrays.asList(Criteria.ors(xiaoLikeItems),
Criteria.ors(Collections.singletonList(userIdItem)))
)
);
sqlParams = sql.getSqlParams();
assertParamsEquals("SELECT u.user_id, u.name FROM user u WHERE (u.name LIKE ? OR u.email LIKE ?) AND u.user_id > ?",
Arrays.asList("小%", "xiao%", 100), sqlParams);
sql = new Sql()
.select(Arrays.asList(UserProperties.userId, UserProperties.name))
.from(UserProperties.TABLE)
.where(
Criteria.ors(Arrays.asList(
Criteria.ands(
Arrays.asList(Criteria.ands(
Arrays.asList(Criteria.ors(xiaoLikeItems),
Criteria.ors(Collections.singletonList(userIdItem)))),
type1Item)
), type2Item))
);
sqlParams = sql.getSqlParams();
assertParamsEquals("SELECT u.user_id, u.name FROM user u WHERE (((u.name LIKE ? OR u.email LIKE ?) AND u.user_id > ?) AND u.type = ?) OR u.type = ?",
Arrays.asList("小%", "xiao%", 100, 1, 2), sqlParams);
andWhere & orWhere & flag(支持标记位条件)
// and
Sql sql = new Sql()
.select(Arrays.asList(UserProperties.userId, UserProperties.name))
.from(UserProperties.TABLE)
.andWhere(Criteria.ors(
Arrays.asList(CriteriaItemMaker.like(UserProperties.name, "小%"), CriteriaItemMaker.like(UserProperties.email, "xiao%"))))
.limit(1);
assertParamsEquals("SELECT u.user_id, u.name FROM user u WHERE (u.name LIKE ? OR u.email LIKE ?) LIMIT ?, ?"
, Arrays.asList("u.name", "小%", "u.email", "xiao%", "$start", 0, "$limit", 1), sql.getSqlParams());
// or
sql = new Sql()
.select(Arrays.asList(UserProperties.userId, UserProperties.name))
.from(UserProperties.TABLE)
.orWhere(Criteria.ands(
Arrays.asList(CriteriaItemMaker.like(UserProperties.name, "小%"), CriteriaItemMaker.like(UserProperties.email, "xiao%"))))
.orWhere(CriteriaItemMaker.equalsTo(UserProperties.type, 1))
.limit(1);
assertParamsEquals("SELECT u.user_id, u.name FROM user u WHERE (u.name LIKE ? AND u.email LIKE ?) OR u.type = ? LIMIT ?, ?",
Arrays.asList("u.name", "小%", "u.email", "xiao%", "u.type", 1, "$start", 0, "$limit", 1), sql.getSqlParams());
// CriteriaItemMaker支持构造flag有:containsNoneFlags, containsAllFlags, containsAnyFlags
sql = new Sql()
.select(Arrays.asList(UserProperties.userId, UserProperties.name))
.from(UserProperties.TABLE)
.andWhere(CriteriaItemMaker.containsNoneFlags(UserProperties.userId, 1));
assertParamsEquals("SELECT u.user_id, u.name FROM user u WHERE u.user_id & ? = 0",
Arrays.asList("u.user_id", 1), sql.getSqlParams());
orderBy
Sql sql = new Sql()
.select(Arrays.asList(UserProperties.userId, UserProperties.name, ProjectProperties.name))
.from(UserProperties.TABLE)
.leftJoinOn(ProjectProperties.TABLE, Arrays.asList(UserProperties.currentProjectId, ProjectProperties.projectId))
.orderBy(Arrays.asList(new OrderBy(ProjectProperties.projectId), new OrderBy(UserProperties.userId, true)))
.limit(1000);
assertParamsEquals("SELECT u.user_id, u.name, p.name FROM user u LEFT JOIN project p ON u.current_project_id = p.project_id ORDER BY p.project_id, u.user_id DESC LIMIT ?, ?",
Arrays.asList("$start", 0, "$limit", 1000), sql.getSqlParams());
customerOrderBy(自定义排序:mysql语法)
Sql sql = new Sql()
.select(Arrays.asList(UserProperties.userId, UserProperties.name, ProjectProperties.name))
.from(UserProperties.TABLE)
.leftJoinOn(ProjectProperties.TABLE, Arrays.asList(UserProperties.currentProjectId, ProjectProperties.projectId))
.orderBy(Arrays.asList(new OrderBy(ProjectProperties.projectId), new CustomOrderBy(UserProperties.userId, Arrays.asList(1, 2, 3), true)));
assertParamsEquals("SELECT u.user_id, u.name, p.name FROM user u LEFT JOIN project p ON u.current_project_id = p.project_id ORDER BY p.project_id"
+ ", FIELD(u.user_id, ?, ?, ?) DESC", Arrays.asList("u.user_id", 1, "u.user_id", 2, "u.user_id", 3), sql.getSqlParams());
nameOrderBy(自定义字段排序)
Sql sql = new Sql()
.select(
Arrays.asList(
new MinColumn(UserProperties.age, "min_age"),
new MaxColumn(UserProperties.age, "max_age"),
UserProperties.gender
))
.from(UserProperties.TABLE)
.andWhere(CriteriaItemMaker.greaterThanOrEqualsTo(UserProperties.age, 0))
.groupBy(UserProperties.gender)
.having(Having.and(HavingItemMaker.greaterThanOrEqualsTo("min_age", 1)))
.orderBy(Arrays.asList(
new OrderBy(UserProperties.gender),
new NameOrderBy("min_age", true)));
assertParamsEquals("SELECT MIN(u.age) AS min_age, MAX(u.age) AS max_age, u.gender FROM user u WHERE u.age >= ? " +
"GROUP BY u.gender HAVING min_age >= ? ORDER BY u.gender, min_age DESC", Arrays.asList("u.age", 0, "min_age", 1), sql.getSqlParams());
groupBy & having
Sql sql = new Sql()
.select(
Arrays.asList(
new MinColumn(UserProperties.age, "min_age"),
new MaxColumn(UserProperties.age, "max_age"),
UserProperties.gender
))
.from(UserProperties.TABLE)
.andWhere(CriteriaItemMaker.greaterThanOrEqualsTo(UserProperties.age, 0))
.groupBy(UserProperties.gender)
.having(Having.and(HavingItemMaker.greaterThanOrEqualsTo("min_age", 1)));
assertParamsEquals("SELECT MIN(u.age) AS min_age, MAX(u.age) AS max_age, u.gender FROM user u WHERE u.age >= ? GROUP BY u.gender HAVING min_age >= ?",
Arrays.asList("u.age", 0, "min_age", 1), sql.getSqlParams());
andHaving & orHaving
// andHaving
sql = new Sql()
.select(
Arrays.asList(
new MinColumn(UserProperties.age, "min_age"),
new MaxColumn(UserProperties.age, "max_age"),
UserProperties.gender
))
.from(UserProperties.TABLE)
.andWhere(CriteriaItemMaker.greaterThanOrEqualsTo(UserProperties.age, 0))
.groupBy(UserProperties.gender)
.andHaving(
Having.ors(
Arrays.asList(
HavingItemMaker.greaterThanOrEqualsTo("min_age", 1),
HavingItemMaker.greaterThanOrEqualsTo("max_age", 2))
))
.andHaving(
Having.ors(
Arrays.asList(
HavingItemMaker.greaterThanOrEqualsTo("min_age", 3),
HavingItemMaker.greaterThanOrEqualsTo("max_age", 4)
))
);
assertParamsEquals("SELECT MIN(u.age) AS min_age, MAX(u.age) AS max_age, u.gender FROM user u WHERE u.age >= ? GROUP BY u.gender "
+ "HAVING (min_age >= ? OR max_age >= ?) AND (min_age >= ? OR max_age >= ?)",
Arrays.asList("u.age", 0, "min_age", 1, "max_age", 2, "min_age", 3, "max_age", 4), sql.getSqlParams());
// orHaving
sql = new Sql()
.select(
Arrays.asList(
new MinColumn(UserProperties.age, "min_age"),
new MaxColumn(UserProperties.age, "max_age"),
UserProperties.gender
))
.from(UserProperties.TABLE)
.andWhere(CriteriaItemMaker.greaterThanOrEqualsTo(UserProperties.age, 0))
.groupBy(UserProperties.gender)
.orHaving(
Having.ands(
Arrays.asList(
HavingItemMaker.greaterThanOrEqualsTo("min_age", 1),
HavingItemMaker.greaterThanOrEqualsTo("max_age", 2))
))
.orHaving(
Having.ands(
Arrays.asList(
HavingItemMaker.greaterThanOrEqualsTo("min_age", 3),
HavingItemMaker.greaterThanOrEqualsTo("max_age", 4)
))
);
assertParamsEquals("SELECT MIN(u.age) AS min_age, MAX(u.age) AS max_age, u.gender FROM user u WHERE u.age >= ? GROUP BY u.gender "
+ "HAVING (min_age >= ? AND max_age >= ?) OR (min_age >= ? AND max_age >= ?)",
Arrays.asList("u.age", 0, "min_age", 1, "max_age", 2, "min_age", 3, "max_age", 4), sql.getSqlParams());
limit
Sql sql = new Sql()
.select(Arrays.asList(UserProperties.userId, UserProperties.name, ProjectProperties.name))
.from(UserProperties.TABLE)
.leftJoinOn(ProjectProperties.TABLE, Arrays.asList(UserProperties.currentProjectId, ProjectProperties.projectId))
.orderBy(Arrays.asList(new OrderBy(ProjectProperties.projectId), new OrderBy(UserProperties.userId, true)))
.limit(10);
assertParamsEquals("SELECT u.user_id, u.name, p.name FROM user u LEFT JOIN project p ON u.current_project_id = p.project_id ORDER BY p.project_id"
+ ", u.user_id DESC LIMIT ?, ?", Arrays.asList("$start", 0, "$limit", 10), sql.getSqlParams());
StringSql构造
构造方式与Sql相似,可以查看:tech.ibit.sqlbuilder.StringSqlTest
相关maven依赖包
<dependency>
<groupId>tech.ibit</groupId>
<artifactId>sql-builder</artifactId>
<version>1.1</version>
</dependency>
版权声明: Apache 2
【转载】sql-builder介绍的更多相关文章
- SQL Mon 介绍
原文:SQL Mon 介绍 这是一个相当高级的SQL Server监控工具,全面监控SQL Server的活动与性能,分析性能瓶颈,给出优化建议. red-gate有一个在线的数据库监控工具,不过那个 ...
- 初学者SQL语句介绍
初学者SQL语句介绍 1.用 Select 子句检索记录 Select 子句是每一个检索数据的查询核心.它告诉数据库引擎返回什么字段. Select 子句的常见形式是: S ...
- pl/sql的介绍
为什么需要pl/sql编程? 因为使用纯的sql语句来操作数据库,有先天性的技术缺陷: 1.不能模块编程: 2.执行速度慢: 3.安全性有问题: 4.浪费带宽. pl/sql是什么? pl/sql(p ...
- SQL的介绍及MySQL的安装
基础篇 - SQL 介绍及 MySQL 安装 SQL的介绍及MySQL的安装 课程介绍 本课程为实验楼提供的 MySQL 实验教程,所有的步骤都在实验楼在线实验环境中完成, ...
- [转载]sql 盲注之正则表达式攻击
[转载]sql 盲注之正则表达式攻击 -----------------------------------------MYSQL 5+-------------------------------- ...
- oracle PL/SQL的介绍
转自:http://blog.sina.com.cn/s/blog_4c302f060101i4o1.html 一 PL/SQL的介绍 1 PL/SQL是什么? PL/SQL(procedural l ...
- xorm的sql builder
最近在使用xorm,并使用了sql builder来构建sql查询没想到升级后原来可以使用的代码居然报错了. 0x00 代码 sql, args, _ := builder.Select(" ...
- 四:SQL语句介绍
前言:介绍SQL语句及其大致的分类 一:SQL语句介绍(Structured SQL Lanage) 结构化的查询语言 是一种特殊的编程语言 是一种数据库查询和程序设计语言 用于存取数据及查询.更新和 ...
- SQL Builder 1.04
解析效果: select id,code,name,utime,src,ctime from stock where id<20 and code like '%6%' order by id, ...
- 转载--SQL Server 2005的XQuery介绍
原文地址: http://bbs.51cto.com/thread-458009-1-1.html 引用: 摘要 本文介绍了SQL Server 2005能够支持的XQuery的各方面特性如FLW ...
随机推荐
- Ubuntu学习之路1
最近重装了系统,对自己很久的win7 say goodBye.学习了自制U盘系统盘,重装了win8,然后在win8上倒腾,发现还是不错的.于是又在win8上装回了win7上的VMware,捣鼓了一下U ...
- zbar+opencv检测图片中的二维码或条形码
zbar本身自带检测二维码条形码功能,这里使用opencv只是做一些简单的读取图片,灰度图片以及显示条形码和二维码时用到一些绘制 // barcode-qrcodescanner.cpp: 定义控制台 ...
- Linux 安装Jenkins
1.安装jdk1.8 下载地址:https://github.com/frekele/oracle-java/releases 下载 root@123:~/my_java# wget https:// ...
- Nginx-入门(源码编译安装http://nginx.org/en/download.html)
比较早的时候 web主要经典组合--->LAMP 近几年---->nginx后来居上--->LNMP=LEMP Nginx = Engine x Nginx和Apache 都是 ...
- 为什么用nginx:它的5个主要优点
1.高并发,高性能 2.可扩展性好啊 3.高可靠性 4.热部署 5.BSD许可证
- [apue] 书中关于伪终端的一个纰漏
在看 apue 第 19 章伪终端第 6 节使用 pty 程序时,发现“检查长时间运行程序的输出”这一部分内容的实际运行结果,与书上所说有出入. 于是展开一番研究,最终发现是书上讲的有问题,现在摘出来 ...
- 时序数据库 Apache-IoTDB 源码解析之文件索引块(五)
上一章聊到 TsFile 的文件组成,以及数据块的详细介绍.详情请见: 时序数据库 Apache-IoTDB 源码解析之文件数据块(四) 打一波广告,欢迎大家访问IoTDB 仓库,求一波 Star. ...
- 二、UDP
1 端口号 在计算机网络和电磁信号理论中,对共享同一通信信道的多个信号进行区分是个常见的问题.多路复用(multiplexing)就是允许多个会话共享同一介质或机制的一种解决方案. 使用不同的频率来区 ...
- Codeforces 1062B Math(质因数分解)
题意: 给一个数n,可以将它乘任意数,或者开方,问你能得到的最小数是多少,并给出最小操作次数 思路: 能将这个数变小的操作只能是开方,所以构成的最小数一定是 $n = p_1*p_2*p_3*\dot ...
- ELK:收集k8s容器日志最佳实践
简介 关于日志收集这个主题,这已经是第三篇了,为什么一再研究这个课题,因为这个课题实在太重要,而当今优秀的开源解决方案还不是很明朗: 就docker微服务化而言,研发有需求标准输出,也有需求文件输出, ...