Java 8 наконец -то прибыл! Работая база данных.
Функциональный метод обработки данных
Java 8 не только добавляет функциональную поддержку, но и расширяет класс сбора с помощью новых данных обработки функций.
Например, предположим, что у вас есть коллекция коллекции: клиент: клиент:
Коллекция <Customer> клиенты;
Если вы заинтересованы только в клиентах из Бельгии, у вас будут все объекты клиента и сохранить только то, что вам нужно.
Коллекция <Customer> Бельгии = новый ArrayList <() ();
Это не только стоит 5 строк кода, но это не очень абстрактное. Код с потоком для переписывания всего кода.
С Java 8 только одна строка кода может достичь тех же функций. Просто сделайте фильтрацию.
Customs.stream ().
Код версии Java 8 не только короче, но и проще для понимания. тратить время на интерпретацию кода в цикле интерпретации, чтобы понять, что он делает для своих данных.
Что мне делать, если вы хотите выполнить этот код одновременно?
Customs.parallelstream ().
Что более интересно, так это то, что этот код функционального стиля также применим к базе данных
Используйте метод функции в базе данных
Традиционно, программисты должны использовать специальную базу данных для оператора запроса для доступа к данным базы данных.
Подготовка S = con.prepareStatement ("select *" + "от клиента C" + "где c.country =?");Большинство из этих кодов являются строкой, которая сделает компилятор не находить ошибки, и этот поспешный код вызовет проблемы безопасности. Предоставьте язык запросов базы данных, вы можете решить неправильные проверки и проблемы с безопасностью. Или используйте инструмент сопоставления отношений объекта, чтобы избежать большого количества скучного кода, но его можно использовать только в общем доступе к запросам.
Используйте Java 8, чтобы запросить базу данных по функциональным API. Например, Jinq - это проект с открытым исходным кодом, и какой API базы данных будущего, который он исследует, может сделать возможным функциональное программирование. Вот запрос базы данных с использованием Jinq:
Клиенты. Где (c-> c.getcountry (). Equals ("Бельгия");Этот код почти такой же, как код с использованием потокового API. Когда код запускается, Jinq автоматически переведет в код запроса базы данных, как и запрос JDBC.
В этом случае, даже если вы не узнали какой -то новый язык запросов базы данных, вы можете написать эффективный запрос базы данных. Вы можете использовать тот же стиль кода для сбора на Java. Вам не нужен специальный компилятор Java или виртуальную машину. Все компиляции кода и работа на обычной Java 8 JDK. Если ваш код неверен, компилятор найдет их и сообщит его вам, как обычный код Java.
Jinq поддерживает тот же сложный запрос, что и SQL92. Алгоритм кода перевода Java в запрос базы данных очень гибкий, если он может его принять, он может перевести. Например, Jinq может перевести запрос базы данных ниже, хотя он сложный.
Customers .Where (C-> C.getCountry (). Equals ("Belgium") .Where (c-> {if (c.getsalarly () <100000) Return c.getsALALALALALALALALALALALALAALAAALAAAALAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA a his a a onectctctctctctctctct his his role work work work Рабочая работа Работа Работа Работа Работа WOR Work Work Worker.Как видите, функциональное программирование Java 8 очень подходит для запроса базы данных. И запрос компактный, и даже сложные запросы могут быть компетентными.
Внутренняя операция
Но как вы работаете? Как обычные компиляторы Java могут преобразовать код Java в запрос базы данных? Что особенного в Java 8, чтобы сделать это возможным?
Ключом к поддержке этих новых PI базы данных, которые поддерживают эти функции, является метод анализа байт -кодов, который называется «символическое выполнение». Хотя ваш код составлен обычным компилятором Java и работает в обычной виртуальной машине Java, Jinq может анализировать и создавать из него запрос базы данных, когда вы составляете код Java. При использовании API Java 8 Streams часто обнаруживается, что при анализе коротких функций рабочий эффект символического исполнения является лучшим.
Чтобы понять, как работает это символическое исполнение, самый простой способ - использовать пример. Давайте проверим, как следующие запросы преобразуются в язык SQL -запроса Jinq:
Клиенты. Где (c-> c.getcountry (). Equals ("Бельгия"))))))))))))))))))))))) Первоначально переменные клиенты - это коллекция, а соответствующий запрос базы данных:
Выберите * из клиентов c
Затем метод где () вызывается, и к нему передается функция. В методе where () Jinq открывает файл .class этой функции, чтобы получить байтовый код, скомпилированный этой функцией для анализа. В этом примере не используйте реальный байтовый код, давайте используем некоторые простые инструкции, чтобы представить байтовый код этой функции:
d = c.getCountry () e = "Бельгия" e = d.equals (e) return e
Здесь мы предполагаем, что функция была составлена компилятором Java в эти четыре инструкции. Когда называется метод где (), Jinq видит это. Как Jinq может понять этот код?
Jinq анализируется с помощью Custing Code. Но Jinq не запускает код напрямую. Это «абстрактный» код операции: без реальных переменных и реальных значений Jinq использует символы, чтобы указать все значения при выполнении кода. Вот почему этот анализ называется «символическим исполнением».
Jinq выполняет каждую инструкцию и отслеживает все, что все побочные эффекты или код изменяются во время состояния программы. Ниже приведен диаграмма, которая показывает все побочные эффекты, найденные, когда Jinq выполняет четыре строки кода в символическом исполнении.
Пример символического исполнения
На рисунке вы можете видеть, что после запуска первой инструкции Jinq обнаружил два побочных эффекта: переменная D изменилась, и был вызван метод Customer.getCountry (). Поскольку это символическое выполнение, переменная D не дает реальной ценности реальной, такой как «США» или «Дания», которая присваивается символическому значению C.GetCountry ().
После того, как все эти инструкции выполняются, Jinq оптимизированные побочные эффекты. Поскольку переменная D и E представляют собой локальные переменные, любые переменные будут отброшены после выхода функции, поэтому эти побочные эффекты можно игнорировать. Jinq также знает, что customer.getCountry () и string.equals () не изменяет никаких переменных или отображает какие -либо выводы, поэтому эти методы можно игнорировать. В результате Jinq может сделать вывод, что эта функция будет производить только одну роль, и она вернет C.GetCountry ().
После того, как Jinq понял функции, передаваемые им в методе where (), он может смешивать знание запроса базы данных и дать новый запрос базы данных в коллекции клиентов.
Генерировать запрос базы данных
Так Jinq генерирует запрос базы данных из вашего кода. Использование символического выполнения означает, что этот метод довольно мощный для различных режимов кода из разных компиляторов Java. Если код, встречаемый Jinq, имеет побочные эффекты, которые не могут быть преобразованы в запрос базы данных, Jinq будет держать ваш код без изменений. Поскольку все написано в обычном коде Java, Jinq может запускать этот код напрямую, и ваш код даст ожидаемые результаты.
Этот простой пример перевода должен позволить вам понять, как запросить перевод работает. Вы можете быть уверены, что эти алгоритмы могут правильно генерировать запросы базы данных из вашего кода.
Красивая перспектива
Я надеюсь, что я позволил вам попробовать новый способ работы с базой данных, принесенный Java 8 в Java. Функциональное программирование, поддерживаемое Java 8, позволяет записать код для базы данных для написания кода для коллекции Java. Есть надежда, что существующие API базы данных будут расширены для поддержки этих типов запросов.