LINUX.ORG.RU

Состряпал конструктор SQL на Java

 , , , ,


1

1

Несколько лет назад при разработке одного крупного проекта на PHP, который только и делал что писал, читал и обновлял тонны данных в SQL, я решил написать для этого проекта конструктор SQL-запросов, который тогда сильно облегчил мне жизнь и по сей день помогает мне и мои коллегам в ежедневной работе. Дело в том, что выложить этот конструктор в общественный доступ я не могу, так как проект принадлежит не мне, да и сильно завязан этот конструктор на наш фреймворк.

В связи с чем я решил разработать его аналог на Java: https://github.com/r0ck3r/IQL

Документация доступна там же, а вот некоторые примеры использования:

Connection con = DriverManager.getConnection("jdbc:mysql://server/database", properties);

Вставка данных:

IQL iql = new IQL(con);  
iql.addTable("mytable");  
iql.setInsertRows("name %s", "register_date %d", "level %i");  
iql.insert("User1", "17.05.2017", 4);  
iql.insert("User2", "12.03.2016", 5);  
Statement st = iql.getStatement();

Сгенерирует следующее:

INSERT INTO `mytable`(`name`, `register_date`, `level`) VALUES ('User1', 1494968400, 4), ('User2', 1457730000, 5)

Обновление данных:

IQL iql = new IQL(con);  
iql.addTable("organisations");  
iql.setUpdateRows("name %s", "address %s");  
iql.update("New orgname", "New address");  
iql.whereId(112);  
PreparedStatement ps = iql.getStatement();
Сгенерирует следующее:
UPDATE `organisations` SET `name` = 'New orgname', `address` = 'New address' WHERE `organisations`.`id` = 112
при этом, если для операций обновления или удаления не указан where, то будет сгенерировано исключение

Пример выборки:

IQL iql = new IQL(con);
iql.addTable("domains").select("subdomain subdomain", "domain domain").where("domain %s", IQL.ISNTNULL);
iql.addTable("orgs").select("org_name name", "org_address address").where("org_name %s", IQL.LIKE, "%организация%");
iql.join(2, "id", 1, "org_id"); //присоединить к таблице №2 (orgs) таблицу №1 domains по полям id из orgs к org_id из domains
String SQL = iql.getSQL();

Создаст следующий SQL-код:

SELECT 
`domains`.`subdomain` AS `subdomain`, 
`domains`.`domain` AS `domain`, 
`orgs`.`org_name` AS `name`, 
`orgs`.`org_address` AS `address` 
FROM `orgs` 
JOIN `domains` ON `orgs`.`id` = `domains`.`org_id` 
WHERE 
`domains`.`domain` IS NOT NULL AND 
`orgs`.`org_name` LIKE '%организация%'

В общем, кому надо - используйте

★★★★★
Ответ на: комментарий от r0ck3r

Примеры, пожалуйста - буду исправлять, чтоб вам не пахло

seriously?

Хотя бы SOLID нужно начать соблюдать.

JavaDoc нужен.

Ваш класс IQL, который должен быть, видимо фасадом(но в этом случае он должен быть только фасадом), вызывает просто кровавые слезы и требует разнесения на кучу файлов и глубокий рефакторинг.

nihirash ★★★
()
Ответ на: комментарий от nihirash

SOLID:

На каждый объект должна быть возложена одна единственная обязанность.

где мои объекты выполняют больше одной обязанности?

Принцип открытости/закрытости

вроде выполнено в пределах разумного

Принцип подстановки Барбары Лисков
Объекты в программе могут быть заменены их наследниками без изменения свойств программы.

Разве нет?

Принцип разделения интерфейса
Клиенты не должны быть вынуждены реализовывать ненужные методы, которые они не будут использовать

Ничего лишнего не нужно реализовывать

Принцип инверсии зависимостей

Здесь нет кода, который должен был бы выполняться независимо друг от друга

JavaDoc

Добавил

Ваш класс IQL, который должен быть, видимо фасадом(но в этом случае он должен быть только фасадом), вызывает просто кровавые слезы и требует разнесения на кучу файлов и глубокий рефакторинг.
требует разнесения на кучу файлов

Если вы про вложенные приватные классы, то их имеет смысл выносить в разные классы только тогда, когда они хотя бы теоретически могут использоваться за пределами главного класса. Разве не так? Или вы еще что-то увидели?

r0ck3r ★★★★★
() автор топика
Ответ на: комментарий от nihirash

Хотя бы SOLID нужно начать соблюдать.

С чего это? В мечеть нужно ходить совершать намаз.

dzidzitop ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.