https://segmentfault.com/a/1190000010415384

关于jOOQ

jOOQ: The easiest way to write SQL in Java

jOOQ是一个基于Java编写SQL的工具包,具有:简单、轻量、函数式编程写SQL等独特优势,非常适合敏捷快速迭代开发。

初见jOOQ

使用jOOQ,SQL看起来好像是由Java原生支持的,保留SQL原有的简单。

SQL语句:

SELECT AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, COUNT(*)
FROM AUTHOR
JOIN BOOK ON AUTHOR.ID = BOOK.AUTHOR_ID
WHERE BOOK.LANGUAGE = 'DE'
AND BOOK.PUBLISHED > DATE '2008-01-01'
GROUP BY AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME
HAVING COUNT(*) > 5
ORDER BY AUTHOR.LAST_NAME ASC NULLS FIRST
LIMIT 2
OFFSET 1

Java代码:

create.select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, count())
.from(AUTHOR)
.join(BOOK).on(AUTHOR.ID.equal(BOOK.AUTHOR_ID))
.where(BOOK.LANGUAGE.eq("DE"))
.and(BOOK.PUBLISHED.gt(date("2008-01-01")))
.groupBy(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
.having(count().gt(5))
.orderBy(AUTHOR.LAST_NAME.asc().nullsFirst())
.limit(2)
.offset(1)

一、准备

如果还没有下载,请下载jOOQ:
http://www.jooq.org/download
或者,可是使用Maven:

<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq</artifactId>
<version>3.9.5</version>
</dependency>
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq-meta</artifactId>
<version>3.9.5</version>
</dependency>
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq-codegen</artifactId>
<version>3.9.5</version>
</dependency>

二、创建数据库

我们要创建一个名为library的数据库,和一个author表,在表中插入zhang3,li4数据。

CREATE DATABASE `library`;

USE `library`;

CREATE TABLE `author` (
`id` int NOT NULL,
`first_name` varchar(255) DEFAULT NULL,
`last_name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
); INSERT INTO `author` (`id`, `first_name`, `last_name`) VALUES ('1', '3', 'zhang'), ('2', '4', 'li');

三、代码生成

在这一步中,我们将使用jOOQ的命令行工具生成映射到author表的Java类。
有关jOOQ代码生成器的更详细信息,请参见:
jOOQ manual pages about setting up the code generator
代码生成的最简单的方法是将jOOQ的3个jar文件和MySQL Connector jar文件复制到一个临时目录(本示例中目录是test-generated), 然后创建一个如下所示的library.xml(名字随意修改)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration xmlns="http://www.jooq.org/xsd/jooq-codegen-3.9.2.xsd">
<!-- Configure the database connection here -->
<jdbc>
<driver>com.mysql.jdbc.Driver</driver>
<!-- 数据库url -->
<url>jdbc:mysql://localhost:3306/library?useUnicode=true&amp;characterEncoding=UTF-8</url>
<!-- 数据库账号 -->
<user>root</user>
<!-- 数据库账号密码 -->
<password>123456</password>
</jdbc> <generator>
<!-- The default code generator. You can override this one, to generate your own code style.
Supported generators:
- org.jooq.util.JavaGenerator
- org.jooq.util.ScalaGenerator
Defaults to org.jooq.util.JavaGenerator -->
<name>org.jooq.util.JavaGenerator</name> <database>
<!-- The database type. The format here is:
org.util.[database].[database]Database -->
<name>org.jooq.util.mysql.MySQLDatabase</name> <!-- The database schema (or in the absence of schema support, in your RDBMS this
can be the owner, user, database name) to be generated -->
<inputSchema>library</inputSchema> <!-- All elements that are generated from your schema
(A Java regular expression. Use the pipe to separate several expressions)
Watch out for case-sensitivity. Depending on your database, this might be important! -->
<includes>.*</includes> <!-- All elements that are excluded from your schema
(A Java regular expression. Use the pipe to separate several expressions).
Excludes match before includes, i.e. excludes have a higher priority -->
<excludes></excludes>
</database> <target>
<!-- The destination package of your generated classes (within the destination directory) -->
<!-- 生成的包名,生成的类在此包下 -->
<packageName>test.generated</packageName> <!-- The destination directory of your generated classes. Using Maven directory layout here -->
<!-- 输出的目录 -->
<directory>C:/workspace/jOOQ-User-Manual/jooq-tutorials-1/src/main/java</directory>
</target>
</generator>
</configuration>

在Windows中,cdtest-generated目录,执行以下命令:

注意jar包的版本号与您本地对应上,在这个例子中,jOOQ使用3.9.5,MySQL使用5.1.30。

java -classpath jooq-3.9.5.jar;jooq-meta-3.9.5.jar;jooq-codegen-3.9.5.jar;mysql-connector-java-5.1.30.jar; org.jooq.util.GenerationTool library.xml

UNIX / Linux / Mac中:

java -classpath jooq-3.9.5.jar:jooq-meta-3.9.5.jar:jooq-codegen-3.9.5.jar:mysql-connector-java-5.1.30.jar: org.jooq.util.GenerationTool library.xml

如果一切正常,您应该在控制台输出中看到这些信息:

七月 30, 2017 1:12:51 下午 org.jooq.tools.JooqLogger info
信息: Initialising properties : library.xml
七月 30, 2017 1:12:51 下午 org.jooq.tools.JooqLogger info
信息: No <inputCatalog/> was provided. Generating ALL available catalogs instead.
七月 30, 2017 1:12:51 下午 org.jooq.tools.JooqLogger info
信息: License parameters
七月 30, 2017 1:12:51 下午 org.jooq.tools.JooqLogger info
信息: ----------------------------------------------------------
七月 30, 2017 1:12:51 下午 org.jooq.tools.JooqLogger info
信息: Thank you for using jOOQ and jOOQ's code generator
七月 30, 2017 1:12:51 下午 org.jooq.tools.JooqLogger info
信息:
七月 30, 2017 1:12:51 下午 org.jooq.tools.JooqLogger info
信息: Database parameters
七月 30, 2017 1:12:51 下午 org.jooq.tools.JooqLogger info
信息: ----------------------------------------------------------
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: dialect : MYSQL
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: URL : jdbc:mysql://localhost:3306/library?useUnicode=true&characterEncoding=UTF-8
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: target dir : C:/workspace/jOOQ-User-Manual/jooq-tutorials-1/src/main/java
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: target package : test.generated
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: includes : [.*]
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: excludes : []
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: includeExcludeColumns : false
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: ----------------------------------------------------------
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息:
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: JavaGenerator parameters
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: ----------------------------------------------------------
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: strategy : class org.jooq.util.DefaultGeneratorStrategy
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: deprecated : true
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: generated annotation : true
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: JPA annotations : false
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: validation annotations : false
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: instance fields : true
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: sequences : true
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: udts : true
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: routines : true
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: tables : true
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: records : true
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: pojos : false
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: immutable pojos : false
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: interfaces : false
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: immutable interfaces : false
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: daos : false
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: relations : true
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: table-valued functions : true
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: global references : true
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: ----------------------------------------------------------
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息:
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: Generation remarks
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: ----------------------------------------------------------
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息:
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: ----------------------------------------------------------
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: Generating catalogs : Total: 1
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@ @@ @@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@
@@@@@@@@@@@@@@@@ @@ @@ @@@@@@@@@@
@@@@@@@@@@ @@@@ @@ @@ @@@@@@@@@@
@@@@@@@@@@ @@ @@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@ @@ @@@@@@@@@@
@@@@@@@@@@ @@ @@ @@@@ @@@@@@@@@@
@@@@@@@@@@ @@ @@ @@@@ @@@@@@@@@@
@@@@@@@@@@ @@ @ @ @@@@@@@@@@
@@@@@@@@@@ @@ @@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Thank you for using jOOQ 3.9.5 七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: ARRAYs fetched : 0 (0 included, 0 excluded)
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: Enums fetched : 0 (0 included, 0 excluded)
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: Packages fetched : 0 (0 included, 0 excluded)
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: Routines fetched : 0 (0 included, 0 excluded)
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: Tables fetched : 1 (1 included, 0 excluded)
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: No schema version is applied for catalog . Regenerating.
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息:
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: Generating catalog : DefaultCatalog.java
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: ==========================================================
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: Generating schemata : Total: 1
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: No schema version is applied for schema library. Regenerating.
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: Generating schema : Library.java
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: ----------------------------------------------------------
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: Sequences fetched : 0 (0 included, 0 excluded)
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: UDTs fetched : 0 (0 included, 0 excluded)
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: Generating tables
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: Synthetic primary keys : 0 (0 included, 0 excluded)
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: Overriding primary keys : 1 (0 included, 1 excluded)
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: Generating table : Author.java [input=author, output=author, pk=KEY_author_PRIMARY]
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: Tables generated : Total: 819.168ms
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: Generating table references
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: Table refs generated : Total: 827.491ms, +8.323ms
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: Generating Keys
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: Keys generated : Total: 835.486ms, +7.995ms
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: Generating table records
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: Generating record : AuthorRecord.java
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: Table records generated : Total: 854.667ms, +19.18ms
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: Domains fetched : 0 (0 included, 0 excluded)
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: Generation finished: library: Total: 860.822ms, +6.155ms
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息:
七月 30, 2017 1:12:52 下午 org.jooq.tools.JooqLogger info
信息: Removing excess files

四、连接到您的数据库

我们在工程中编写一个测试类Main.java

package test.generated;

import java.sql.Connection;
import java.sql.DriverManager; /**
* 测试类
* Created by jan on 2017/7/30.
*/
public class Main {
public static void main(String[] args) {
// 用户名
String userName = "root";
// 密码
String password = "123456";
// mysql连接url
String url = "jdbc:mysql://localhost:3306/library?useUnicode=true&characterEncoding=UTF-8"; // Connection is the only JDBC resource that we need
// PreparedStatement and ResultSet are handled by jOOQ, internally
try (Connection conn = DriverManager.getConnection(url, userName, password)) {
// ...
} // For the sake of this tutorial, let's keep exception handling simple
catch (Exception e) {
e.printStackTrace();
}
}
}

这是一个标准的JDBC MySQL连接代码。

五、查询

我们使用jOOQ的DSL构建出一个简单查询:

DSLContext create = DSL.using(conn, SQLDialect.MYSQL);
Result<Record> result = create.select().from(AUTHOR).fetch();

传入Connection连接对象数据方言得到一个DSLContext的实例,然后使用DSL对象查询得到一个Result对象。

注意:DSLContext不会主动关闭连接,需要我们手动关闭。

六、输出结果

得到Result对象后,循环输出结果集:

for (Record r : result) {
Integer id = r.getValue(AUTHOR.ID);
String firstName = r.getValue(AUTHOR.FIRST_NAME);
String lastName = r.getValue(AUTHOR.LAST_NAME); System.out.println("ID: " + id + " first name: " + firstName + " last name: " + lastName);
}

完成的代码应该是这样的:

package test.generated;

import org.jooq.DSLContext;
import org.jooq.Record;
import org.jooq.Result;
import org.jooq.SQLDialect;
import org.jooq.impl.DSL; import java.sql.Connection;
import java.sql.DriverManager; import static test.generated.tables.Author.AUTHOR; /**
* 测试类
* Created by jan on 2017/7/30.
*/
public class Main {
public static void main(String[] args) {
// 用户名
String userName = "root";
// 密码
String password = "123456";
// mysql连接url
String url = "jdbc:mysql://localhost:3306/library?useUnicode=true&characterEncoding=UTF-8"; // Connection is the only JDBC resource that we need
// PreparedStatement and ResultSet are handled by jOOQ, internally
try (Connection conn = DriverManager.getConnection(url, userName, password)) {
DSLContext create = DSL.using(conn, SQLDialect.MYSQL);
Result<Record> result = create.select().from(AUTHOR).fetch(); for (Record r : result) {
Integer id = r.getValue(AUTHOR.ID);
String firstName = r.getValue(AUTHOR.FIRST_NAME);
String lastName = r.getValue(AUTHOR.LAST_NAME); /**
* 控制台输出
* ID: 1 first name: 3 last name: zhang
* ID: 2 first name: 4 last name: li
*/
System.out.println("ID: " + id + " first name: " + firstName + " last name: " + lastName);
} // 关闭连接对象
conn.close();
}
// For the sake of this tutorial, let's keep exception handling simple
catch (Exception e) {
e.printStackTrace();
}
}
}

七、更多示例

jOOQ已经是一个全面的SQL库,更多学习文档请参考:


【jOOQ中文】教程代码都会放在码云,希望多多宣传给Star(^_−)☆。

[jOOQ中文] 七个步骤快速入门的更多相关文章

  1. Expression Blend实例中文教程(2) - 界面快速入门

    上一篇主要介绍Expression系列产品,另外概述了Blend的强大功能,本篇将用Blend 3创建一个新Silverlight项目,通过创建的过程,对Blend进行快速入门学习. 在开始使用Ble ...

  2. Expression Blend实例中文教程(9) - 行为快速入门Behaviors

    在Blend强大的设计功能支持下,设计人员和开发人员可以无代码实现Silverlight/WPF动画效果,例如上文介绍的StoryBoard,就是一个典型例子,设计人员和开发人员仅需提供必要元素,即可 ...

  3. Spark(七) -- Scala快速入门

    Scala作为Spark的开发语言,想要成为Spark高手,精通Scala是必须要走的一条路 然后一门语言并不是你想精通就能够精通的,更何况是Scala这种面向对象又面向函数的编程语言,个人觉得其学习 ...

  4. 1.搜索引擎的历史,搜索引擎起步,发展,繁荣,搜索引擎的原理,搜索技术用途,信息检索过程,倒排索引,什么是Lucene,Lucene快速入门

     一: 1  搜索引擎的历史 萌芽:Archie.Gopher Archie:搜索FTP服务器上的文件 Gopher:索引网页 2  起步:Robot(网络机器人)的出现与spider(网络爬虫) ...

  5. Gradle 1.12 翻译——第九章 Groovy快速入门

    由于时间关系,没办法同时做笔记和翻译,关于Gradle的用户指南,本博客不再做相关笔记,而只对未翻译章节进行翻译并在此发表. 有关其他已翻译的章节请关注Github上的项目:https://githu ...

  6. Expression Blend实例中文教程(11) - 视觉管理器快速入门Visual State Manager(VSM)

    Visual State Manager,中文又称视觉状态管理器(简称为VSM),是Silverlight 2中引进的一个概念.通过使用VSM,开发人员和设计人员可以轻松的改变项目控件的视觉效果,在项 ...

  7. Expression Blend实例中文教程(3) - 布局控件快速入门Grid

    上一篇对Blend 3开发界面进行了快速入门介绍,本篇将基于Blend 3介绍Silverlight控件.对于微软开发工具熟悉的朋友,相信您很快就熟悉Blend的开发界面和控件. XAML概述 Sil ...

  8. Expression Blend实例中文教程(11) - 视觉管理器快速入门Visual State Manager(VSM)

    Expression Blend实例中文教程(11) - 视觉管理器快速入门Visual State Manager(V 时间:2010-04-12 16:06来源:SilverlightChina. ...

  9. Expression Blend实例中文教程(8) - 动画设计快速入门StoryBoard http://silverlightchina.net/html/tips/2010/0329/934.html

    Expression Blend实例中文教程(8) - 动画设计快速入门StoryBoard 时间:2010-03-29 11:13来源:SilverlightChina.Net 作者:jv9 点击: ...

随机推荐

  1. 解决xshell乱码问题

    如下图,xshell在执行命令时显示乱码 解决办法: 文件—属性—终端,将编码改成Unicode即可 参考文章 https://blog.csdn.net/yueloveme/article/deta ...

  2. gruntjs开发实例

    Grunt是基于Node.js的项目构建工具.它可以自动运行你所设定的任务,如编译less,sass,压缩js,合拼文件等等. (一)安装nodejs环境,Grunt 0.4.x要求Node.js的版 ...

  3. 【git】提交到github不显示贡献小绿点问题的解决

    问题描述: 最近一直在用github来写博客,但是今天发现github上的contributions记录并没有我的提交记录. 经过一番百度和自行捣鼓发现了问题所在. 原因: 最近实习,公司给配电脑.原 ...

  4. java- Collection Map集合

    package map; import java.util.Collection; import java.util.HashMap; import java.util.Map; import jav ...

  5. 【linux】linux无root权限安装包的一般流程

    apt-get source PACKAGE ./configure --prefix=$HOME/myapps make make install

  6. .NET 中让 Task 支持带超时的异步等待

    Task 自带有很多等待任务完成的方法,有的是实例方法,有的是静态方法.有的阻塞,有的不阻塞.不过带超时的方法只有一个,但它是阻塞的. 本文将介绍一个非阻塞的带超时的等待方法.   Task 已有的等 ...

  7. flask第二十一篇——练习题

    自定义url转化器 实现一个自定义的URL转换器,这个转换器需要满足的是获取从多少到多少的url,例如,你输入的地址是http://127.0.0.1:8000/1-5/,那么页面返回[1,2,3,4 ...

  8. LeetCode OJ - Best Time to Buy and Sell Stock

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/xiezhihua120/article/details/32939749 Say you have ...

  9. 随笔:关于 FastAdmin ueditor 插件 中的 rand mt_rand mt_getrandmax 问题

    随笔:关于 FastAdmin ueditor 插件 中的 rand mt_rand mt_getrandmax 问题 问题来源 一位小伙伴在使用 Ueditor 插件时出错,因为用的是 php7.1 ...

  10. Linux进程间通信——使用信号量(转)

    这篇文章将讲述别一种进程间通信的机制——信号量.注意请不要把它与之前所说的信号混淆起来,信号与信号量是不同的两种事物.有关信号的更多内容,可以阅读我的另一篇文章:Linux进程间通信——使用信号.下面 ...