使用CUBA进行开发–是Spring的重大转变吗?

阅读另一个供内部公司使用的Web项目的要求时,您(至少是我自己)通常会看到一个很普通的集合:定义明确的数据存储结构(或有时是现有的旧式DB),大量的数据输入形式,非常复杂的业务逻辑,报告和与许多现有公司系统的集成,从会计到供应管理,成千上万的并发用户。 你首先想到的是什么?

“好的,我将使用著名的RDBMS,Hibernate / JPA + Spring Boot,添加REST API并使用我最喜欢的/最新的JS框架来实现UI。”

“啊。 而且我需要设置Spring Security。 也许添加一些自定义代码以保护行级别的数据。 我将如何实施? 可能是数据库视图或虚拟专用数据库。”

“以及所有这些DAO –它们相似且无聊,但我需要实现它们。”

“并使用ModelMapper之类的工具将JPA实体转换为REST的DTO。”

“而且别忘了告诉约翰-我们的新实习生-懒惰获取和JPA加入。”

“哦,我可以摆脱所有这些常规工作,而专注于关键的业务逻辑实现,而不是实现另一种登录表单和实体到DTO转换吗?”

本文适用于使用Spring框架(包括Spring Boot)从头开始实施至少两个项目,并且现在正在考虑提高生产力的开发人员。 在本文中,我将向您展示如何使用CUBA平台摆脱非常常见的消磨时间的例行任务。

又是另一个框架?

古巴

开发人员听说新框架时的第一个问题是:“当我可以使用Spring Boot并像以前一样从头开始实现所有功能时,为什么需要这么做?” 好吧,很公平–新平台需要学习新原理并应对新局限,而将您多年的经验都抛在脑后。 即使您当前的框架不够出色,您也知道这一切,也知道它们的所有陷阱和变通办法。

但是,如果我告诉您,CUBA不需要传统的Spring开发方式的U形转弯(或什至是直角转弯),而是略微走了一步,就可以消除数百行DTO和DTO的样板噪声。转换工具,数据分页或数据过滤组件的实现,为Spring Security创建配置文件(JPA,Cache等)。

我们将从头开始,然后说明CUBA应用程序开发如何遵循几乎所有基于Spring的应用程序所使用的模型,从而使您能够使用在开发人员的职业生涯中学到的所有Spring功夫技能,并在结束。 本文着重于后端代码,以使我们的故事更小,更简洁。

Spring应用架构

Spring应用程序的典型体系结构可以轻松地搜索到,在90%的情况下,可以将其表示为具有某些跨领域区域的三层应用程序。 让我们看一下“经典” Spring应用程序。

古巴Spring应用拱门

域模型 –通常是手动创建的。 不过,有些工具可用于基于数据存储结构创建域模型。

信息库层 –与数据存储一起使用的类。 也称为“ DAO”,“存储库”等。这是所有这些ORM框架(及其兄弟姐妹)的规则。 它通常包含仅使用域模型中的一个实体类执行CRUD操作的类。

服务层 –有时,开发人员会创建一个附加层来分隔业务逻辑和数据CRUD操作。 如果您具有涉及不同类型的数据源,外部服务集成等的复杂业务逻辑,则此层很有用。

Web /控制器层 (REST / MVC)-处理REST API(将由基于浏览器的应用程序使用)或使用JSP,模板框架(百叶窗,Velocity)或JVM框架(GWT, Vaadin,Wicket等)。 由于API结构或视图中的表示方式,通常控制器会操纵DTO而不是实体对象。 因此,开发人员通常必须在实体模型和DTO模型之间实现双向转换。

古巴船长明显

如果以上所有内容听起来都很熟悉(甚至对您来说就像“上尉队长”一样)–这是一个好兆头,意味着您将能够毫无障碍地开始使用CUBA。

参考应用–宠物诊所

他们说:“单词便宜,给我看看您的代码”。 Spring有其自己著名的“参考”应用程序– Pet Clinic,可在GitHub上获得 。 下面我们将展示在使用CUBA为Pet Clinic的新叉子开发后端时,如何利用Spring Developer的技能。 有一个很好的和详细的安托万·雷伊参考应用程序的说明这里 ; 我们将在本文中重复一些内容。

古巴参考应用

资料模型

该图显示了数据库的ER图。 应用程序代码中的实际对象域模型要复杂一些,并且包含一些继承,您可以在上述演示文稿中找到UML。

储存库级别

有四个用于处理主要实体的存储库:所有者,宠物,访问和兽医。 这些存储库基于Spring JPA框架,并且由于Spring JPA而几乎不包含任何代码,但是您可以在Owner存储库中找到一个自定义查询,以在一个请求中获取所有者及其宠物。

UI屏幕

该应用程序由九个屏幕组成,使我们可以查看所有数据并进行一些编辑:宠物主人,宠物和探访。 我们现在不再讨论它们,但是我需要提到的是,这些屏幕只是一个简单的CRUD表单,对于大多数面向数据的应用程序来说,它们是很常见的。

附加功能

除了简单的CRUD功能外,该应用程序还提供了一些(不是很明显)的功能,这些功能展示了Spring Framework的强大功能:

  • 缓存–兽医列表被缓存,因此刷新兽医列表时不会查询数据库。
  • 验证程序–检查在创建有关宠物的新记录期间是否填写了所有字段。
  • 格式化程序–用于正确显示宠物类型。
  • i18n –该应用程序支持英语和德语。
  • 事务管理–一些数据库查询被设为只读。

旁注

古巴

我非常喜欢这张照片,因为它以100%的准确性反映了我的感受。 为了有效地使用任何框架,您需要了解其内部工作原理。 例如,Spring Boot对您隐藏了很多东西,您会惊讶于一个简单的JPA接口初始化后面有多少类。 有关Spring Boot Pet Clinic应用程序中发生的“魔术”的一些说明:

  • 除了@Caсheable注释之外,没有缓存配置代码,但是Spring Boot以某种方式“知道”如何设置缓存实现(在我们的例子中为EhCache)。
  • 存储库未标记为@Transactional(它们的父类org.springframework.data.repository.Repository也不标记),但是所有save()方法都可以在此处正常工作。

但是尽管有这些隐含的内容,Spring Boot还是一个非常流行的框架,因为它是透明且可预测的。 它有一个非常详细的文档,并且是开源的,因此您可以阅读它的工作原理并深入研究任何方法,并查看其中发生了什么。 我猜每个人都喜欢透明且易于管理的框架-使用它们可以使您的应用程序可维护。

CUBA宠物诊所

因此,让我们看一下使用CUBA Platform的Pet Clinic实施,尝试从我们的Spring知识角度对其进行研究,并找出可以节省一些精力的地方。

Pet Clinic实现的源代码可以在GitHub上找到 。 除此之外,CUBA平台还提供了很好的文档 ,您可以在其中找到几乎所有内容(大多数情况在GitHub上通过示例和代码片段进行了说明 )。 在本文中,我们将经常参考该文档,以避免重复解释两次。

CUBA应用架构

古巴应用拱门

CUBA应用程序由以下模块组成 (请参见图表)。

全局 –包含映射到数据库的实体,CUBA视图和可在其他模块中使用的服务接口。

核心 –与应用程序数据库一起使用并实现业务逻辑的所有服务实现都应放在此处。 请注意,Core类在其他模块中不可用,其目的是为了将 Core和GUI模块分别部署到不同的服务器,以实现更好的可伸缩性。 要将服务从核心模块注入其他模块,应使用在全局模块中声明的接口。

GUI,Web,桌面,门户 –这些模块包含与GUI相关的类(控制器,侦听器等),负责UI事件处理。 您可以在此处创建自定义REST控制器,以补充CUBA为您生成的现成的REST API 。

为了提高开发人员的性能,CUBA拥有Studio –一个不错的小型GUI,用于创建和注册将为您更改所有配置的实体,帮助创建服务的代码存根,并具有用于GUI表单的WYSIWYG编辑器。

因此,基于CUBA平台的应用程序包含两个(或多个)单独的模块-可以分别部署的Core和GUI,以及一个跨领域的Global模块。 让我们详细了解CUBA的GlobalCore模块及其内容。

全局模块

实体模型

使用JPA兼容ORM框架和Spring的任何开发人员都应该熟悉CUBA应用程序中的实体模型。 它只是用@ Table,@ Entity等注释的类,并在persistence.xml文件中注册。

在Pet Clinic应用程序的实体模型中,您可以重用Spring版本中的代码,但是您需要记住以下几点:

  1. CUBA为使用此平台创建的每个应用程序组件 引入了“命名空间”,以防止名称在不同组件之间发生冲突。 这就是每个实体名称都有一个“ petclinic $”前缀的原因。
  2. 建议对实体使用@NamePattern批注,以在UI中获得有意义的实例表示形式。

问题是–除了前缀和声明性实体“字符串化”表示形式之外,CUBA还给我们带来了什么? 其他功能包括:

  1. 支持ID生成功能的基类:从整数ID到UUID。
  2. 一组有用(但可选)的界面:
    • 版本化–支持实体版本。
    • SoftDelete –支持实体的“软”删除,也称为“逻辑”删除。
    • 可更新–添加用于实体更新日志记录的字段。
    • 可创建的-添加用于实体创建日志记录的字段。
      您可以在文档中阅读有关这些接口的更多信息。
  3. CUBA Studio可以自动生成数据库架构创建和更新脚本。

在应用程序开发期间,我只是复制了Spring版本中的现有实体模型,并添加了上述的CUBA特定功能,从应用程序的参考版本中删除了BaseEntity类。

观看次数

CUBA的“视图”概念可能会令人困惑,但很容易解释。 视图是一种声明方式,用于指定应提取哪些数据(属性和嵌套实例/集合)。

假设您需要获取所有者及其宠物或兽医及其特殊性-以便在同一UI屏幕上显示相关实体以及“父”数据。 如果是纯Spring实现,则需要定义JPA联接…

@Query("SELECT owner FROM Owner owner left join fetch owner.pets WHERE owner.id =:id")
public Owner findById(@Param("id") int id);

…或定义适当的EAGER / LAZY提取类型,以获取事务上下文中实体的依赖集合。

@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "vet_specialties", joinColumns = @JoinColumn(name = "vet_id"), 
inverseJoinColumns = @JoinColumn(name = "specialty_id"))
private Set specialties;

在CUBA版本中,您可以使用EntityManager和JPQL或视图和DataManager:

1.定义一个视图,该视图指定我们要提取的内容:

<view class="com.haulmont.petclinic.entity.Vet"extends="_minimal"name="vet-specialities-view"><property name="specialities"view="_minimal"></property>
</view>

2.使用DataManager bean获取此数据

public Collection findAll() {return dataManager.load(Vet.class).query("select v from cubapetclinic$Vet v").view("vet-specialities-view").list();
}

您可以为不同的任务创建不同的视图,从而选择要获取的属性,是否获取集合并定义对象树的深度。 Mario David的博客中有一篇很好的关于观点的文章 。

在宠物诊所应用程序中,我们为不同情况定义了六个视图。 这些视图主要以UI形式使用,其中之一是-为了在服务中获取数据,代码段如上所示。

服务接口

由于全局模块是基于CUBA的应用程序的跨领域模块,因此您应该在其中定义服务接口,以便能够通过使用Spring注入来使用其他模块中的服务。 您需要做的就是在Web模块的“ web-spring.xml”文件中注册服务。 CUBA平台使用此Spring config XML文件在应用程序模块中创建代理,以进行透明的实体序列化和反序列化。 此功能使我们可以从其他模块中调用在Core中实现的服务,即使在分布式部署的情况下,也只需花费最少的精力即可。

因此,就使用CUBA进行实体模型开发而言,它与纯Spring完全相同,但是您无需在插入后关心ID的生成和检索实体的ID,也不必为实体的版本控制,软删除和创建额外的代码。实体更改日志。 另外,您可以节省一些时间来创建视图而不是JPA联接。

核心模块

核心模块包含在全局模块中声明的接口的服务实现。 CUBA应用程序中的每个服务通常都使用@Service进行注释,但是您可以使用所有可用的Spring注释来处理bean。 但是,由于CUBA的体系结构,存在一些限制:

  • 如果要在Web模块中公开服务,则需要使用@Service注释服务。
  • 建议给您的服务起一个名字,以避免来自不同插件的冲突。

除此之外,您的Core模块代码库是一个基于Spring的“纯”后端应用程序。 您可以像以前一样从数据存储中获取数据,调用第三方Web服务等。 唯一的显着区别是与数据库的交互。

实体管理器和数据管理器

该平台使用其自己的EntityManager ,将其功能的一部分委托给实际的javax.persistence.EntityManager实例。 CUBA的EntityManager主要提供底层实体操作,不支持安全功能。 在大多数情况下,建议使用提供额外功能的DataManager :

  1. 行级和属性级安全性支持。
  2. CUBA的实体查看用于获取数据的用法。
  3. 动态属性 。

有关DataManager和EntityManager的更多信息,请参见
文件 。 请注意,您不需要直接在GUI中使用这些bean –
为此的数据源 。

谈论PetClinic –我(几乎)没有在Core模块中编写很多代码,因为那里没有复杂的业务逻辑。

CUBASpring宠物诊所的特色

在上一节中,在基于Spring的Pet Clinic应用程序中列出了其他功能,CUBA中提供了相同的功能。

快取

CUBA提供实体和查询缓存作为内置功能。 这些缓存在文档中有详细描述,应首先考虑,因为它们支持分布式部署等所有平台功能。 除此之外,您可以使用Spring的@Cacheable启用缓存,并按照Spring 文档中的说明启用缓存。

验证器

CUBA使用BeanValidation作为标准验证引擎。 如果内置验证还不够,则可以定义自定义验证代码 。 而且总是有通过描述定义Validator类来验证UI数据的选项在这里 。

格式化程序

CUBA平台为GUI组件提供了几种格式化程序,但是您可以定义标准格式化程序之外的自己的格式化程序。 对于默认实体表示,使用@NamePattern批注。

I18n

CUBA平台以与其他Java应用程序相同的方式支持国际化 :通过使用message.properties文件,因此这里没有新内容。

交易管理

CUBA平台提供以下内容

交易管理选项:

  • 熟悉Spring的@Transactional批注
  • CUBA的Persistent接口,如果您在某些复杂的情况下需要细粒度的事务管理。

当我开发宠物诊所时,我只考虑过一次交易-在开发允许在同一屏幕上编辑所有者,宠物和添加访问的表格的过程中。 我需要了解何时提交事务并刷新UI以一致的方式显示数据。

不到一天的时间,我就能使用“标准” CUBA UI创建具有与Spring Pet Pet Clinic相同功能的应用程序。 我不会说我是CUBA的专家(距我刚开始只有几周时间),但是我使用Spring已有很长的历史。 让我们看一下考虑到Spring体系结构的基于CUBA的应用程序:
域模型全局模块中的实体。 创建实体模型是众所周知的例程。 致谢BaseIntegerIdEntity类,以节省一些ID生成时间。
信息库层 –我不需要信息库。 甚至没有接口。 我刚刚使用CUBA Studio GUI创建了一些视图。 使用此工具,我不需要在配置中编写XML。 服务层 –在我们的应用程序中,我们只有两个服务以JSON和XML格式导出兽医,并具有可缓存的结果。 根据文档,我将接口连接到Global ,将实现连接到Core 。 然后,这只是一个“正常”的开发,除了稍微了解一下DataManager以便熟悉其API。 控制器层 – CUBA Pet Clinic仅包含一个自定义REST控制器,用于Web模块中的JSON和XML提要。 毫不奇怪,这只是带有熟悉注释的Spring控制器。 应用程序GUI –使用CUBA Studio创建“标准” CRUD表单非常容易。 我没有考虑过将实体传递到Web UI和表单提交-没有控制器和存储库。 CUBA为我提供了适当的网格和用于数据过滤的组件,因此不再需要使用Pageable解析查询字符串和大惊小怪。 我花了大部分时间来实现适当的UI流程,渲染器和应用样式。

我的个人经历如下表所示:

易于理解和发展 需要阅读文件
实体 实体建模
数据库创建脚本
标准基类
软删除等的附加功能
储存库 实体管理器
观看次数
数据管理器
服务 豆类管理
交易管理
安全性和用户管理
持久接口
控制器 定制REST控制器
请求URL映射
服务方法发布
用户界面 标准表格 用户界面定制

显然,Pet Clinic应用程序并未使用所有CUBA功能,可以在该站点上找到完整列表,在该站点上您将看到该平台可以解决的其他常见任务。

我个人的观点– CUBA简化了后端实现,并且如果您使用其“标准” GUI,也可以做得很好。 即使您需要精美的UI,CUBA也会确保节省您在后端开发上的时间。

缺点呢?

好吧,本节中我想提到一些事情。 这些事情并没有改变游戏规则,但是我发现在熟悉CUBA的第一步中,它们是非常不必要的。

  • 在引言部分中,有人说CUBA平台带有自己的IDE,可简化项目的创建和管理。 有时在Studio和您的IDE之间切换可能会有些烦人,但是我们现在正在重新开发它,因此Studio很快就会转变为IDEA的插件。
  • 在CUBA中,由于平台提供的服务更多,因此与典型的Spring Boot应用程序相比,我们使用更多的XML配置文件。
  • 每个应用程序的UI表单都没有“友好” URL。 您可以使用屏幕链接直接访问屏幕,但是它们不是“可读的”。
  • 您必须处理CUBA的DataManager和EntityManager并学习它们的API,而不是Spring JPA或JDBC(但仍可以在需要时使用它们)。
  • 使用关系数据库时,您将使用CUBA获得最佳的开发性能。 与NoSQL一样,CUBA的性能也与Spring一样,这是相同数量的编码工作。

结论

如果您有一项任务来实现将RDBMS用作数据存储的以数据为中心的Intranet应用程序,则可能要尝试CUBA平台作为基础,因为:

  1. CUBA是透明的。 源代码可用,您可以调试所有内容。
  2. CUBA是灵活的(达到一定限制)。 您可以继承并注入自己的bean,而不是标准CUBA bean,发布自定义REST API并使用您自己的UI框架与用户进行交互。
  3. CUBA是春天。 80%的后端代码将是纯Spring应用程序。
  4. 您可以快速开始。 创建第一个实体和UI屏幕后,即可准备使用应用程序。
  5. 您可以完成许多例行工作。

因此,通过使用CUBA,您将节省一些日常任务的时间,真正享受与复杂的业务相关算法以及与其他应用程序的轻松集成带来的真正乐趣。

翻译自: https://www.javacodegeeks.com/2018/07/developing-cuba-big-shift-spring.html

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

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

相关文章

java 伴随矩阵_C#计算矩阵的逆矩阵方法实例分析

本文实例讲述了C#计算矩阵的逆矩阵方法。分享给大家供大家参考。具体如下&#xff1a;1.代码思路1)对矩阵进行合法性检查&#xff1a;矩阵必须为方阵2)计算矩阵行列式的值(Determinant函数)3)只有满秩矩阵才有逆矩阵&#xff0c;因此如果行列式的值为0(在代码中以绝对值小于1E-…

java 代码造假_老板居然让我在Java项目中“造假”

1. 前言老板说&#xff0c;明天甲方要来看产品&#xff0c;你得造点数据&#xff0c;而且数据必须是“真”的&#xff0c;演示效果要好看一些&#xff0c;这样他才会买我们的产品&#xff0c;我好明年给你换个嫂子。一般开发接到这种过分要求都不会很乐意去做&#xff0c;这完全…

nginx php环境搭建_php+nginx环境配置

本篇文章的内容是PHP和nginx环境的配置&#xff0c;在这里分享给大家&#xff0c;也给有需要的朋友一个参考phpnginx环境配置1、首先需要准备的应用程序包。nginx&#xff1a;nginx/Windows-1.0.4php&#xff1a;php-5.2.16-nts-Win32-VC6-x86.zip (nginx下php是以FastCGI的方式…

javaone_旅行报告:JavaOne 2013 –重归荣耀

javaone我已经回来几天了&#xff0c;需要赶上过去几天一直搁置的所有事情。 对我来说&#xff0c;这是一年中最忙的时间。 JavaOne和OpenWorld在旧金山的整整一周。 一个非常简短的旅行报告。 年度ACED简报 你们中许多人都知道我是Oracle社区认可计划&#xff08;称为“ ACE计…

php如何禁用浏览器的缓存,php如何禁止浏览器使用缓存页面

【摘要】PHP即“超文本预处理器”&#xff0c;是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言&#xff0c;与C语言类似&#xff0c;是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及 PHP 自创的语法。下面是php如何禁止浏览器使用缓存页面&#xff0c;让我…

使用Java EE和OIDC构建Java REST API

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 Java EE允许您使用JAX-RS和JPA快速轻松地构建Java REST API。 Java EE是保护伞标准规…

通过JavaFX标注制作动画效果

在本文中&#xff0c;您将学习如何使用JavaFX的动画API创建标注。 您可以在https://www.youtube.com/watch?vXTHbB0LRdT4的 YouTube网站上查看这些标注的演示示例。 什么是标注&#xff1f; 我敢肯定&#xff0c;您已经看过广告或科幻电影&#xff0c;它们使用在图像顶部显示…

使用trackBy启动流程

仍然沿用Corda Services的趋势&#xff0c;我还有其他一些技巧可帮助您的CorDapp顺利工作。 这次&#xff0c;我们将重点关注使用trackBy从服务内部启动流以及如果您不小心可能会引起的离散问题。 这应该是一个相对简短的职位&#xff0c;因为我可以依靠之前的职位&#xff1a…

java+springmvc+vo,springmvc+mybatis的实例详解

前面讲到&#xff1a;SpringSpringMVCMyBatis深入学习及搭建(十三)——SpringMVC入门程序(二)1.需求使用springmvc和mybatis完成商品列表查询。2.整合思路springmvcmybatis的系统架构&#xff1a;第一步&#xff1a;整合dao层mybatis和spring整合&#xff0c;通过spring管理map…

了解为什么这个直观的工具是您团队的通用团队管理工具

每个项目管理工具都试图做同样的工具性工作&#xff1a;保持团队联系&#xff0c;按任务执行和按时完成重大计划。 但是市场变得非常拥挤&#xff0c;并且有充分的理由-没有平台似乎对人们需要看的东西以及应该如何显示这些信息具有正确的感觉&#xff0c;以便它们既可行又相关…

模型服务:流处理与使用Java,gRPC,Apache Kafka,TensorFlow的RPC / REST

机器学习/深度学习模型可以通过不同的方式进行预测。 我的首选方法是将分析模型直接部署到流处理应用程序&#xff08;如Kafka Streams或KSQL &#xff09;中。 您可以例如使用TensorFlow for Java API 。 这样可以实现最佳延迟和外部服务的独立性。 在我的Github项目中可以找到…

拥抱模块化Java平台:Java 10上的Apache CXF

Java 9版本终于将Project Jigsaw交付给大众已经过去了一年多的时间。 这是一段漫长的旅程&#xff0c;但是在那里&#xff0c;所以发生了什么变化&#xff1f; 这是一个很好的问题&#xff0c;答案并不明显和直接。 总的来说&#xff0c; 拼图项目是一种颠覆性的变化&#xff…

建立无服务器的“ Hello World”功能

无服务器 &#xff0c;功能即服务&#xff08;FaaS&#xff09;或仅具有云功能&#xff0c;就可以编写将在云中运行的代码。 您可以使用多种不同的语言&#xff08;例如JavaScript&#xff08;Node.js&#xff09;&#xff0c;Swift&#xff0c;Python&#xff0c;Java&#xf…

oracle 10g 分区管理,Oracle 10g分区表的自动维护

Oracle 10g分区表不支持自动化管理&#xff0c;一般都要手动创建分区&#xff0c;手动删除。今天给大家带来了一个自动化管理表空间的脚本。本脚本主要由3个部分组成&#xff1a;sys_ConfigTable.sql、sys_pro_AddAndDropPartition.sql、sys_pro_MergeTable.sql1、sys_ConfigTa…

java实现metro风格_Metro风格的Java组合框(JMetro)–重新介绍

java实现metro风格我上一篇关于JMetro的文章–我的都市风格的Java皮肤&#xff08;或外观&#xff09;是关于日历选择器控件的 。 我本打算使用Tom Eugelink不错的日历选择器&#xff0c;但当时我了解到它是由Oracle创建并随Java 8一起提供的&#xff0c;因此出于时间的考虑&am…

toad查看oracle的plsql包,Oracle logminer 分析redo log(TOAD与PLSQL)

Oracle logminer 分析redo logOracle 11g r2 RAC centos 6.5设置时间格式select to_char(sysdate,yyyy-mm-dd hh24:mi:ss) date_format from dual ;查看数据库是否开启补全日志功能selectSUPPLEMENTAL_LOG_DATA_MIN,SUPPLEMENTAL_LOG_DATA_PK,SUPPLEMENTAL_LOG_DATA_UI,SUPPLEM…

Nutshell中的Java 8语言功能-第2部分

编者注&#xff1a;您也可以在此处检查Part-1。 嗨&#xff0c;朋友们&#xff0c;这是简明系列的Java 8语言功能的第2部分。 在这里&#xff0c;我们将讨论Java 8的以下功能&#xff1a; 接口中的静态方法 流 1.接口中的静态方法 什么是静态方法&#xff1f; 静态方法是属…

梯度下降法、最速下降法

梯度下降法 最优化问题是求解函数极值的问题&#xff0c;包括极大值和极小值。相信所有的读者对这个问题都不陌生&#xff0c;在初中时我们就学会了求解二次函数的极值&#xff08;抛物线的顶点&#xff09;&#xff0c;高中时学习了幂函数&#xff0c;指数函数&#xff0c;对…

超越函数

代数数 在数论中&#xff0c;超越数是指任何一个不是代数数的数字&#xff08;通常它是复数&#xff09;。它满足以下条件——只要它不是任何一个整系数代数方程的根&#xff0c;它即是超越数。最著名的超越数是e以及π。 超越数 超越数的例子 所有超越数构成的集是一个不可数…