{"id":397921,"date":"2024-06-29T13:45:23","date_gmt":"2024-06-29T13:45:23","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=397921"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=397921","title":{"rendered":"<span>\u0416\u0438\u043b \u043d\u0430 \u0441\u0432\u0435\u0442\u0435 \u0434\u043e\u0431\u0440\u044b\u0439 Jooq \u2013 \u043a\u0430\u043a \u043f\u043e\u0434\u0440\u0443\u0436\u0438\u0442\u044c\u0441\u044f \u0441 \u0445\u0440\u0430\u043d\u0438\u043c\u043a\u0430\u043c\u0438 \u0432 Oracle<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e! <\/p>\n<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u0440\u0442\u0451\u043c, \u044f back-end \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0430 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0435 WFM (<em>Workforce Management<\/em>). \u0412 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u043d\u0430\u0448 \u043f\u0440\u043e\u0434\u0443\u043a\u0442 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0432 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0440\u043e\u0437\u043d\u0438\u0447\u043d\u043e\u0439 \u0441\u0435\u0442\u0438, \u043e\u0434\u043d\u0430 \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043d\u0430\u0448\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u2014 \u044d\u0442\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u0434\u043b\u044f \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u0430 \u0440\u043e\u0437\u043d\u0438\u0447\u043d\u043e\u0433\u043e \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430.<\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c \u0432\u0430\u0441 (\u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0440\u0430\u0437, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430 \u0445\u0430\u0431\u0440\u0435 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0430\u0442\u0435\u0439, \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u043d\u044b\u0445 \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435) \u0441 Jooq \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u043c\u0438 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430\u043c\u0438 Oracle. \u0411\u0443\u0434\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u0432\u043e\u0434\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u044b.<\/p>\n<p>\u041f\u043e\u0447\u0442\u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0435, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0435\u0441\u0442\u044c \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0420\u0421\u0423\u0411\u0414 Oracle, \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0432 \u0432\u0438\u0434\u0435 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440. \u0423\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0431\u0430\u0437\u043e\u0439 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u044b\u043b\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0430\u0436\u043d\u043e\u0439 \u0438 \u0449\u0435\u043f\u0435\u0442\u0438\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0431\u044d\u043a\u0435\u043d\u0434\u0435\u0440\u0430, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e, \u0435\u0441\u043b\u0438 \u0440\u0435\u0447\u044c \u0438\u0434\u0435\u0442 \u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438 \u0441 \u0445\u0440\u0430\u043d\u0438\u043c\u043a\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u0434\u0430\u044e\u0442 \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 &#171;\u0441\u043b\u043e\u0436\u043d\u044b\u0435&#187; plsql-\u0442\u0438\u043f\u044b. \u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044f plsql-\u0442\u0438\u043f\u0430 \u0432 java-\u0442\u0438\u043f \u2014 \u0437\u0430\u0434\u0430\u0447\u043a\u0430 \u043d\u0435 \u0441\u0430\u043c\u0430\u044f \u043f\u0440\u0438\u044f\u0442\u043d\u0430\u044f, \u043c\u044f\u0433\u043a\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u0438 \u0443\u0434\u043e\u0431\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u044d\u0442\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0435 \u0442\u0430\u043a \u0443\u0436 \u043c\u043d\u043e\u0433\u043e.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043a\u0440\u0430\u0442\u043a\u043e \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u043a \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044e \u0441 \u0420\u0421\u0423\u0411\u0414, \u043a\u0430\u043a\u0438\u043c\u0438 \u0434\u043e\u0441\u0442\u043e\u0438\u043d\u0441\u0442\u0432\u0430\u043c\u0438 \u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0430\u043c\u0438 \u043e\u043d\u0438 \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"193\" width=\"193\">\n<p align=\"left\">\u041f\u043e\u0434\u0445\u043e\u0434<\/p>\n<\/td>\n<td data-colwidth=\"318\" width=\"318\">\n<p align=\"left\">\u041f\u043b\u044e\u0441\u044b<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041c\u0438\u043d\u0443\u0441\u044b<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"193\" width=\"193\">\n<p align=\"left\">\u0447\u0438\u0441\u0442\u044b\u0439 JDBC<\/p>\n<\/td>\n<td data-colwidth=\"318\" width=\"318\">\n<p align=\"left\">\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043d\u0430\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c<\/p>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">\u043e\u0447\u0435\u043d\u044c \u0442\u0440\u0443\u0434\u043e\u0435\u043c\u043a\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434   <\/p>\n<p align=\"left\">\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c sql \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0438\u043f\u043e\u0432 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435   <\/p>\n<p align=\"left\">\u043d\u0435\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0439 \u0441\u0442\u044b\u043a\u043e\u0432\u043a\u0438 \u0441 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u043c \u0411\u0414 (\u0443\u0437\u043d\u0430\u0435\u043c \u0432 runtime)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"193\" width=\"193\">\n<p align=\"left\">JPA (orm-\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438)<\/p>\n<\/td>\n<td data-colwidth=\"318\" width=\"318\">\n<p align=\"left\">\u043d\u0430\u0431\u043e\u0440 api \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c\u0438, \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c sql<\/p>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">\u043f\u043e\u0442\u0435\u0440\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f sql<\/p>\n<p align=\"left\">\u043d\u0435\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0439 \u0441\u0442\u044b\u043a\u043e\u0432\u043a\u0438 \u0441 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u043c \u0411\u0414 (\u0443\u0437\u043d\u0430\u0435\u043c \u0432 runtime)   (\u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f code first \u043f\u043e\u0434\u0445\u043e\u0434 \u0438 \u0441\u0445\u0435\u043c\u0430 \u0411\u0414 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"193\" width=\"193\">\n<p align=\"left\">Spring Data JDBC<\/p>\n<\/td>\n<td data-colwidth=\"318\" width=\"318\">\n<p align=\"left\">\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 api \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f sql \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0447\u0438\u0441\u0442\u044b\u043c jdbc   <\/p>\n<p align=\"left\">\u043c\u044b \u0441\u0430\u043c\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u043c \u043a\u0430\u043a\u043e\u0439 sql \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c sql \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0438\u043f\u043e\u0432 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435   <\/p>\n<p align=\"left\">\u043d\u0435\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0439 \u0441\u0442\u044b\u043a\u043e\u0432\u043a\u0438 \u0441 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u043c \u0411\u0414 (\u0443\u0437\u043d\u0430\u0435\u043c \u0432 runtime)<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u043a \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u043c\u0438 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430\u043c\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0441\u043f\u0438\u0441\u043e\u043a Spring Simplejdbccall, \u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u0441\u0435 \u0436\u0435 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 Jooq \u0432 \u0431\u043e\u043b\u0435\u0435 \u0448\u0438\u0440\u043e\u043a\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435, \u043d\u0435\u0436\u0435\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0445\u0440\u0430\u043d\u0438\u043c\u043a\u0430\u043c\u0438.<\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0437\u0430\u0447\u0435\u043c \u0436\u0435 \u043d\u0443\u0436\u043d\u0430 \u0435\u0449\u0435 \u043e\u0434\u043d\u0430 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u043d\u0430\u0434 \u0411\u0414?<\/p>\n<h2>Jooq \u2013 Java Object Oriented Querying<\/h2>\n<p><strong>\u0427\u0442\u043e \u0432 \u043e\u0441\u043d\u043e\u0432\u0435?<\/strong><\/p>\n<blockquote>\n<p>Jooq generates Java code from your database and lets you <strong>build type safe SQL queries<\/strong> through its fluent API<\/p>\n<\/blockquote>\n<p>\u042d\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u0427\u0442\u043e \u0436\u0435 \u043d\u0430\u043c \u044d\u0442\u043e \u0434\u0430\u0435\u0442? \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0431\u0430\u0437\u043e\u0439, \u043a\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043b\u0438\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0434\u043b\u044f wsdl-, openapi- \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0439. \u0414\u0443\u043c\u0430\u044e, \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u044c \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u043a\u043e\u0434\u0435\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430\u043c.<\/p>\n<p><strong>\u041a\u043e\u0433\u0434\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c?<\/strong><\/p>\n<ul>\n<li>\n<p>\u043f\u0435\u0440\u0435\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u0441\u0435\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435;<\/p>\n<\/li>\n<li>\n<p>\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u0432\u0430\u043c \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u044b \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u043f\u0435\u0440\u0435\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0441 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u043c \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p><strong>\u0418\u0437 \u0447\u0435\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c?<\/strong><\/p>\n<ul>\n<li>\n<p>\u043f\u043e jpa-\u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e sql-\u0441\u043a\u0440\u0438\u043f\u0442\u0430\u043c (liquibase, flyway);<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c \u0438\u0437 \u0411\u0414.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u0441\u0432\u043e\u0435\u043c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0435 \u043c\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441\u044b \u043f\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c \u0411\u0414, \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043a\u043e\u043d\u043d\u0435\u043a\u0442 \u043a \u0431\u0430\u0437\u0435, \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f java-\u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u043e \u043d\u0438\u043c.<\/p>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0441\u0447\u0435\u0440\u043f\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0420\u0421\u0423\u0411\u0414. \u041d\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d Oracle, \u0442\u0443\u0442 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0442\u043e\u0436\u0435 \u0432\u0441\u0451 \u0445\u043e\u0440\u043e\u0448\u043e.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7d8\/4ea\/e14\/7d84eae14465e41ed224a0ce870fc432.png\" width=\"659\" height=\"375\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7d8\/4ea\/e14\/7d84eae14465e41ed224a0ce870fc432.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0415\u0441\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u0430\u043c\u043e\u0439 \u0441\u0432\u0435\u0436\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 21\u0441. \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Oracle \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u0441\u043d\u043e\u0432\u0435. <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c, \u0432 \u043a\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435 \u0411\u0414 Oracle (\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e) \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c api \u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432. \u041c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 http-\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b, \u0445\u043e\u0442\u044f \u0438 \u0442\u0430\u043a\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c, \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043f\u0440\u043e \u0442\u043e, \u0447\u0442\u043e \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0441\u0447\u0451\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e \u0447\u0435\u0440\u0435\u0437 jdbc. \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0434\u0432\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u0430:<\/p>\n<ol>\n<li>\n<p>table\/view \u2014 \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0430\u043c \u0438\u043b\u0438 \u0432\u044c\u044e\u0448\u043a\u0430\u043c;<\/p>\n<\/li>\n<li>\n<p>stored procedure \u2014 \u0432\u044b\u0437\u043e\u0432 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440:<\/p>\n<ul>\n<li>\n<p>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b (\u0447\u0438\u0441\u043b\u043e, \u0441\u0442\u0440\u043e\u043a\u0430, \u0434\u0430\u0442\u0430);<\/p>\n<\/li>\n<li>\n<p>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0435 \u00ab\u0441\u043b\u043e\u0436\u043d\u044b\u0435\u00bb pl\/sql \u043e\u0431\u044a\u0435\u043a\u0442\u044b (object, record);<\/p>\n<\/li>\n<li>\n<p>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0435 sys_refcursor (\u043d\u0435\u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u0443\u0440\u0441\u043e\u0440);<\/p>\n<\/li>\n<li>\n<p>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0435 refcursor (\u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u0443\u0440\u0441\u043e\u0440);<\/p>\n<\/li>\n<li>\n<p>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 pipeline-\u0444\u0443\u043d\u043a\u0446\u0438\u0438).<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u043d\u043e \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0438\u0445 \u043d\u0430 \u0432\u0445\u043e\u0434, \u043f\u0440\u0438\u0447\u0435\u043c \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u043e\u0436\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0433\u043e\u0434\u043d\u043e &#171;\u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438&#187; \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0447\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0431\u0430\u0437\u044b.<\/p>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440\u044b<\/h2>\n<p>\u0421\u0430\u043c\u043e\u0439 \u0432\u0430\u0436\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0443 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c \u0431\u0430\u0437\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0438\u043f\u0430\u043c\u0438, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432\u044b\u0432\u043e\u0434\u0430 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043d\u0435 \u0432\u0430\u0436\u043d\u044b, \u043d\u043e \u0434\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u0434\u0430 \u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044e println. \u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044f \u043a\u043e\u0434 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u044f \u0431\u0443\u0434\u0443 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u0443\u044e \u0432\u0430\u0436\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c.<\/p>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0411\u0414. \u041e\u0431\u044b\u0447\u043d\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u0445\u0435\u043c\u0430 \u0432 \u0431\u0430\u0437\u0435, \u043f\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0435\u0434\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 (\u043e\u0431\u0437\u043e\u0432\u0435\u043c dev_user), \u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0445\u043e\u0434\u0438\u0442 \u0432 \u0431\u0430\u0437\u0443 \u0441 \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0432\u044b\u0434\u0430\u043d\u043d\u044b\u0445 \u0433\u0440\u0430\u043d\u0442\u043e\u0432 (\u043e\u0431\u0437\u043e\u0432\u0435\u043c app_user).<\/p>\n<pre><code class=\"sql\">-- \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0430 \u043e\u0442\u043a\u0443\u0434\u0430 \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 create table demo_table (     a number(2),     b varchar2(5) );  -- \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0435 insert into demo_table(a, b) values (1, 'hello'); insert into demo_table(a, b) values (1, 'hell'); insert into demo_table(a, b) values (2, 'world');  -- view \u0434\u043b\u044f \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u044f\u0446\u0438\u0438 create or replace view v_demo_table as select a, b from demo_table;  -- \u0432\u044b\u0434\u0430\u0447\u0430 \u0433\u0440\u0430\u043d\u0442\u043e\u0432 \u043d\u0430 view grant read on v_demo_table to app_user;<\/code><\/pre>\n<p>\u042f \u043d\u0435 \u0431\u0443\u0434\u0443 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043e\u0441\u0442\u0430\u0432\u043b\u044e \u043b\u0438\u0448\u044c \u0441\u0430\u043c\u044b\u0435 \u0432\u0430\u0436\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b. \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:<\/p>\n<pre><code class=\"xml\">&lt;!--\u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0434--> &lt;dependency>     &lt;groupId>com.oracle.database.jdbc&lt;\/groupId>     &lt;artifactId>ojdbc10&lt;\/artifactId>        &lt;version>${jooq.version}&lt;\/version> &lt;\/dependency> &lt;!-- \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u0430\u043c jooq --> &lt;dependency>     &lt;groupId>${jooq.groupId}&lt;\/groupId>     &lt;artifactId>jooq&lt;\/artifactId>      &lt;version>${jooq.version}&lt;\/version> &lt;\/dependency> &lt;dependency>     &lt;groupId>${jooq.groupId}&lt;\/groupId>     &lt;artifactId>jooq-meta&lt;\/artifactId>         &lt;version>${jooq.version}&lt;\/version> &lt;\/dependency> &lt;dependency>     &lt;groupId>${jooq.groupId}&lt;\/groupId>     &lt;artifactId>jooq-codegen&lt;\/artifactId>     &lt;version>${jooq.version}&lt;\/version> &lt;\/dependency>  &lt;!-- \u0441\u0442\u0430\u0440\u0442\u0435\u0440 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0431\u0438\u043d\u043e\u0432 jooq --> &lt;dependency>     &lt;groupId>org.springframework.boot&lt;\/groupId>     &lt;artifactId>spring-boot-starter-jooq&lt;\/artifactId>     &lt;exclusions>         &lt;exclusion>             &lt;groupId>org.jooq&lt;\/groupId>             &lt;artifactId>jooq&lt;\/artifactId>         &lt;\/exclusion>     &lt;\/exclusions> &lt;\/dependency><\/code><\/pre>\n<p>\u041f\u043b\u0430\u0433\u0438\u043d, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043d\u0443\u0436\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u043e \u0441\u0445\u0435\u043c\u0435 \u0411\u0414:<\/p>\n<details class=\"spoiler\">\n<summary>\u043a\u043e\u043d\u0444\u0438\u0433 \u043f\u043b\u0430\u0433\u0438\u043d\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"xml\">&lt;plugin>       &lt;groupId>${jooq.groupId}&lt;\/groupId>       &lt;artifactId>jooq-codegen-maven&lt;\/artifactId>       &lt;version>${jooq.version}&lt;\/version>        &lt;executions>           &lt;!-- Generate the required class from the database -->           &lt;execution>               &lt;id>generate-jooq&lt;\/id>               &lt;phase>generate-sources&lt;\/phase>               &lt;goals>                   &lt;goal>generate&lt;\/goal>               &lt;\/goals>           &lt;\/execution>       &lt;\/executions>        &lt;configuration>           &lt;!-- \u0441\u044e\u0434\u0430 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 \u0431\u0434 -->           &lt;jdbc>               &lt;driver>${driver-class-name}&lt;\/driver>               &lt;url>${url}&lt;\/url>               &lt;user>${username}&lt;\/user>               &lt;password>${password}&lt;\/password>           &lt;\/jdbc>            &lt;generator>               &lt;database>                                   &lt;name>${jooq.generator.db.dialect}&lt;\/name>                   &lt;includes>.*&lt;\/includes>                   &lt;inputSchema>${jooq.schema}&lt;\/inputSchema>               &lt;\/database>               &lt;!-- Generate classes for tables and records -->               &lt;generate>                   &lt;globalTableReferences>true&lt;\/globalTableReferences>                   &lt;globalUDTReferences>false&lt;\/globalUDTReferences>                   &lt;fluentSetters>true&lt;\/fluentSetters>                   &lt;javaTimeTypes>true&lt;\/javaTimeTypes>               &lt;\/generate>               &lt;!-- Configure the target package and directory -->               &lt;target>                   &lt;packageName>ru.sportmaster.wfm.jooq.db&lt;\/packageName>                   &lt;directory>target\/generated-sources\/jooq&lt;\/directory>               &lt;\/target>           &lt;\/generator>       &lt;\/configuration>   &lt;\/plugin><\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c-\u0442\u043e, \u0432\u0441\u0451 \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e (\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f junit \u0438 spring boot test \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u043e\u043d\u0430 \u0442\u0435\u0441\u0442\u043e\u0432). \u041f\u0440\u043e\u0433\u043e\u043d\u044f\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u044f \u0431\u0443\u0434\u0443 \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435. \u041f\u043e\u043f\u0440\u043e\u0448\u0443 spring boot \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043c\u043d\u0435 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e.<\/p>\n<pre><code class=\"java\">@SpringBootTest public class Demo {     \/* \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0431\u0438\u043d \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 jooq, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f     \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u0431\u0434 *\/     @Autowired     Configuration conf;  }<\/code><\/pre>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c mvn clean compile (\u043c\u043e\u0436\u043d\u043e \u0438 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0434\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d jooq-codeget, \u043d\u043e \u044f \u043f\u043e \u043f\u0440\u0438\u0432\u044b\u0447\u043a\u0435 \u043f\u043e\u0439\u0434\u0443 \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u043f\u0443\u0442\u0451\u043c). \u0415\u0441\u043b\u0438 \u0432\u0441\u0451 \u0431\u044b\u043b\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e, \u0442\u043e \u0432 \u043b\u043e\u0433\u0435 \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c, \u043a\u0430\u043a Jooq \u043f\u0440\u0438\u0446\u0435\u043f\u0438\u043b\u0441\u044f \u043a \u0431\u0430\u0437\u0435, \u0437\u0430\u0447\u0438\u0442\u0430\u043b \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438\u0437 \u0441\u043b\u043e\u0432\u0430\u0440\u0435\u0439 \u0438 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043b \u043b\u043e\u0433 \u043e \u0441\u0432\u043e\u0435\u0439 \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432 \u043f\u0430\u043f\u043a\u0435 target (\u043d\u0443 \u0438\u043b\u0438 \u043a\u0443\u0434\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438) \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c21\/f8e\/c6c\/c21f8ec6c64b0d0b7897902e72d1e898.png\" width=\"263\" height=\"221\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c21\/f8e\/c6c\/c21f8ec6c64b0d0b7897902e72d1e898.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0422\u0430\u043c \u043a\u0430\u043a \u0440\u0430\u0437 \u043d\u0430\u0448\u0430 \u0432\u044c\u044e\u0448\u043a\u0430, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0432\u044b\u0434\u0430\u043b\u0438 \u0433\u0440\u0430\u043d\u0442\u044b. \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 :<\/p>\n<details class=\"spoiler\">\n<summary>VDemoTable<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">\/**  * This class is generated by jOOQ.  *\/ @SuppressWarnings({ \"all\", \"unchecked\", \"rawtypes\" }) public class VDemoTable extends TableImpl&lt;VDemoTableRecord> {            .......................           \/**      * The column &lt;code>V_DEMO_TABLE.A&lt;\/code>.      *\/     public final TableField&lt;VDemoTableRecord, Byte> A = createField(DSL.name(\"A\"), SQLDataType.TINYINT, this, \"\");      \/**      * The column &lt;code>V_DEMO_TABLE.B&lt;\/code>.      *\/     public final TableField&lt;VDemoTableRecord, String> B = createField(DSL.name(\"B\"), SQLDataType.VARCHAR(5), this, \"\");      ........................ } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0412 \u043d\u0451\u043c \u0435\u0441\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442, \u2014 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u043f\u043f\u0438\u043d\u0433 \u043f\u043e\u043b\u0435\u0439 \u0431\u0430\u0437\u044b \u0432 \u043f\u043e\u043b\u044f java-\u043a\u043b\u0430\u0441\u0441\u0430: \u043f\u043e\u043b\u0435 a number(2) -> Byte, \u043f\u043e\u043b\u0435 b varchar2(5) -> String. \u0414\u0430\u043b\u044c\u0448\u0435 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 view:<\/p>\n<pre><code class=\"java\">@Test void getFromView() {     Result&lt;VDemoTableRecord> result = conf.dsl()                                           .selectFrom(Tables.V_DEMO_TABLE)                                           .fetch();      result.forEach(record -> {         System.out.println(record.getA());         System.out.println(record.getB());     }); }<\/code><\/pre>\n<p>\u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0438 \u0447\u0442\u043e \u0432\u0430\u0436\u043d\u043e \u2014 \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0434\u0443\u043c\u0430\u0442\u044c \u043e \u0442\u0438\u043f\u0430\u0445, \u043e\u0431\u043e \u0432\u0441\u0451\u043c \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u043b\u0441\u044f Jooq.<\/p>\n<p>\u0427\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0435\u0439 \u0438 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u043e\u0439:<\/p>\n<pre><code class=\"java\">@Test void getViewGroupBy() {         Result&lt;Record2&lt;Byte, Integer>> agg = conf.dsl()                                              .select(Tables.V_DEMO_TABLE.A, count())                                              .from(Tables.V_DEMO_TABLE)                                              .where(Tables.V_DEMO_TABLE.A.eq((byte) 1))                                              .groupBy(Tables.V_DEMO_TABLE.A)                                              .fetch();       agg.forEach(record -> {         System.out.println(record.component1());         System.out.println(record.component2());     }); }<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, dsl Jooq \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 sql. Record2&lt;Byte, Integer> &#8212; \u0432 \u0442\u0430\u043a\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 Jooq \u0437\u0430\u043f\u0430\u043a\u043e\u0432\u0430\u043b \u0441\u0442\u0440\u043e\u043a\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430, \u0433\u0434\u0435 Byte &#8212; \u044d\u0442\u043e \u043f\u043e\u043b\u0435 A, \u0430 Integer &#8212; count() \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043b\u044e.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u043c \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430\u043c.<\/p>\n<pre><code class=\"pgsql\">-- plsql \u0445\u0440\u0430\u043d\u0438\u043c\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f create or replace function get_num_value return number as begin     return 2;  end; \/ -- \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u0435\u043c \u0434\u0430\u0442\u044c \u0433\u0440\u0430\u043d\u0442 grant execute on get_num_value to app_user;<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043f\u043b\u0430\u0433\u0438\u043d jooq \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438, \u043f\u043e\u043b\u0443\u0447\u0438\u043c:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7c5\/1b1\/4ad\/7c51b14ad0ccd579ee73674f5f1fa6ca.png\" width=\"276\" height=\"302\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7c5\/1b1\/4ad\/7c51b14ad0ccd579ee73674f5f1fa6ca.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438:<\/p>\n<details class=\"spoiler\">\n<summary>GetNumValue<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">\/**  * This class is generated by jOOQ.  *\/ @SuppressWarnings({ \"all\", \"unchecked\", \"rawtypes\" }) public class GetNumValue extends AbstractRoutine&lt;BigDecimal> {          \/**      * The parameter &lt;code>GET_NUM_VALUE.RETURN_VALUE&lt;\/code>.      *\/     public static final Parameter&lt;BigDecimal> RETURN_VALUE =        Internal.createParameter(\"RETURN_VALUE\", SQLDataType.NUMERIC,                                 false, false);      .......... }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>Routines<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">\/**  * Convenience access to all stored procedures and functions.  *\/ @SuppressWarnings({ \"all\", \"unchecked\", \"rawtypes\" }) public class Routines {      \/**      * Call &lt;code>GET_NUM_VALUE&lt;\/code>      *\/     public static BigDecimal getNumValue(           Configuration configuration     ) {         GetNumValue f = new GetNumValue();          f.execute(configuration);         return f.getReturnValue();     }     .....   }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"java\">@Test void getNumValue() {     BigDecimal r = Routines.getNumValue(conf);     System.out.println(r); }<\/code><\/pre>\n<p>\u041e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u2014 \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 \u0443 \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043c \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b\u0438 (\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438\u043c\u0451\u043d \u0434\u043b\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u2014 Routines) .<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u043c\u0438 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430\u043c\u0438\/\u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 (\u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u043b\u043e\u0433\u0438\u043a\u0430 \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u0430\u043a\u0435\u0442\u0430\u0445, \u043d\u0435\u0436\u0435\u043b\u0438 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445), \u043f\u043e\u043b\u043d\u0430\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430:<\/p>\n<details class=\"spoiler\">\n<summary>\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"pgsql\">create or replace package demo_test_pkg is  -- \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b type t_ints is table of integer;  -- \u0440\u0435\u043a\u043e\u0440\u0434 type t_rec is record (     a number(2),     b varchar2(10 char) ); -- \u043a\u0443\u0440\u0441\u043e\u0440 \u0440\u0435\u043a\u043e\u0440\u0434\u043e\u0432 type t_cur is ref cursor return t_rec;  -- \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u0440\u0435\u043a\u043e\u0440\u0434\u043e\u0432 type t_tab is table of t_rec;  procedure get_min_max (     p_ints in t_ints,     p_min out integer,     p_max out integer );  function get_sys_refcursor return sys_refcursor;  function get_refcursor return t_cur;  function get_collection return t_tab;  function get_collection_pipe return t_tab pipelined;  end demo_test_pkg; \/ grant execute on demo_test_pkg to app_user;<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043f\u0435\u0440\u0435\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0421\u043c\u043e\u0442\u0440\u0438\u043c:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/dc3\/004\/449\/dc300444983d2042191a8da245c75f78.png\" width=\"310\" height=\"322\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dc3\/004\/449\/dc300444983d2042191a8da245c75f78.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0412\u0438\u0434\u0438\u043c \u043d\u0430\u0448 \u043e\u0440\u0430\u043a\u043b\u043e\u0432\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0432 \u0432\u0438\u0434\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 DemoTestPkg, \u0432\u0441\u0435 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0432\u043d\u0443\u0442\u0440\u0438 \u0438 \u0432\u0441\u0435 plsql-\u0442\u0438\u043f\u044b \u0432 \u0432\u0438\u0434\u0435 java-\u043a\u043b\u0430\u0441\u0441\u043e\u0432.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434<\/p>\n<pre><code class=\"java\">@Test void getMinMax() {     GetMinMax r = DemoTestPkg.getMinMax(                             conf,                             new TIntsRecord(                               BigInteger.ONE,                                BigInteger.TWO,                                BigInteger.TEN                             )                   );      System.out.println(r.getPMin());     System.out.println(r.getPMax()); }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c TIntsRecord \u044d\u0442\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043e\u0431\u0451\u0440\u0442\u043a\u0430 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0442\u0438\u043f\u0430 \u0432 \u043f\u0430\u043a\u0435\u0442\u0435 \u0431\u0434:<\/p>\n<pre><code class=\"pgsql\">-- \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b type t_ints is table of integer;<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>GetMinMax.java<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">\/**  * This class is generated by jOOQ.  *\/ @SuppressWarnings({ \"all\", \"unchecked\", \"rawtypes\" }) public class GetMinMax extends AbstractRoutine&lt;java.lang.Void> {      \/**      * The parameter &lt;code>DEMO_TEST_PKG.GET_MIN_MAX.P_MIN&lt;\/code>.      *\/     public static final Parameter&lt;BigInteger> P_MIN = ...      \/**      * The parameter &lt;code>DEMO_TEST_PKG.GET_MIN_MAX.P_MAX&lt;\/code>.      *\/     public static final Parameter&lt;BigInteger> P_MAX = ...<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u0443\u0440\u0441\u043e\u0440\u044b \u0438\u0437 \u0431\u0430\u0437\u044b. \u0412 Oracle \u043a\u0443\u0440\u0441\u043e\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 (ref_cursor) \u0438 \u043d\u0435\u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 (sys_refcursor). <\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u043c sys_refcursor:<\/p>\n<pre><code class=\"java\">@Test void getSysRefCursor() {     Result&lt;Record> result = DemoTestPkg.getSysRefcursor(conf);     Integer r = result.get(0).get(\"A\", Integer.class);     System.out.println(r); }<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u0442\u0443\u0442 \u0434\u0435\u043b\u0430 \u043e\u0431\u0441\u0442\u043e\u044f\u0442 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e, \u0447\u0442\u043e, \u0432 \u043e\u0431\u0449\u0435\u043c-\u0442\u043e, \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043c\u044b \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u0443\u0440\u0441\u043e\u0440 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0438 \u0442\u0443\u0442 Jooq \u043d\u0438\u0447\u0435\u043c \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0447\u044c \u2014 \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u043c \u043f\u043e\u043b\u044f\u043c, \u043e\u043d\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b. \u0412 \u0442\u0430\u043a\u043e\u0435 \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d\u044b &#171;\u0440\u0443\u0447\u043a\u0430\u043c\u0438&#187; \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u0435 \u043f\u043e\u043b\u0435 &#8212; result.get(0).get(&#171;VAL&#187;, Integer.class). \u041f\u043e\u0434\u0445\u043e\u0434 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u2014 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0438\u043f\u0430\u043c\u0438 \u0442\u0435\u0440\u044f\u0435\u0442\u0441\u044f.<\/p>\n<p>\u0425\u043e\u0440\u043e\u0448\u043e, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u0443\u0440\u0441\u043e\u0440, \u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043e, \u043a\u0430\u043a\u0438\u0435 \u043f\u043e\u043b\u044f \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:<\/p>\n<pre><code class=\"pgsql\">-- \u0440\u0435\u043a\u043e\u0440\u0434 type t_rec is record (     a number(2),     b varchar2(10 char) ); -- \u043a\u0443\u0440\u0441\u043e\u0440 \u0440\u0435\u043a\u043e\u0440\u0434\u043e\u0432 type t_cur is ref cursor return t_rec;<\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u043c ref_cursor:<\/p>\n<pre><code class=\"java\">@Test void getRefCursor() {     Result&lt;Record> result = DemoTestPkg.getRefcursor(conf);     Integer r = result.get(0).get(\"A\", Integer.class);     System.out.println(r); }<\/code><\/pre>\n<p>\u041d\u043e \u0443\u0432\u044b, \u0438 \u0441 ref_cursor \u0434\u0435\u043b\u0430 \u043e\u0431\u0441\u0442\u043e\u044f\u0442 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043a\u0430\u043a \u0438 \u0441 sys_refcursor \u2014 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0445 \u043f\u043e\u043b\u0435\u0439 \u043d\u0435\u0442, Record \u2014 \u043d\u0438\u0447\u0435\u043c \u043d\u0435 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d. \u0411\u0430\u0433 \u044d\u0442\u043e \u0438\u043b\u0438 \u0444\u0438\u0447\u0430? \u0423 \u043c\u0435\u043d\u044f, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0440\u0443\u043a\u0438 \u043f\u043e\u043a\u0430 \u043d\u0435 \u0434\u043e\u0448\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441 \u0432 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 (\u0437\u0430\u0431\u0435\u0433\u0430\u044f \u0432\u043f\u0435\u0440\u0435\u0434, \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u043c\u044b \u0440\u0435\u0434\u043a\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0443\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u043a\u0443\u0440\u0441\u043e\u0440\u0430).<\/p>\n<p>\u0410 \u0432\u043e\u0442 \u0441 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435\u043c \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438, \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0442\u0435\u043c \u0436\u0435 record-\u043e\u043c, \u0434\u0435\u043b\u0430 \u043e\u0431\u0441\u0442\u043e\u044f\u0442 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043b\u0443\u0447\u0448\u0435:<\/p>\n<pre><code class=\"pgsql\">-- \u0440\u0435\u043a\u043e\u0440\u0434 type t_rec is record (     a number(2),     b varchar2(10 char) );  -- \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u0440\u0435\u043a\u043e\u0440\u0434\u043e\u0432 type t_tab is table of t_rec;<\/code><\/pre>\n<pre><code class=\"java\">@Test void getCollection() {     TTabRecord r = DemoTestPkg.getCollection(conf);     r.forEach(record -> {         System.out.println(record.getA());         System.out.println(record.getB());     }); }<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>TTabRecord<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">\/**  * This class is generated by jOOQ.  *\/ @SuppressWarnings({ \"all\", \"unchecked\", \"rawtypes\" }) public class TTabRecord extends ArrayRecordImpl&lt;TRecRecord> { ....    \/**  * This class is generated by jOOQ.  *\/ @SuppressWarnings({ \"all\", \"unchecked\", \"rawtypes\" }) public class TRecRecord extends UDTRecordImpl&lt;TRecRecord> implements Record2&lt;Byte, String> {     \/**      * Getter for &lt;code>DEMO_TEST_PKG.T_REC.A&lt;\/code>.      *\/     public Byte getA() {         return (Byte) get(0);     }         \/**      * Getter for &lt;code>DEMO_TEST_PKG.T_REC.B&lt;\/code>.      *\/     public String getB() {         return (String) get(1);     }     ......<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, Jooq \u0441\u043e\u0437\u0434\u0430\u043b \u043d\u0430\u043c TTabRecord, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u0440\u043e\u0431\u0435\u0433\u0430\u0442\u044c\u0441\u044f \u0438 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u043f\u043e\u043b\u044f\u043c \u0440\u0435\u043a\u043e\u0440\u0434\u0430.<\/p>\n<p>\u041c\u044b \u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0435 \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0441\u0442\u0430\u0440\u0430\u0435\u043c\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439 \u0447\u0435\u0440\u0435\u0437 pipeline-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u2014 \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0431\u0435\u0440\u0435\u0436\u043d\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u044c\u0441\u044f \u043a \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c \u0411\u0414, \u0435\u0441\u043b\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u043e, \u0442\u043e \u0431\u0430\u0437\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e \u043c\u0435\u0440\u0435 \u0435\u0433\u043e \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0430 \u043d\u0435 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0442\u044c \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u043a\u0430\u043a \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435.<\/p>\n<p>\u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0432\u044b\u0437\u043e\u0432 \u043d\u0438\u0447\u0435\u043c \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430:<\/p>\n<pre><code class=\"java\">@Test void getCollectionPipe() {     TTabRecord r = DemoTestPkg.getCollectionPipe(conf);     r.forEach(record -> {         System.out.println(record.getA());         System.out.println(record.getB());     }); }<\/code><\/pre>\n<p>\u041d\u043e \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u0432\u0441\u0435 \u0436\u0435 \u0435\u0441\u0442\u044c, \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0430\u0448 \u043a\u043e\u0434 \u0441 \u0444\u043b\u0430\u0433\u043e\u043c \u0434\u0435\u0431\u0430\u0433\u0430 Jooq:<\/p>\n<pre><code>-Dlogging.level.org.jooq=DEBUG<\/code><\/pre>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u0438\u0437 \u0411\u0414 \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/292\/360\/1f0\/2923601f077f53ce18a4f27ebdd97a25.png\" width=\"836\" height=\"101\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/292\/360\/1f0\/2923601f077f53ce18a4f27ebdd97a25.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a pipeline-\u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ce5\/f23\/6d9\/ce5f236d91acebd02b4e4386fca44d9e.png\" width=\"991\" height=\"208\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ce5\/f23\/6d9\/ce5f236d91acebd02b4e4386fca44d9e.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u0432\u044b\u0437\u043e\u0432 pipeline-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u044d\u0442\u043e \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 select * from table(function) \u0441 \u0444\u0435\u0442\u0447\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430. \u041a\u0441\u0442\u0430\u0442\u0438, \u044d\u0442\u043e \u0435\u0449\u0435 \u0438 \u0443\u0434\u043e\u0431\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0435 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u0441\u0430\u043c\u043e\u043c oracle \u2014 \u0437\u0430\u0445\u043e\u0434\u0438\u043c \u0441 \u0441\u0432\u043e\u044e \u043b\u044e\u0431\u0438\u043c\u0443\u044e ide \u0434\u043b\u044f plsql, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c select, \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0443\u0440\u043e\u0432\u043d\u044f \u0441\u0445\u0435\u043c\u044b \u0438 \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0438\u0434\u0435\u043c \u0432 \u0431\u0430\u0437\u0443:<\/p>\n<pre><code class=\"pgsql\">-- \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0442\u043e\u043c \u0441\u0442\u0430\u043d\u0435\u0442 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 create or replace type t_inner_obj as object (     dt date,      num_val number,     str_val varchar2(100 char) ); \/ -- \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 t_inner_obj create or replace type t_obj as object (     dt_with_time timestamp,     f_obj t_inner_obj ); -- \u0437\u0430\u0432\u0435\u0440\u043d\u0435\u043c \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438\u044e t_obj create or replace type t_tab_obj is table of t_obj; \/  -- \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e (\u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0438 \u0432 \u043f\u0430\u043a\u0435\u0442): create or replace function get_collection_obj (     p_inner_obj in t_inner_obj ) return t_tab_obj as    v_res t_tab_obj; begin     select          t_obj         (             dt_with_time => sysdate,              f_obj => p_inner_obj         )      bulk collect into          v_res      from          dual;              return v_res; end; \/  -- \u0440\u0430\u0437\u0434\u0430\u0434\u0438\u043c \u0433\u0440\u0430\u043d\u0442\u044b grant execute on t_tab_obj to app_user; grant execute on t_obj to app_user; grant execute on t_inner_obj to app_user; grant execute on get_collection_obj to app_user;<\/code><\/pre>\n<p>\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043a\u043b\u0430\u0441\u0441\u043e\u0432. \u0421\u043c\u043e\u0442\u0440\u0438\u043c:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/61c\/e45\/414\/61ce454147c00b052155ac5e2f0da267.png\" width=\"241\" height=\"331\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/61c\/e45\/414\/61ce454147c00b052155ac5e2f0da267.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c, \u0432\u0441\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0441\u043e\u0437\u0434\u0430\u043d\u044b, \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c: <\/p>\n<pre><code class=\"java\">@Test void getCollectionObj() {      TTabObjRecord r = Routines.getCollectionObj(             conf,             new TInnerObjRecord(LocalDate.now(), BigDecimal.ONE, \"World!\")     );      r.forEach(record -> {         System.out.println(record.getDtWithTime());         System.out.println(record.getFObj().getDt());         System.out.println(record.getFObj().getNumVal());         System.out.println(record.getFObj().getStrVal());     }); }<\/code><\/pre>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d \u043e\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043c\u0430\u043f\u043f\u0435\u0440\u043e\u0432. \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u0432\u044b\u0437\u043e\u0432 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439, \u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0442\u0438\u043f\u0430\u043c\u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u0430\u0441\u044c \u0432 \u043e\u0434\u043d\u043e \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435 \ud83d\ude42<\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p><strong>\u041a\u0430\u043a\u0438\u0435 \u0442\u0443\u0442 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430?<\/strong><\/p>\n<ul>\n<li>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e\u0442\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435 \u043c\u0435\u0448\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u044f\u0434\u043e\u043c \u0434\u0440\u0443\u0433\u0438\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0411\u0414.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u0448\u0438\u0440\u043d\u0430\u044f, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u043b\u0438\u0437\u044b \u0440\u0430\u0437 \u0432 \u043f\u043e\u043b\u0433\u043e\u0434\u0430 + \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0444\u0438\u043a\u0441\u044b.<\/p>\n<\/li>\n<li>\n<p>\u0411\u044b\u0441\u0442\u0440\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b \u043d\u0430 stackoverflow \u043e\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 scala, groovy, kotlin.<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0441\u0442\u044b\u043a\u043e\u0432\u043a\u0438 \u0441\u00a0 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u043c \u0411\u0414 (\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 compile time).<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e\u0442\u0430 \u0432\u044b\u0437\u043e\u0432\u0430 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041a\u043e\u0433\u0434\u0430 \u0441\u0442\u043e\u0438\u0442 \u0442\u043e\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c?<\/strong><\/p>\n<ul>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0430 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0435 \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u043c\u0438 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044c \u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 sql, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435\u0442 \u00ab\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438\u00bb \u0432 \u00abjpa-\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u0445\u00bb.<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u044d\u0442\u043e \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438 \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e, \u0441 \u043f\u043e\u043b\u043d\u044b\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u043b\u0443\u0447\u0448\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0430\u0439\u0442\u0435 \u2014 <a href=\"https:\/\/www.jooq.org\/\">https:\/\/www.jooq.org\/<\/a><\/p>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435!<\/p>\n<details class=\"spoiler\">\n<summary>pom.xml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"xml\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?> &lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"          xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 https:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\">     &lt;modelVersion>4.0.0&lt;\/modelVersion>     &lt;parent>         &lt;groupId>org.springframework.boot&lt;\/groupId>         &lt;artifactId>spring-boot-starter-parent&lt;\/artifactId>         &lt;version>2.1.1.RELEASE&lt;\/version>         &lt;relativePath\/> &lt;!-- lookup parent from repository -->     &lt;\/parent>     &lt;groupId>com.example&lt;\/groupId>     &lt;artifactId>techclub&lt;\/artifactId>     &lt;version>0.0.1-SNAPSHOT&lt;\/version>     &lt;name>techclub&lt;\/name>     &lt;description>techclub&lt;\/description>          &lt;properties>         &lt;java.version>11&lt;\/java.version>         &lt;jooq.groupId>org.jooq.pro-java-11&lt;\/jooq.groupId>         &lt;jooq.version>3.15.0&lt;\/jooq.version>         &lt;jooq.generator.db.dialect>org.jooq.meta.oracle.OracleDatabase&lt;\/jooq.generator.db.dialect>         &lt;jooq.schema>dev_user&lt;\/jooq.schema>         &lt;!--db driver-->         &lt;ojdbc10.version>19.7.0.0&lt;\/ojdbc10.version>         &lt;junit-jupiter>5.8.1&lt;\/junit-jupiter>      &lt;\/properties>     &lt;dependencies>         &lt;dependency>             &lt;groupId>org.springframework.boot&lt;\/groupId>             &lt;artifactId>spring-boot-starter&lt;\/artifactId>         &lt;\/dependency>         &lt;dependency>             &lt;groupId>org.springframework.boot&lt;\/groupId>             &lt;artifactId>spring-boot-starter-test&lt;\/artifactId>             &lt;scope>test&lt;\/scope>         &lt;\/dependency>         &lt;dependency>             &lt;groupId>org.projectlombok&lt;\/groupId>             &lt;artifactId>lombok&lt;\/artifactId>             &lt;version>${lombok.version}&lt;\/version>             &lt;scope>provided&lt;\/scope>         &lt;\/dependency>         &lt;dependency>             &lt;groupId>org.junit.jupiter&lt;\/groupId>             &lt;artifactId>junit-jupiter&lt;\/artifactId>             &lt;version>${junit-jupiter}&lt;\/version>             &lt;scope>test&lt;\/scope>         &lt;\/dependency>          &lt;!--db access-->         &lt;dependency>             &lt;groupId>com.oracle.database.jdbc&lt;\/groupId>             &lt;artifactId>ojdbc10&lt;\/artifactId>             &lt;version>${ojdbc10.version}&lt;\/version>         &lt;\/dependency>         &lt;!-- jooq -->         &lt;dependency>             &lt;groupId>${jooq.groupId}&lt;\/groupId>             &lt;artifactId>jooq&lt;\/artifactId>             &lt;version>${jooq.version}&lt;\/version>         &lt;\/dependency>         &lt;dependency>             &lt;groupId>${jooq.groupId}&lt;\/groupId>             &lt;artifactId>jooq-meta&lt;\/artifactId>             &lt;version>${jooq.version}&lt;\/version>         &lt;\/dependency>         &lt;dependency>             &lt;groupId>${jooq.groupId}&lt;\/groupId>             &lt;artifactId>jooq-codegen&lt;\/artifactId>             &lt;version>${jooq.version}&lt;\/version>         &lt;\/dependency>          &lt;dependency>             &lt;groupId>org.springframework.boot&lt;\/groupId>             &lt;artifactId>spring-boot-starter-jooq&lt;\/artifactId>             &lt;exclusions>                 &lt;exclusion>                     &lt;groupId>org.jooq&lt;\/groupId>                     &lt;artifactId>jooq&lt;\/artifactId>                 &lt;\/exclusion>             &lt;\/exclusions>         &lt;\/dependency>     &lt;\/dependencies>      &lt;build>         &lt;plugins>             &lt;!--\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438-->             &lt;plugin>                 &lt;groupId>org.codehaus.mojo&lt;\/groupId>                 &lt;artifactId>properties-maven-plugin&lt;\/artifactId>                 &lt;version>1.0.0&lt;\/version>                 &lt;executions>                     &lt;execution>                         &lt;phase>initialize&lt;\/phase>                         &lt;goals>                             &lt;goal>read-project-properties&lt;\/goal>                         &lt;\/goals>                         &lt;configuration>                             &lt;files>                                 &lt;!--\u043e\u0442\u0441\u044e\u0434\u0430 \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u043b\u043e\u0433\u0438\u043d\/\u043f\u0430\u0440\u043e\u043b\u044c-->                                 &lt;file>src\/main\/resources\/application.properties&lt;\/file>                             &lt;\/files>                         &lt;\/configuration>                     &lt;\/execution>                 &lt;\/executions>             &lt;\/plugin>              &lt;plugin>                 &lt;groupId>${jooq.groupId}&lt;\/groupId>                 &lt;artifactId>jooq-codegen-maven&lt;\/artifactId>                 &lt;version>${jooq.version}&lt;\/version>                  &lt;executions>                     &lt;!-- Generate the required class from the database -->                     &lt;execution>                         &lt;id>generate-jooq&lt;\/id>                         &lt;phase>generate-sources&lt;\/phase>                         &lt;goals>                             &lt;goal>generate&lt;\/goal>                         &lt;\/goals>                     &lt;\/execution>                 &lt;\/executions>                  &lt;configuration>                     &lt;!-- Configure the database connection -->                     &lt;jdbc>                         &lt;driver>${driver-class-name}&lt;\/driver>                         &lt;url>${url}&lt;\/url>                         &lt;user>${username}&lt;\/user>                         &lt;password>${password}&lt;\/password>                     &lt;\/jdbc>                      &lt;generator>                         &lt;database>                             &lt;!-- &lt;tableValuedFunctions>true&lt;\/tableValuedFunctions>--> &lt;!--?!-->                             &lt;!-- Configure the used database dialect -->                             &lt;name>${jooq.generator.db.dialect}&lt;\/name>                              &lt;includes>.*&lt;\/includes>                             &lt;inputSchema>${jooq.schema}&lt;\/inputSchema>                          &lt;\/database>                         &lt;!-- Generate classes for tables and records -->                         &lt;generate>                             &lt;globalTableReferences>true&lt;\/globalTableReferences>                             &lt;globalUDTReferences>false&lt;\/globalUDTReferences>                             &lt;fluentSetters>true&lt;\/fluentSetters>                             &lt;javaTimeTypes>true&lt;\/javaTimeTypes>                         &lt;\/generate>                         &lt;!-- Configure the target package and directory -->                         &lt;target>                             &lt;packageName>ru.sportmaster.wfm.jooq.db&lt;\/packageName>                             &lt;directory>target\/generated-sources\/jooq&lt;\/directory>                         &lt;\/target>                     &lt;\/generator>                 &lt;\/configuration>             &lt;\/plugin>          &lt;\/plugins>     &lt;\/build>  &lt;\/project><\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430 Demo.java<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">package ru.techclub.jooq;  import org.jooq.Configuration; import org.jooq.Record; import org.jooq.Record2; import org.jooq.Result; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import ru.sportmaster.wfm.jooq.db.Routines; import ru.sportmaster.wfm.jooq.db.Tables; import ru.sportmaster.wfm.jooq.db.packages.DemoTestPkg; import ru.sportmaster.wfm.jooq.db.packages.demo_test_pkg.GetMinMax; import ru.sportmaster.wfm.jooq.db.packages.demo_test_pkg.udt.records.TIntsRecord; import ru.sportmaster.wfm.jooq.db.packages.demo_test_pkg.udt.records.TTabRecord; import ru.sportmaster.wfm.jooq.db.tables.records.VDemoTableRecord; import ru.sportmaster.wfm.jooq.db.udt.records.TInnerObjRecord; import ru.sportmaster.wfm.jooq.db.udt.records.TTabObjRecord;  import java.math.BigDecimal; import java.math.BigInteger; import java.time.LocalDate;  import static org.jooq.impl.DSL.count;  @SpringBootTest public class Demo {     \/* \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0431\u0438\u043d \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 jooq, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f     \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u0431\u0434 *\/     @Autowired     Configuration conf;      @Test     void getView() {          Result&lt;VDemoTableRecord> result = conf.dsl().selectFrom(Tables.V_DEMO_TABLE).fetch();          result.forEach(record -> {             System.out.println(record.getA());             System.out.println(record.getB());         });     }      @Test     void getViewGroupBy() {         Result&lt;Record2&lt;Byte, Integer>> agg = conf.dsl()                 .select(Tables.V_DEMO_TABLE.A, count())                 .from(Tables.V_DEMO_TABLE)                 .where(Tables.V_DEMO_TABLE.A.eq((byte) 1))                 .groupBy(Tables.V_DEMO_TABLE.A)                 .fetch();          agg.forEach(record -> {             System.out.println(record.component1());             System.out.println(record.component2());         });     }      @Test     void getNumValue() {         BigDecimal r = Routines.getNumValue(conf);         System.out.println(r);     }      @Test     void getMinMax() {         GetMinMax r = DemoTestPkg.getMinMax(                                 conf,                                 new TIntsRecord(BigInteger.ONE, BigInteger.TWO, BigInteger.TEN)                       );          System.out.println(r.getPMin());         System.out.println(r.getPMax());     }      @Test     void getSysRefCursor() {         Result&lt;Record> result = DemoTestPkg.getSysRefcursor(conf);         Integer r = result.get(0).get(\"A\", Integer.class);         System.out.println(r);     }      @Test     void getRefCursor() {         Result&lt;Record> result = DemoTestPkg.getRefcursor(conf);         Integer r = result.get(0).get(\"A\", Integer.class);         System.out.println(r);     }      @Test     void getCollection() {         TTabRecord r = DemoTestPkg.getCollection(conf);         r.forEach(record -> {             System.out.println(record.getA());             System.out.println(record.getB());         });     }      @Test     void getCollectionPipe() {          TTabRecord r = DemoTestPkg.getCollectionPipe(conf);         r.forEach(record -> {             System.out.println(record.getA());             System.out.println(record.getB());         });     }      @Test     void getCollectionObj() {          TTabObjRecord r = Routines.getCollectionObj(                 conf,                 new TInnerObjRecord(LocalDate.now(), BigDecimal.ONE, \"World!\")         );          r.forEach(record -> {             System.out.println(record.getDtWithTime());             System.out.println(record.getFObj().getDt());             System.out.println(record.getFObj().getNumVal());             System.out.println(record.getFObj().getStrVal());         });     } } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0432 \u0431\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"pgsql\">create table demo_table (     a number(2),     b varchar2(5) );  insert into demo_table(a, b) values (1, 'hello'); insert into demo_table(a, b) values (1, 'hell'); insert into demo_table(a, b) values (2, 'world');  commit;  create or replace view v_demo_table as select * from demo_table;  grant read on v_demo_table to app_user;  -- \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0430\u044f \u0447\u0438\u0441\u043b\u043e create or replace function get_num_value return number as begin     return 2;  end; \/ grant execute on get_num_value to app_user;  create or replace type t_inner_obj as object (     dt date,     num_val number,     str_val varchar2(100 char) ); \/ create or replace type t_obj as object (     dt_with_time timestamp,     f_obj t_inner_obj ); create or replace type t_tab_obj is table of t_obj; \/  create or replace function get_collection_obj (     p_inner_obj in t_inner_obj ) return t_tab_obj as    v_res t_tab_obj; begin     select          t_obj         (             dt_with_time => sysdate,              f_obj => p_inner_obj         )      bulk collect into          v_res      from          dual;              return v_res; end; \/  grant execute on t_tab_obj to app_user; grant execute on t_obj to app_user; grant execute on t_inner_obj to app_user; grant execute on get_collection_obj to app_user;   create or replace package demo_test_pkg is  -- \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b type t_ints is table of integer;  -- \u0440\u0435\u043a\u043e\u0440\u0434 type t_rec is record (     a number(2),     b varchar2(10 char) ); -- \u043a\u0443\u0440\u0441\u043e\u0440 \u0440\u0435\u043a\u043e\u0440\u0434\u043e\u0432 type t_cur is ref cursor return t_rec;  -- \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u0440\u0435\u043a\u043e\u0440\u0434\u043e\u0432 type t_tab is table of t_rec;   procedure get_min_max (     p_ints in t_ints,     p_min out integer,     p_max out integer );  function get_sys_refcursor return sys_refcursor;  function get_refcursor return t_cur;  function get_collection return t_tab;  function get_collection_pipe return t_tab pipelined;  end demo_test_pkg; \/ create or replace package body demo_test_pkg is  procedure get_min_max (     p_ints in t_ints,     p_min out integer,     p_max out integer ) as    begin        p_min := p_ints.first;     p_max := p_ints.first;     for i in p_ints.first .. p_ints.last loop         if p_ints(i) > p_max then           p_max := p_ints(i);         end if;         if p_ints(i) &lt; p_min then           p_min := p_ints(i);         end if;             end loop; end;  function get_sys_refcursor return sys_refcursor   as      v_res sys_refcursor;   begin     open v_res for select 1 as a, 'hello' as b from dual      union all select 2, 'world!' from dual;      return v_res;   end;  function get_refcursor return t_cur as   v_res t_cur; begin     open v_res for select 1 as a, 'hello' as b from dual      union all select 2, 'world!' from dual;      return v_res;    end;    function get_collection return t_tab as   v_res t_tab; begin     select q.* bulk collect into v_res from (select 1 as a, 'hello' as b from dual      union all select 2, 'world!' from dual) q;            return v_res;       end;  function get_collection_pipe return t_tab pipelined as begin    for i in (select 1 as a, 'hello' as b from dual      union all select 2, 'world!' from dual) loop      pipe row(i);      end loop; end;  end demo_test_pkg; \/ grant execute on demo_test_pkg to app_user;<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/664270\/\"> https:\/\/habr.com\/ru\/articles\/664270\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e! <\/p>\n<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u0440\u0442\u0451\u043c, \u044f back-end \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0430 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0435 WFM (<em>Workforce Management<\/em>). \u0412 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u043d\u0430\u0448 \u043f\u0440\u043e\u0434\u0443\u043a\u0442 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0432 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0440\u043e\u0437\u043d\u0438\u0447\u043d\u043e\u0439 \u0441\u0435\u0442\u0438, \u043e\u0434\u043d\u0430 \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043d\u0430\u0448\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u2014 \u044d\u0442\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u0434\u043b\u044f \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u0430 \u0440\u043e\u0437\u043d\u0438\u0447\u043d\u043e\u0433\u043e \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430.<\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c \u0432\u0430\u0441 (\u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0440\u0430\u0437, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430 \u0445\u0430\u0431\u0440\u0435 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0430\u0442\u0435\u0439, \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u043d\u044b\u0445 \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435) \u0441 Jooq \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u043c\u0438 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430\u043c\u0438 Oracle. \u0411\u0443\u0434\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u0432\u043e\u0434\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u044b.<\/p>\n<p>\u041f\u043e\u0447\u0442\u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0435, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0435\u0441\u0442\u044c \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0420\u0421\u0423\u0411\u0414 Oracle, \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0432 \u0432\u0438\u0434\u0435 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440. \u0423\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0431\u0430\u0437\u043e\u0439 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u044b\u043b\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0430\u0436\u043d\u043e\u0439 \u0438 \u0449\u0435\u043f\u0435\u0442\u0438\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0431\u044d\u043a\u0435\u043d\u0434\u0435\u0440\u0430, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e, \u0435\u0441\u043b\u0438 \u0440\u0435\u0447\u044c \u0438\u0434\u0435\u0442 \u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438 \u0441 \u0445\u0440\u0430\u043d\u0438\u043c\u043a\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u0434\u0430\u044e\u0442 \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 &#171;\u0441\u043b\u043e\u0436\u043d\u044b\u0435&#187; plsql-\u0442\u0438\u043f\u044b. \u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044f plsql-\u0442\u0438\u043f\u0430 \u0432 java-\u0442\u0438\u043f \u2014 \u0437\u0430\u0434\u0430\u0447\u043a\u0430 \u043d\u0435 \u0441\u0430\u043c\u0430\u044f \u043f\u0440\u0438\u044f\u0442\u043d\u0430\u044f, \u043c\u044f\u0433\u043a\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u0438 \u0443\u0434\u043e\u0431\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u044d\u0442\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0435 \u0442\u0430\u043a \u0443\u0436 \u043c\u043d\u043e\u0433\u043e.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043a\u0440\u0430\u0442\u043a\u043e \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u043a \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044e \u0441 \u0420\u0421\u0423\u0411\u0414, \u043a\u0430\u043a\u0438\u043c\u0438 \u0434\u043e\u0441\u0442\u043e\u0438\u043d\u0441\u0442\u0432\u0430\u043c\u0438 \u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0430\u043c\u0438 \u043e\u043d\u0438 \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"193\" width=\"193\">\n<p align=\"left\">\u041f\u043e\u0434\u0445\u043e\u0434<\/p>\n<\/td>\n<td data-colwidth=\"318\" width=\"318\">\n<p align=\"left\">\u041f\u043b\u044e\u0441\u044b<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041c\u0438\u043d\u0443\u0441\u044b<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"193\" width=\"193\">\n<p align=\"left\">\u0447\u0438\u0441\u0442\u044b\u0439 JDBC<\/p>\n<\/td>\n<td data-colwidth=\"318\" width=\"318\">\n<p align=\"left\">\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043d\u0430\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c<\/p>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">\u043e\u0447\u0435\u043d\u044c \u0442\u0440\u0443\u0434\u043e\u0435\u043c\u043a\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434   <\/p>\n<p align=\"left\">\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c sql \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0438\u043f\u043e\u0432 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435   <\/p>\n<p align=\"left\">\u043d\u0435\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0439 \u0441\u0442\u044b\u043a\u043e\u0432\u043a\u0438 \u0441 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u043c \u0411\u0414 (\u0443\u0437\u043d\u0430\u0435\u043c \u0432 runtime)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"193\" width=\"193\">\n<p align=\"left\">JPA (orm-\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438)<\/p>\n<\/td>\n<td data-colwidth=\"318\" width=\"318\">\n<p align=\"left\">\u043d\u0430\u0431\u043e\u0440 api \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c\u0438, \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c sql<\/p>\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">\u043f\u043e\u0442\u0435\u0440\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f sql<\/p>\n<p align=\"left\">\u043d\u0435\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0439 \u0441\u0442\u044b\u043a\u043e\u0432\u043a\u0438 \u0441 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u043c \u0411\u0414 (\u0443\u0437\u043d\u0430\u0435\u043c \u0432 runtime)   (\u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f code first \u043f\u043e\u0434\u0445\u043e\u0434 \u0438 \u0441\u0445\u0435\u043c\u0430 \u0411\u0414 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"193\" width=\"193\">\n<p align=\"left\">Spring Data JDBC<\/p>\n<\/td>\n<td data-colwidth=\"318\" width=\"318\">\n<p align=\"left\">\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 api \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f sql \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0447\u0438\u0441\u0442\u044b\u043c jdbc   <\/p>\n<p align=\"left\">\u043c\u044b \u0441\u0430\u043c\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u043c \u043a\u0430\u043a\u043e\u0439 sql \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c sql \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0438\u043f\u043e\u0432 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435   <\/p>\n<p align=\"left\">\u043d\u0435\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0439 \u0441\u0442\u044b\u043a\u043e\u0432\u043a\u0438 \u0441 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u043c \u0411\u0414 (\u0443\u0437\u043d\u0430\u0435\u043c \u0432 runtime)<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u043a \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u043c\u0438 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430\u043c\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0441\u043f\u0438\u0441\u043e\u043a Spring Simplejdbccall, \u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u0441\u0435 \u0436\u0435 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 Jooq \u0432 \u0431\u043e\u043b\u0435\u0435 \u0448\u0438\u0440\u043e\u043a\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435, \u043d\u0435\u0436\u0435\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0445\u0440\u0430\u043d\u0438\u043c\u043a\u0430\u043c\u0438.<\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0437\u0430\u0447\u0435\u043c \u0436\u0435 \u043d\u0443\u0436\u043d\u0430 \u0435\u0449\u0435 \u043e\u0434\u043d\u0430 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u043d\u0430\u0434 \u0411\u0414?<\/p>\n<h2>Jooq \u2013 Java Object Oriented Querying<\/h2>\n<p><strong>\u0427\u0442\u043e \u0432 \u043e\u0441\u043d\u043e\u0432\u0435?<\/strong><\/p>\n<blockquote>\n<p>Jooq generates Java code from your database and lets you <strong>build type safe SQL queries<\/strong> through its fluent API<\/p>\n<\/blockquote>\n<p>\u042d\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u0427\u0442\u043e \u0436\u0435 \u043d\u0430\u043c \u044d\u0442\u043e \u0434\u0430\u0435\u0442? \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0431\u0430\u0437\u043e\u0439, \u043a\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043b\u0438\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0434\u043b\u044f wsdl-, openapi- \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0439. \u0414\u0443\u043c\u0430\u044e, \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u044c \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u043a\u043e\u0434\u0435\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430\u043c.<\/p>\n<p><strong>\u041a\u043e\u0433\u0434\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c?<\/strong><\/p>\n<ul>\n<li>\n<p>\u043f\u0435\u0440\u0435\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u0441\u0435\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435;<\/p>\n<\/li>\n<li>\n<p>\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u0432\u0430\u043c \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u044b \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u043f\u0435\u0440\u0435\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0441 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u043c \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p><strong>\u0418\u0437 \u0447\u0435\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c?<\/strong><\/p>\n<ul>\n<li>\n<p>\u043f\u043e jpa-\u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e sql-\u0441\u043a\u0440\u0438\u043f\u0442\u0430\u043c (liquibase, flyway);<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c \u0438\u0437 \u0411\u0414.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u0441\u0432\u043e\u0435\u043c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0435 \u043c\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441\u044b \u043f\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c \u0411\u0414, \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043a\u043e\u043d\u043d\u0435\u043a\u0442 \u043a \u0431\u0430\u0437\u0435, \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f java-\u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u043e \u043d\u0438\u043c.<\/p>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0441\u0447\u0435\u0440\u043f\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0420\u0421\u0423\u0411\u0414. \u041d\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d Oracle, \u0442\u0443\u0442 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0442\u043e\u0436\u0435 \u0432\u0441\u0451 \u0445\u043e\u0440\u043e\u0448\u043e.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0415\u0441\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u0430\u043c\u043e\u0439 \u0441\u0432\u0435\u0436\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 21\u0441. \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Oracle \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u0441\u043d\u043e\u0432\u0435. <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c, \u0432 \u043a\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435 \u0411\u0414 Oracle (\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e) \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c api \u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432. \u041c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 http-\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b, \u0445\u043e\u0442\u044f \u0438 \u0442\u0430\u043a\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c, \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043f\u0440\u043e \u0442\u043e, \u0447\u0442\u043e \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0441\u0447\u0451\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e \u0447\u0435\u0440\u0435\u0437 jdbc. \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0434\u0432\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u0430:<\/p>\n<ol>\n<li>\n<p>table\/view \u2014 \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0430\u043c \u0438\u043b\u0438 \u0432\u044c\u044e\u0448\u043a\u0430\u043c;<\/p>\n<\/li>\n<li>\n<p>stored procedure \u2014 \u0432\u044b\u0437\u043e\u0432 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440:<\/p>\n<ul>\n<li>\n<p>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b (\u0447\u0438\u0441\u043b\u043e, \u0441\u0442\u0440\u043e\u043a\u0430, \u0434\u0430\u0442\u0430);<\/p>\n<\/li>\n<li>\n<p>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0435 \u00ab\u0441\u043b\u043e\u0436\u043d\u044b\u0435\u00bb pl\/sql \u043e\u0431\u044a\u0435\u043a\u0442\u044b (object, record);<\/p>\n<\/li>\n<li>\n<p>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0435 sys_refcursor (\u043d\u0435\u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u0443\u0440\u0441\u043e\u0440);<\/p>\n<\/li>\n<li>\n<p>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0435 refcursor (\u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u0443\u0440\u0441\u043e\u0440);<\/p>\n<\/li>\n<li>\n<p>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 pipeline-\u0444\u0443\u043d\u043a\u0446\u0438\u0438).<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u043d\u043e \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0438\u0445 \u043d\u0430 \u0432\u0445\u043e\u0434, \u043f\u0440\u0438\u0447\u0435\u043c \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u043e\u0436\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0433\u043e\u0434\u043d\u043e &#171;\u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438&#187; \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0447\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0431\u0430\u0437\u044b.<\/p>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440\u044b<\/h2>\n<p>\u0421\u0430\u043c\u043e\u0439 \u0432\u0430\u0436\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0443 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c \u0431\u0430\u0437\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0438\u043f\u0430\u043c\u0438, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432\u044b\u0432\u043e\u0434\u0430 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043d\u0435 \u0432\u0430\u0436\u043d\u044b, \u043d\u043e \u0434\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u0434\u0430 \u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044e println. \u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044f \u043a\u043e\u0434 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u044f \u0431\u0443\u0434\u0443 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u0443\u044e \u0432\u0430\u0436\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c.<\/p>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0411\u0414. \u041e\u0431\u044b\u0447\u043d\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u0445\u0435\u043c\u0430 \u0432 \u0431\u0430\u0437\u0435, \u043f\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0435\u0434\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 (\u043e\u0431\u0437\u043e\u0432\u0435\u043c dev_user), \u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0445\u043e\u0434\u0438\u0442 \u0432 \u0431\u0430\u0437\u0443 \u0441 \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0432\u044b\u0434\u0430\u043d\u043d\u044b\u0445 \u0433\u0440\u0430\u043d\u0442\u043e\u0432 (\u043e\u0431\u0437\u043e\u0432\u0435\u043c app_user).<\/p>\n<pre><code class=\"sql\">-- \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0430 \u043e\u0442\u043a\u0443\u0434\u0430 \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 create table demo_table (     a number(2),     b varchar2(5) );  -- \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0435 insert into demo_table(a, b) values (1, 'hello'); insert into demo_table(a, b) values (1, 'hell'); insert into demo_table(a, b) values (2, 'world');  -- view \u0434\u043b\u044f \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u044f\u0446\u0438\u0438 create or replace view v_demo_table as select a, b from demo_table;  -- \u0432\u044b\u0434\u0430\u0447\u0430 \u0433\u0440\u0430\u043d\u0442\u043e\u0432 \u043d\u0430 view grant read on v_demo_table to app_user;<\/code><\/pre>\n<p>\u042f \u043d\u0435 \u0431\u0443\u0434\u0443 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043e\u0441\u0442\u0430\u0432\u043b\u044e \u043b\u0438\u0448\u044c \u0441\u0430\u043c\u044b\u0435 \u0432\u0430\u0436\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b. \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:<\/p>\n<pre><code class=\"xml\">&lt;!--\u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0434--> &lt;dependency>     &lt;groupId>com.oracle.database.jdbc&lt;\/groupId>     &lt;artifactId>ojdbc10&lt;\/artifactId>        &lt;version>${jooq.version}&lt;\/version> &lt;\/dependency> &lt;!-- \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u0430\u043c jooq --> &lt;dependency>     &lt;groupId>${jooq.groupId}&lt;\/groupId>     &lt;artifactId>jooq&lt;\/artifactId>      &lt;version>${jooq.version}&lt;\/version> &lt;\/dependency> &lt;dependency>     &lt;groupId>${jooq.groupId}&lt;\/groupId>     &lt;artifactId>jooq-meta&lt;\/artifactId>         &lt;version>${jooq.version}&lt;\/version> &lt;\/dependency> &lt;dependency>     &lt;groupId>${jooq.groupId}&lt;\/groupId>     &lt;artifactId>jooq-codegen&lt;\/artifactId>     &lt;version>${jooq.version}&lt;\/version> &lt;\/dependency>  &lt;!-- \u0441\u0442\u0430\u0440\u0442\u0435\u0440 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0431\u0438\u043d\u043e\u0432 jooq --> &lt;dependency>     &lt;groupId>org.springframework.boot&lt;\/groupId>     &lt;artifactId>spring-boot-starter-jooq&lt;\/artifactId>     &lt;exclusions>         &lt;exclusion>             &lt;groupId>org.jooq&lt;\/groupId>             &lt;artifactId>jooq&lt;\/artifactId>         &lt;\/exclusion>     &lt;\/exclusions> &lt;\/dependency><\/code><\/pre>\n<p>\u041f\u043b\u0430\u0433\u0438\u043d, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043d\u0443\u0436\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u043e \u0441\u0445\u0435\u043c\u0435 \u0411\u0414:<\/p>\n<details class=\"spoiler\">\n<summary>\u043a\u043e\u043d\u0444\u0438\u0433 \u043f\u043b\u0430\u0433\u0438\u043d\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"xml\">&lt;plugin>       &lt;groupId>${jooq.groupId}&lt;\/groupId>       &lt;artifactId>jooq-codegen-maven&lt;\/artifactId>       &lt;version>${jooq.version}&lt;\/version>        &lt;executions>           &lt;!-- Generate the required class from the database -->           &lt;execution>               &lt;id>generate-jooq&lt;\/id>               &lt;phase>generate-sources&lt;\/phase>               &lt;goals>                   &lt;goal>generate&lt;\/goal>               &lt;\/goals>           &lt;\/execution>       &lt;\/executions>        &lt;configuration>           &lt;!-- \u0441\u044e\u0434\u0430 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 \u0431\u0434 -->           &lt;jdbc>               &lt;driver>${driver-class-name}&lt;\/driver>               &lt;url>${url}&lt;\/url>               &lt;user>${username}&lt;\/user>               &lt;password>${password}&lt;\/password>           &lt;\/jdbc>            &lt;generator>               &lt;database>                                   &lt;name>${jooq.generator.db.dialect}&lt;\/name>                   &lt;includes>.*&lt;\/includes>                   &lt;inputSchema>${jooq.schema}&lt;\/inputSchema>               &lt;\/database>               &lt;!-- Generate classes for tables and records -->               &lt;generate>                   &lt;globalTableReferences>true&lt;\/globalTableReferences>                   &lt;globalUDTReferences>false&lt;\/globalUDTReferences>                   &lt;fluentSetters>true&lt;\/fluentSetters>                   &lt;javaTimeTypes>true&lt;\/javaTimeTypes>               &lt;\/generate>               &lt;!-- Configure the target package and directory -->               &lt;target>                   &lt;packageName>ru.sportmaster.wfm.jooq.db&lt;\/packageName>                   &lt;directory>target\/generated-sources\/jooq&lt;\/directory>               &lt;\/target>           &lt;\/generator>       &lt;\/configuration>   &lt;\/plugin><\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c-\u0442\u043e, \u0432\u0441\u0451 \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e (\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f junit \u0438 spring boot test \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u043e\u043d\u0430 \u0442\u0435\u0441\u0442\u043e\u0432). \u041f\u0440\u043e\u0433\u043e\u043d\u044f\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u044f \u0431\u0443\u0434\u0443 \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435. \u041f\u043e\u043f\u0440\u043e\u0448\u0443 spring boot \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043c\u043d\u0435 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e.<\/p>\n<pre><code class=\"java\">@SpringBootTest public class Demo {     \/* \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0431\u0438\u043d \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 jooq, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f     \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u0431\u0434 *\/     @Autowired     Configuration conf;  }<\/code><\/pre>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c mvn clean compile (\u043c\u043e\u0436\u043d\u043e \u0438 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0434\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d jooq-codeget, \u043d\u043e \u044f \u043f\u043e \u043f\u0440\u0438\u0432\u044b\u0447\u043a\u0435 \u043f\u043e\u0439\u0434\u0443 \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u043f\u0443\u0442\u0451\u043c). \u0415\u0441\u043b\u0438 \u0432\u0441\u0451 \u0431\u044b\u043b\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e, \u0442\u043e \u0432 \u043b\u043e\u0433\u0435 \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c, \u043a\u0430\u043a Jooq \u043f\u0440\u0438\u0446\u0435\u043f\u0438\u043b\u0441\u044f \u043a \u0431\u0430\u0437\u0435, \u0437\u0430\u0447\u0438\u0442\u0430\u043b \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438\u0437 \u0441\u043b\u043e\u0432\u0430\u0440\u0435\u0439 \u0438 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043b \u043b\u043e\u0433 \u043e \u0441\u0432\u043e\u0435\u0439 \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432 \u043f\u0430\u043f\u043a\u0435 target (\u043d\u0443 \u0438\u043b\u0438 \u043a\u0443\u0434\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438) \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b:<\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p>\u0422\u0430\u043c \u043a\u0430\u043a \u0440\u0430\u0437 \u043d\u0430\u0448\u0430 \u0432\u044c\u044e\u0448\u043a\u0430, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0432\u044b\u0434\u0430\u043b\u0438 \u0433\u0440\u0430\u043d\u0442\u044b. \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 :<\/p>\n<details class=\"spoiler\">\n<summary>VDemoTable<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">\/**  * This class is generated by jOOQ.  *\/ @SuppressWarnings({ \"all\", \"unchecked\", \"rawtypes\" }) public class VDemoTable extends TableImpl&lt;VDemoTableRecord> {            .......................           \/**      * The column &lt;code>V_DEMO_TABLE.A&lt;\/code>.      *\/     public final TableField&lt;VDemoTableRecord, Byte> A = createField(DSL.name(\"A\"), SQLDataType.TINYINT, this, \"\");      \/**      * The column &lt;code>V_DEMO_TABLE.B&lt;\/code>.      *\/     public final TableField&lt;VDemoTableRecord, String> B = createField(DSL.name(\"B\"), SQLDataType.VARCHAR(5), this, \"\");      ........................ } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0412 \u043d\u0451\u043c \u0435\u0441\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442, \u2014 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u043f\u043f\u0438\u043d\u0433 \u043f\u043e\u043b\u0435\u0439 \u0431\u0430\u0437\u044b \u0432 \u043f\u043e\u043b\u044f java-\u043a\u043b\u0430\u0441\u0441\u0430: \u043f\u043e\u043b\u0435 a number(2) -> Byte, \u043f\u043e\u043b\u0435 b varchar2(5) -> String. \u0414\u0430\u043b\u044c\u0448\u0435 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 view:<\/p>\n<pre><code class=\"java\">@Test<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-397921","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/397921","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=397921"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/397921\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=397921"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=397921"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=397921"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}