jooq中record_在Spring中使用jOOQ:CRUD

jooq中record

jOOQ是一个库,可帮助我们重新控制SQL。 它可以从我们的数据库生成代码,并允许我们使用其流畅的API来构建类型安全的数据库查询。

本教程前面的部分向我们介绍了如何配置示例应用程序的应用程序上下文以及如何从数据库中生成代码。

现在,我们准备向前迈出一步,学习如何使用jOOQ创建类型安全查询。 这篇博客文章描述了如何将CRUD操作添加到管理待办事项的简单应用程序中。


让我们开始吧。

补充阅读:

  • 将jOOQ与Spring结合使用:配置是本教程的第一部分,它描述了您可以配置使用jOOQ的Spring应用程序的应用程序上下文。 您可以在不阅读本教程第一部分的情况下了解此博客文章,但是,如果您想在Spring支持的应用程序中真正使用jOOQ,建议您也阅读本教程的第一部分。
  • 将jOOQ与Spring结合使用:代码生成是本教程的第二部分,它描述了如何对数据库进行反向工程并创建代表不同数据库表,记录等的jOOQ查询类。 因为这些类是类型安全SQL查询的构建块, 所以建议您在阅读本博客文章之前阅读本教程的第二部分

创建Todo类

让我们从创建一个包含单个待办事项条目信息的类开始。 此类具有以下字段:

  • ID字段包含待办事项的ID。
  • creationTime字段包含一个时间戳,该时间戳描述了todo条目第一次被持久保存的时间。
  • 描述字段包含待办事项的描述。
  • ModifyTime字段包含一个时间戳,该时间戳描述了待办事项条目的更新时间。
  • 标题字段包含待办事项的标题。

这个相对简单的类的名称为Todo ,它遵循以下三个原则:

  • 我们可以使用Joshua Bloch在Effective Java中描述的构建器模式来创建新的Todo对象。 如果您不熟悉此模式,则应阅读标题为项目2的文章:面对许多构造函数参数时,请考虑使用构建器 。
  • 标题字段是必填字段,我们不能创建标题为空或为空的新Todo对象。 如果我们尝试创建标题无效的Todo对象,则会抛出IllegalStateException
  • 此类是不可变的。 换句话说,其所有字段都声明为final

Todo类的源代码如下所示:

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.joda.time.LocalDateTime;import java.sql.Timestamp;public class Todo {private final Long id;private final LocalDateTime creationTime;private final String description;private final LocalDateTime modificationTime;private final String title;private Todo(Builder builder) {this.id = builder.id;LocalDateTime creationTime = null;if (builder.creationTime != null) {creationTime = new LocalDateTime(builder.creationTime);}this.creationTime = creationTime;this.description = builder.description;LocalDateTime modificationTime = null;if (builder.modificationTime != null) {modificationTime = new LocalDateTime(builder.modificationTime);}this.modificationTime = modificationTime;this.title = builder.title;}public static Builder getBuilder(String title) {return new Builder(title);}//Getters are omitted for the sake of clarity.public static class Builder {private Long id;private Timestamp creationTime;private String description;private Timestamp modificationTime;private String title;public Builder(String title) {this.title = title;}public Builder description(String description) {this.description = description;return this;}public Builder creationTime(Timestamp creationTime) {this.creationTime = creationTime;return this;}public Builder id(Long id) {this.id = id;return this;}public Builder modificationTime(Timestamp modificationTime) {this.modificationTime = modificationTime;return this;}public Todo build() {Todo created = new Todo(this);String title = created.getTitle();if (title == null || title.length() == 0) {throw new IllegalStateException("title cannot be null or empty");}return created;}}
}

让我们找出为什么我们需要获取当前日期和时间,更重要的是,什么是最好的方法。

获取当前日期和时间

因为每个待办事项的创建时间和修改时间都存储在数据库中,所以我们需要一种获取当前日期和时间的方法。 当然,我们可以简单地在存储库中创建此信息。 问题是,如果这样做,我们将无法编写自动测试来确保正确设置了创建时间和修改时间(我们无法为这些字段编写断言,因为它们的值取决于当前时间) 。

这就是为什么我们需要创建一个单独的组件来负责返回当前日期和时间的原因。 DateTimeService接口声明了以下两种方法:

  • getCurrentDateTime()方法将当前日期和时间作为LocalDateTime对象返回。
  • getCurrentTimestamp()方法将当前日期和时间作为Timestamp对象返回。

DateTimeService接口的源代码如下所示:

import org.joda.time.LocalDateTime;
import java.sql.Timestamp;public interface DateTimeService {public LocalDateTime getCurrentDateTime();public Timestamp getCurrentTimestamp();
}

因为我们的应用程序对“实时”感兴趣,所以我们必须实现此接口并创建一个返回实际日期和时间的组件。 我们可以按照以下步骤进行操作:

  1. 创建一个实现DateTimeService接口的CurrentTimeDateTimeService类。
  2. @Profile注释为类添加注释,并将配置文件的名称设置为“ application”。 这意味着,当活动的Spring配置文件为“应用程序”时,可以将组件注册到Spring容器。
  3. @Component注释对类进行注释。 这样可以确保在类路径扫描期间找到该类。
  4. 实现在DateTimeService接口中声明的方法。 每个方法都必须返回当前日期和时间。

CurrentTimeDateTimeService的源代码如下所示:

import org.joda.time.LocalDateTime;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;import java.sql.Timestamp;@Profile("application")
@Component
public class CurrentTimeDateTimeService implements DateTimeService {@Overridepublic LocalDateTime getCurrentDateTime() {return LocalDateTime.now();}@Overridepublic Timestamp getCurrentTimestamp() {return new Timestamp(System.currentTimeMillis());}
}

让我们继续并开始实现示例应用程序的存储库层。

实施存储库层

首先,我们创建一个存储库接口,该接口为待办事项提供CRUD操作。 该接口声明了以下五种方法:

  • Todo add(Todo todoEntry)方法将新的todo条目保存到数据库中,并返回保存的todo条目的信息。
  • Todo delete(Long id)方法删除一个待办事项,并返回已删除的待办事项。
  • List findAll()方法返回从数据库中找到的所有待办事项条目。
  • Todo findById(Long id)返回单个todo条目的信息。
  • Todo更新(Todo todoEntry)更新待办事项的信息并返回更新后的待办事项。

TodoRepository接口的源代码如下所示:

import java.util.List;public interface TodoRepository {public Todo add(Todo todoEntry);public Todo delete(Long id);public List<Todo> findAll();public Todo findById(Long id);public Todo update(Todo todoEntry);
}

接下来,我们必须实现TodoRepository接口。 当我们这样做时,我们必须遵循以下规则:

jOOQ创建的所有数据库查询都必须在事务内执行 。 这是因为我们的应用程序使用TransactionAwareDataSourceProxy类 ,并且如果我们在没有事务的情况下执行数据库查询,则jOOQ将为每个操作使用不同的连接。 这可能会导致竞赛条件错误。

通常,服务层充当事务边界,并且对jOOQ存储库的每次调用都应在事务内部进行。 但是,由于程序员也会犯错误,因此我们不能相信情况就是如此。 这就是为什么我们必须使用@Transactional批注来批注存储库类或其方法。

既然已经了解了这一点,就可以创建存储库类了。

创建存储库类

我们可以按照以下步骤创建存储库类的“骨架”:

  1. 创建一个JOOQTodoRepository类并实现TodoRepository接口。
  2. @Repository批注对类进行批注。 这样可以确保在类路径扫描期间找到该类。
  3. DateTimeService字段添加到创建的类。 我们记得, DateTimeService接口声明用于获取当前日期和时间的方法。
  4. DSLContext字段添加到创建的类。 该接口充当jOOQ API的入口点,我们可以使用它来构建SQL查询。
  5. 将公共构造函数添加到创建的类中,并使用@Autowired注释对构造函数进行注释。 这可以确保通过使用构造函数注入来注入存储库的依赖项。
  6. 将私有的Todo convertQueryResultToModelObject(TodosRecord queryResult)方法添加到存储库类。 此实用程序方法由我们的存储库类的公共方法使用。 通过执行以下步骤来实现此方法:
    1. 通过使用作为方法参数给出的TodosRecord对象的信息来创建新的Todo对象。
    2. 返回创建的对象。

JOOQTodoRepository类的相关部分如下所示:

import net.petrikainulainen.spring.jooq.todo.db.tables.records.TodosRecord;
import org.jooq.DSLContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;@Repository
public class JOOQTodoRepository implements TodoRepository {private final DateTimeService dateTimeService;private final DSLContext jooq;@Autowiredpublic JOOQTodoRepository(DateTimeService dateTimeService, DSLContext jooq) {this.dateTimeService = dateTimeService;this.jooq = jooq;}private Todo convertQueryResultToModelObject(TodosRecord queryResult) {return Todo.getBuilder(queryResult.getTitle()).creationTime(queryResult.getCreationTime()).description(queryResult.getDescription()).id(queryResult.getId()).modificationTime(queryResult.getModificationTime()).build();}
}

让我们继续并实现为待办事项提供CRUD操作的方法。

添加新的待办事项

TodoRepository接口的公共Todo add(Todo todoEntry)方法用于向数据库添加新的todo条目。 我们可以通过执行以下步骤来实现此方法:

  1. 将一个私有TodosRecord createRecord(Todo todoEntry)方法添加到存储库类,并按照以下步骤实现此方法:
    1. 通过调用DateTimeService接口的getCurrentTimestamp()方法获取当前日期和时间。
    2. 创建一个新的TodosRecord对象,并使用作为方法参数给出的Todo对象的信息来设置其字段值。
    3. 返回创建的TodosRecord对象。
  2. add()方法添加JOOQTodoRepository类中,并使用@Transactional注释对方法进行注释。 这样可以确保INSERT语句在读写事务中执行。
  3. 通过执行以下步骤来实现add()方法:
    1. 通过执行以下步骤将新的待办事项条目添加到数据库:
      1. 通过调用DSLContext接口的insertInto(Table table)方法来创建新的INSERT语句,并指定要向todos表中插入信息。
      2. 通过调用createRecord()方法创建一个新的TodosRecord对象。 将Todo对象作为方法参数传递。
      3. 通过调用InsertSetStep接口的set(Record record)方法来设置插入的信息。 将创建的TodosRecord对象作为方法参数传递。
      4. 通过调用InsertReturningStep接口的returning()方法,确保INSERT查询返回所有插入的字段。
      5. 通过调用InsertResultStep接口的fetchOne ()方法,获取包含所有插入字段的值的TodosRecord对象。
    2. 通过调用convertQueryResultToModelObject()方法,将INSERT语句返回的TodosRecord对象转换为Todo对象。
    3. 返回创建的Todo对象。

JOOQTodoRepository类的相关部分如下所示:

import net.petrikainulainen.spring.jooq.todo.db.tables.records.TodosRecord;
import org.jooq.DSLContext;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;import java.sql.Timestamp;import static net.petrikainulainen.spring.jooq.todo.db.tables.Todos.TODOS;@Repository
public class JOOQTodoRepository implements TodoRepository {private final DateTimeService dateTimeService;private final DSLContext jooq;//The constructor is omitted for the sake of clarity@Transactional@Overridepublic Todo add(Todo todoEntry) {TodosRecord persisted = jooq.insertInto(TODOS).set(createRecord(todoEntry)).returning().fetchOne();return convertQueryResultToModelObject(persisted);}private TodosRecord createRecord(Todo todoEntry) {Timestamp currentTime = dateTimeService.getCurrentTimestamp();TodosRecord record = new TodosRecord();record.setCreationTime(currentTime);record.setDescription(todoEntry.getDescription());record.setModificationTime(currentTime);record.setTitle(todoEntry.getTitle());return record;}private Todo convertQueryResultToModelObject(TodosRecord queryResult) {return Todo.getBuilder(queryResult.getTitle()).creationTime(queryResult.getCreationTime()).description(queryResult.getDescription()).id(queryResult.getId()).modificationTime(queryResult.getModificationTime()).build();}
}

4.3.3节。 jOOQ参考手册的INSERT语句提供了有关将数据插入数据库的其他信息。

让我们继续前进,找出如何找到存储在数据库中的所有条目。

查找所有待办事项

TodoRepository接口的公共List findAll()方法返回所有存储在数据库中的待办事项。 我们可以通过执行以下步骤来实现此方法:

  1. findAll()方法添加到存储库类,并使用@Transactional批注对该方法进行批注。 将其readOnly属性的值设置为true 。 这样可以确保SELECT语句在只读事务中执行。
  2. 通过执行以下步骤从数据库获取所有待办事项条目:
    1. 通过调用DSLContext接口的selectFrom(Table table)方法来创建新的SELECT语句,并指定要从todos表中选择信息。
    2. 通过调用ResultQuery接口的fetchInto(Class type)方法获取TodosRecord对象的列表。
  3. 迭代返回的TodosRecord对象列表,并通过调用convertQueryResultToModelObject()方法将每个TodosRecord对象转换为Todo对象。 每个ToDo对象添加到的Todo对象的列表。
  4. 返回包含找到的Todo对象的列表

JOOQTodoRepository类的相关部分如下所示:

import net.petrikainulainen.spring.jooq.todo.db.tables.records.TodosRecord;
import org.jooq.DSLContext;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;import java.util.ArrayList;
import java.util.List;import static net.petrikainulainen.spring.jooq.todo.db.tables.Todos.TODOS;@Repository
public class JOOQTodoRepository implements TodoRepository {private final DSLContext jooq;//The constructor is omitted for the sake of clarity@Transactional(readOnly = true)@Overridepublic List<Todo> findAll() {List<Todo> todoEntries = new ArrayList<>();List<TodosRecord> queryResults = jooq.selectFrom(TODOS).fetchInto(TodosRecord.class);for (TodosRecord queryResult: queryResults) {Todo todoEntry = convertQueryResultToModelObject(queryResult);todoEntries.add(todoEntry);}return todoEntries;}private Todo convertQueryResultToModelObject(TodosRecord queryResult) {return Todo.getBuilder(queryResult.getTitle()).creationTime(queryResult.getCreationTime()).description(queryResult.getDescription()).id(queryResult.getId()).modificationTime(queryResult.getModificationTime()).build();}
}

4.3.2节。 jOOQ参考手册的SELECT语句提供了有关从数据库中选择信息的更多信息。

接下来,我们将找到如何从数据库中获得一个待办事项。

查找单个待办事项

TodoRepository接口的公共Todo findById(Long id)方法返回单个todo条目的信息。 我们可以通过执行以下步骤来实现此方法:

  1. 在存储库类中添加findById()方法,并使用@Transactional注释对方法进行注释。 将其readOnly属性的值设置为true。 这样可以确保SELECT语句在只读事务中执行。
  2. 通过执行以下步骤,从数据库中获取单个待办事项的信息:
    1. 通过调用DSLContext接口的selectFrom(Table table)方法来创建新的SELECT语句,并指定要从todos表中选择信息。
    2. 通过调用SelectWhereStep接口的where(Collection condition)方法来指定SELECT语句的WHERE子句。 确保SELECT语句仅返回ID作为方法参数给出的todo条目。
    3. 通过调用ResultQuery接口的fetchOne ()方法来获取TodosRecord对象。
  3. 如果返回的TodosRecord对象为null,则表示未找到具有给定id的todo条目。 如果是这种情况,请抛出一个新的TodoNotFoundException
  4. 通过调用convertQueryResultToModelObject()方法,将SELECT语句返回的TodosRecord对象转换为Todo对象。
  5. 返回创建的Todo对象。

JOOQTodoRepository的相关部分如下所示:

import net.petrikainulainen.spring.jooq.todo.db.tables.records.TodosRecord;
import org.jooq.DSLContext;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;import static net.petrikainulainen.spring.jooq.todo.db.tables.Todos.TODOS;@Repository
public class JOOQTodoRepository implements TodoRepository {private final DSLContext jooq;//The constructor is omitted for the sake of clarity.@Transactional(readOnly = true)@Overridepublic Todo findById(Long id) {TodosRecord queryResult = jooq.selectFrom(TODOS).where(TODOS.ID.equal(id)).fetchOne();if (queryResult == null) {throw new TodoNotFoundException("No todo entry found with id: " + id);}return convertQueryResultToModelObject(queryResult);}private Todo convertQueryResultToModelObject(TodosRecord queryResult) {return Todo.getBuilder(queryResult.getTitle()).creationTime(queryResult.getCreationTime()).description(queryResult.getDescription()).id(queryResult.getId()).modificationTime(queryResult.getModificationTime()).build();}
}

4.3.2节。 jOOQ参考手册的SELECT语句提供了有关从数据库中选择信息的更多信息。

让我们找出如何从数据库中删除待办事项。

删除待办事项

TodoRepository接口的公共Todo delete(Long id)方法用于从数据库中删除一个todo条目。 我们可以通过执行以下步骤来实现此方法:

  1. delete()方法添加到存储库类中,并使用@Transactional批注对该方法进行批注。 这确保了DELETE语句在读写事务内执行。
  2. 通过执行以下步骤来实现此方法:
    1. 通过调用findById(Long id)方法来查找已删除的Todo对象。 将已删除的待办事项条目的ID作为方法参数传递。
    2. 通过执行以下步骤从数据库中删除待办事项条目:
      1. 通过调用DSLContext接口的delete(Table table)方法来创建新的DELETE语句,并指定要从todos表中删除信息。
      2. 通过调用DeleteWhereStep接口的where(Collection condition)方法,指定DELETE语句的WHERE子句。 确保DELETE语句删除ID为方法参数的待办事项。
      3. 通过调用Query接口的execute()方法执行 DELETE语句。
    3. 返回已删除的待办事项条目的信息。

JOOQTodoRepository类的相关部分如下所示:

import net.petrikainulainen.spring.jooq.todo.db.tables.records.TodosRecord;
import org.jooq.DSLContext;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;import static net.petrikainulainen.spring.jooq.todo.db.tables.Todos.TODOS;@Repository
public class JOOQTodoRepository implements TodoRepository {private final DSLContext jooq;//The constructor is omitted for the sake of clarity@Transactional@Overridepublic Todo delete(Long id) {Todo deleted = findById(id);int deletedRecordCount = jooq.delete(TODOS).where(TODOS.ID.equal(id)).execute();return deleted;}
}

第4.3.5节。 jOOQ参考手册的DELETE语句提供了有关从数据库中删除数据的其他信息。

让我们继续前进,找出如何更新现有待办事项的信息。

更新现有的Todo条目

TodoRepository接口的公共Todo update(Todo todoEntry)方法将更新现有todo条目的信息。 我们可以通过执行以下步骤来实现此方法:

  1. update()方法添加到存储库类中,并使用@Transactional注释对方法进行注释。 这样可以确保UPDATE语句在读写事务中执行。
  2. 通过调用DateTimeService接口的getCurrentTimestamp()方法获取当前日期和时间。
  3. 通过执行以下步骤来更新待办事项的信息:
    1. 通过调用DSLContext接口的update(Table table)方法来创建新的UPDATE语句,并指定您要更新从todos表中找到的信息。
    2. 通过调用UpdateSetStep接口的set(Field field,T value)方法来设置新的描述,修改时间和标题。
    3. 通过调用UpdateWhereStep接口的where(Collection condition)方法,指定UPDATE语句的WHERE子句。 确保UPDATE语句更新待办事项条目,该待办事项条目是从作为方法参数给出的Todo对象中找到的。
    4. 通过调用Query接口的execute()方法执行UPDATE语句。
  4. 通过调用findById()方法获取更新的待办事项条目的信息。 将更新的待办事项条目的ID作为方法参数传递。
  5. 返回更新的待办事项条目的信息。

JOOQTodoRepository类的相关部分如下所示:

import org.jooq.DSLContext;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;import java.sql.Timestamp;import static net.petrikainulainen.spring.jooq.todo.db.tables.Todos.TODOS;@Repository
public class JOOQTodoRepository implements TodoRepository {private final DateTimeService dateTimeService;private final DSLContext jooq;//The constructor is omitted for the sake of clarity.@Transactional@Overridepublic Todo update(Todo todoEntry) {Timestamp currentTime = dateTimeService.getCurrentTimestamp();int updatedRecordCount = jooq.update(TODOS).set(TODOS.DESCRIPTION, todoEntry.getDescription()).set(TODOS.MODIFICATION_TIME, currentTime).set(TODOS.TITLE, todoEntry.getTitle()).where(TODOS.ID.equal(todoEntry.getId())).execute();return findById(todoEntry.getId());}
}
  • 第4.3.4节。 jOOQ参考手册的UPDATE语句提供了有关更新存储在数据库中的信息的其他信息。
  • 如果您使用的是Firebird或PostgreSQL数据库,则可以在update语句中使用RETURNING子句 (并避免使用额外的select子句)。

就这些了。 让我们总结一下我们从此博客文章中学到的知识。

摘要

现在,我们已经为待办事项实现了CRUD操作。 本教程教会了我们三件事:

  • 我们了解了如何以不妨碍我们为示例应用程序编写自动测试的方式获取当前日期和时间。
  • 我们了解了如何确保jOOQ执行的所有数据库查询都在事务内执行。
  • 我们学习了如何使用jOOQ API创建INSERTSELECTDELETEUPDATE语句。

本教程的下一部分描述了如何向示例应用程序添加支持排序和分页的搜索功能。

  • 可以在Github上获得此博客文章的示例应用程序(尚未实现前端)。

翻译自: https://www.javacodegeeks.com/2014/04/using-jooq-with-spring-crud.html

jooq中record

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

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

相关文章

E1 PCM复用设备作用

Pulse Code Modulation&#xff08;PCM&#xff09;&#xff0c;中文称脉码调制或PCM复用设备&#xff0c;PCM复用设备的目的就是使交换机之间一条中继线不是只传送一条电话信号。 PCM复用设备也就是将语音&#xff0c;数据信号复接成2M信号的设备&#xff0c;直白一点就是将如…

变色龙功能

在《神秘博士》中&#xff0c;卡梅利恩&#xff08;Kamelion&#xff09;角色是可以采取任何形式的机器人。 据称&#xff0c;他们使用的物理道具非常麻烦&#xff0c;只有其创建者才能理解&#xff0c;而该创建者并没有帮助纠正它。 因此&#xff0c;Chamelion功能... 考虑以…

E1常见问题介绍

1. E1与CE1是由谁控制&#xff0c;电信还是互连的两侧的用户设备&#xff1f;用户侧肯定要求支持他们,电信又是如何分别实现的&#xff1f; 答&#xff1a;首先由电信决定&#xff0c;电信可提供E1和CE1两种线路&#xff0c;但一般用户的E1线路都是CE1&#xff0c;除非你特别要…

MSTP多业务传输平台对设备接口的要求有哪些?

MSTP&#xff08;Multi-Service Transfer Platform&#xff09;&#xff08;基于SDH 的多业务传送平台&#xff09;是指基于SDH 平台同时实现TDM、ATM、以太网等业务的接入、处理和传送&#xff0c;提供统一网管的多业务节点。 MSTP的实现基础是充分利用SDH技术对传输业务数据…

jibx_Jibx Jersey2集成

jibxJersey2为Jackson和JAXB提供内置支持。 但是默认情况下不支持Jibx。 要将Jibx与Jersey2结合使用&#xff0c;我们将XML输入作为流&#xff0c;并在接收到请求之后&#xff0c;使用Jibx对其进行解析。 但是实际上&#xff0c;有更好的方法可以使用MessageBodyReader和Messag…

PCM复用设备的安装和使用注意事项

PCM设备在通信系统中的是一种很常用的设备&#xff0c;但是不少用户在购买了PCM设备后&#xff0c;都不懂怎么去安装使用PCM复用设备。下面&#xff0c;飞畅科技的小编来为大家详细介绍下PCM复用设备的安装和使用注意事项&#xff0c;一起来看看吧&#xff01; PCM复用设备的安…

PCM复用设备功能介绍

PCM设备功能主要分为四大部分&#xff1a;接入与复用、时隙交叉、2M线路保护、接口测试功能。接下来就由飞畅科技的小编来为大家详细介绍下PCM复用设备的功能&#xff0c;一起来看看吧&#xff01; PCM复用功能&#xff1a; 用户业务接入与复用是PCM设备最基本的功能&#xff…

对象和索引流

我本来要写一篇关于如何将流与每个元素的索引混合的文章&#xff0c;但是Baeldung上的人们已经很好地涵盖了这个主题 &#xff01; 鉴于我是他们编辑团队的一员&#xff0c;我为他们/我们感到自豪。 有趣的是&#xff0c;特别是Streams中的Java函数式编程如何使我们脱离了一些…

PCM复用设备主要传输什么业务?

PCM即脉冲编码调制&#xff0c;在通信系统中完成将语音信号数字化功能。PCM的实现主要包括三个步骤完成&#xff1a;抽样、量化、编码。分别完成时间上离散、幅度上离散、及量化信号的二进制表示。 1、 抽样&#xff1a;所谓抽样&#xff0c;就是对模拟信号进行周期性扫描&…

Pcm设备2M通道,E1的基础知识介绍

Pcm设备2M通道在业内常简述为E1&#xff0c;E1这个词在通信行业起着非常重要的作用&#xff0c;相信刚接触这个词的人必定会感到陌生。接下来就由飞畅科技的小编来为您详细的介绍一下E1的基础知识。 一、E1概述 E1是ITU-T制定并由欧洲邮政与电信协会&#xff08;CEPT&#xff…

数据结构栈的知识_数据知识栈

数据结构栈的知识并发不适合胆小者 我们都知道并发编程很难正确实现。 这就是为什么在执行线程任务之后要进行大量的设计和代码审查会议。 您永远不会将并发问题分配给经验不足的开发人员。 仔细分析问题空间&#xff0c;提出设计&#xff0c;并记录和审查解决方案。 这就是通…

PCM设备E1保护切换功能介绍

脉冲编码调制&#xff08;PulseCodeModulation&#xff09;&#xff0c;简称PCM。是对连续变化的模拟信号进行抽样、量化和编码产生的数字信号。PCM的优点就是音质好&#xff0c;缺点就是体积大。PCM可以提供用户从2M到155M速率的数字数据专线业务&#xff0c;也可以提供话音、…

在Eclipse中使用Java 12

1.安装JDK 12 链接&#xff1a; https &#xff1a; //www.oracle.com/technetwork/java/javase/downloads/jdk12-downloads-5295953.html 2.安装Eclipse 4.11 链接&#xff1a; https &#xff1a; //download.eclipse.org/eclipse/downloads/drops4/R-4.11-201903070500 …

PCM设备的作用,为什么要选用PCM设备?

PCM设备在通信系统中是利用E1&#xff08;2M&#xff09;线路进行传输多种业务数据的基群设备。但是不少用户在开始使用之前&#xff0c;并不能确定PCM能否满足他的需求&#xff0c;也不清楚有PCM这样的一个名词。接下来飞畅科技的小编来为大家介绍下PCM设备的作用&#xff0c;…

RS485光纤中继器有哪些优缺点?

信号在传输过程中会不断衰减&#xff0c;为了不让信号衰减对通信产生影响&#xff0c;产生了中继器。仅做放大信号用&#xff0c;把信号传导偏远的地方。 中继器又被称为转换器或放大器&#xff0c;执行物理层协议&#xff0c;负责第一层&#xff08;物理层&#xff09;的数据中…

intellij注释模板_IntelliJ中的实时模板

intellij注释模板如上所述这里 &#xff0c;的IntelliJ的现场模板可以让你轻松地插入预定义的代码片段到你的源代码。 我在下面发布了一些我最常用的模板&#xff0c;链接到我在GitHub上的模板文件的完整列表&#xff08;作为设置新IntelliJ环境时的参考&#xff09;&#xff…

485转换器产品功能特点及技术参数介绍

485转换器主要的作用是将单端的RS-232信号转换为平衡差分的RS-485或RS-422信号。RS-485、RS-422自动识别功能&#xff0c;使用更加简单。接下来就由飞畅科技的小编来为大家详细介绍下485转换器的产品功能特点及技术参数&#xff0c;一起来看看吧&#xff01; 485转换器产品特点…

无浪费编码

本文介绍了如何通过减少软件堆栈中的浪费来高效解决有意义的事件处理问题。 Java通常被视为无法在低内存环境中高效运行的内存猪。 目的是证明许多人认为不可能的事情&#xff0c;有意义的java程序几乎可以在没有内存的情况下运行。 示例流程 在Java的单个线程上&#xff0c;…

485光纤转换器产品分类介绍

485转换器用于点对点、点对多点通讯、工业控制自动化、道路交通控制自动化、智能卡、考勤、门禁、售饭系统、工业集散分布系统、闭路监控、安防系统、POS系统、楼宇自控系统、自助银行系统。接下来就由飞畅科技的小编来为大家详细介绍下485转换器的分类&#xff0c;一起来看看吧…

RS232与串口通信的4个注意事项详解

RS232和串口通信&#xff0c;用于串口设备的数据采集软件&#xff0c;包括仪表、天平、秤或任何RS232仪器。WinWedge直接将数据捕获到Excel、Access或任何Windows应用程序或网页。它甚至可以从COM端口发送命令&#xff0c;因此您可以通过热键&#xff0c;按钮或DDE控制您的设备…