powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JDBC необязательные параметры
25 сообщений из 158, страница 1 из 7
JDBC необязательные параметры
    #39700441
Korcar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.

Кто делал поиск по базе с препарированием по заранее неизвестному количеству полей? Как при этом запрос выглядит и параметры указываются?

Типа есть поле id и name. Юзер может искать по одному из этих полей, а может и по обоим сразу. Как быть в этом случае? 3 текста запроса прописывать - это ж не комильфо
...
Рейтинг: 0 / 0
JDBC необязательные параметры
    #39700445
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Korcar,
Без параметров. Склейкой строк. Не рекомендуется.
...
Рейтинг: 0 / 0
JDBC необязательные параметры
    #39700447
Korcar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Korcar,
Без параметров. Склейкой строк. Не рекомендуется.
склейкой строк? ну это же фу ...

а если столбцов поиска 10шт, тогда как? неужели в такой сложной технологии нет простого решения по мультиколоночному поиску?
...
Рейтинг: 0 / 0
JDBC необязательные параметры
    #39700457
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Korcarнеужели в такой сложной технологии
что в ней сложного?

Korcarпростого решения по мультиколоночному поиску
и как это должно работать, если правила применения критериев известны только тебе? ну например, что ID нужно искать по условию = , name по ilike '%value%', a personalNumber пo like 'value%'?

я бы не стал заниматься преждевременной оптимизацией - динамический запрос с параметрами скорее всего закроет вопрос. Главное чтобы поиск происходил по индексу, тут уже зависит от возможностей БД. Если у тебя база от такого прогибается, то возможно нужно радикально другое решение.
...
Рейтинг: 0 / 0
JDBC необязательные параметры
    #39700458
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В простом случае можно написать под себя генератор SQL-запроса по переданным значениям.
В сложном случае внезапно может получиться MyBatis, поэтому можно сразу попробовать с него.
...
Рейтинг: 0 / 0
JDBC необязательные параметры
    #39700483
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аффтар! Сегодня не пятница.
...
Рейтинг: 0 / 0
JDBC необязательные параметры
    #39700497
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KorcarЮзер может искать по одному из этих полей, а может и по обоим сразу. Как быть в этом случае? 3 текста запроса прописывать - это ж не комильфосредствами sql решается просто.
но для этого надо сформировать sql строку. тут StringBuilder рулит .
один из вариантов для mysql
ввёл юзер :
Код: plaintext
про 65 дло

Код: sql
1.
2.
3.
4.
select поля_ для_вывода from таблица 
where concat_ws(' ', поле_поиска1,поле_поиска2,поле_поискаN) like '%про%' and
concat_ws(' ', поле_поиска1,поле_поиска2,поле_поискаN) like '%65%'
concat_ws(' ', поле_поиска1,поле_поиска2,поле_поискаN) like '%дло%'



по скорости - mysql 5.7.23 - 2 950 000 записей - 1.14сек - любое количество полей
...
Рейтинг: 0 / 0
JDBC необязательные параметры
    #39700503
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя.... like '%65%'

Для Oracle и других серьезных СУБД - говнокод, который:
1) может замусоривать SGA (system global area). В наиболее продвинутых случаях, может даже приводить к эффекту "все стоит колом"
2) т.к. каждый запрос уникальный, будет hard parse. Есть опция позволяющая даже такой говнокод свести в soft parse, но она может вызывать проблемы
и так далее

если можно использовать Bind переменные, их использвать практически __обязательно__. AFAIK
...
Рейтинг: 0 / 0
JDBC необязательные параметры
    #39700506
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в процессе склеевания SQL подсчитать кол-во Bind переменных и потом их вставить - не слишком сложно (хотя код, конечно, получается в 2-а раза длиннее)

3 текста запроса прописывать - это ж не комильфо
Иногда это единственный выход (((. Если от параметров запроса сильно съезжает план выполнения. Для разных наборов приходится делать разные запросы или хинтовать. AFAIK

В принципе, если табличка одна и планы выполнения не важны, то можно всегда передавать все возможные параметры
Типа:
SELECT * FROM table
WHERE
(:param1 is null OR table.field1 = :param1 ) and
(:param2 is null OR table.field2 = :param2 ) and
....
Но этот "легкий" вариант, может намертво угробить план запросов. Т.ч. так лучше не делать.

AFAIK
...
Рейтинг: 0 / 0
JDBC необязательные параметры
    #39700507
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevДля Oracle и других серьезных СУБД - говнокод, который:про оракл не отвечаю, а mssql и mysql работает на отлично
...
Рейтинг: 0 / 0
JDBC необязательные параметры
    #39700509
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяStringBuilder рулит
....
про оракл не отвечаю, а mssql и mysql работает на отлично

А как проблемы с безопасностью (SQL Injection) обходишь?
Одного StringBuilder'а явно не достаточно )))
...
Рейтинг: 0 / 0
JDBC необязательные параметры
    #39700511
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самый главный пункт забыл )))

говнокод, который:
1) подвержен SQL Injection
2) может замусоривать SGA (system global area). В наиболее продвинутых случаях, может даже приводить к эффекту "все стоит колом"
3) т.к. каждый запрос уникальный, будет hard parse. Есть опция позволяющая даже такой говнокод свести в soft parse, но она может вызывать проблемы
и так далее

если можно использовать Bind переменные, их использвать практически __обязательно__. AFAIK
...
Рейтинг: 0 / 0
JDBC необязательные параметры
    #39700516
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevА как проблемы с безопасностью (SQL Injection) обходишь?
Одного StringBuilder'а явно не достаточно )))ожидаемый вопрос :)
я не зря написал
вадяодин из вариантов для mysql
я принципиально использую только хранимки
а в них динамичесий запрос https://dev.mysql.com/doc/refman/8.0/en/sql-syntax-prepared-statements.html
и ни каких проблем с инъекциями
...
Рейтинг: 0 / 0
JDBC необязательные параметры
    #39700520
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ваш пример - запрос с литералами. Даже по Вашей ссылке на "Prepared SQL Statement Syntax" первый же пример, создание запроса с биндами.

Клеет запросы и вклеевать туда литералы - плохой стиль. Если можно через Bind - нужно делать через Bind. Кода, конечно, будет больше (практически ровно в 2-а раза)

AFAIK
...
Рейтинг: 0 / 0
JDBC необязательные параметры
    #39700525
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevВаш пример - запрос с литералами. Даже по Вашей ссылке на "Prepared SQL Statement Syntax" первый же пример, создание запроса с биндами.по ссылке mysql 8.0, я же указал 5.7.
хоть 8.0 и идёт после 5.7 , но это достаточно большие разницы
и я показал как основу, оптимизация и улучшения - по месту только поощряется
...
Рейтинг: 0 / 0
JDBC необязательные параметры
    #39700531
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я уже давно применяю такое для поиска и отображения найденного после каждого введённого символа, только для ограничения вывода использую limit 5
...
Рейтинг: 0 / 0
JDBC необязательные параметры
    #39700548
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадясредствами sql решается просто.
но для этого надо сформировать sql строку. тут StringBuilder рулит .
один из вариантов для mysql
ввёл юзер :
Код: plaintext
про 65 дло

Код: sql
1.
2.
3.
4.
select поля_ для_вывода from таблица 
where concat_ws(' ', поле_поиска1,поле_поиска2,поле_поискаN) like '%про%' and
concat_ws(' ', поле_поиска1,поле_поиска2,поле_поискаN) like '%65%'
concat_ws(' ', поле_поиска1,поле_поиска2,поле_поискаN) like '%дло%'



по скорости - mysql 5.7.23 - 2 950 000 записей - 1.14сек - любое количество полейа зачем вы так сложно делаете? добавьте новое поле и заполняйте его тригером, тогда concat_ws не нужен будет и вообще залетает все.
...
Рейтинг: 0 / 0
JDBC необязательные параметры
    #39700567
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилова зачем вы так сложно делаете? добавьте новое поле и заполняйте его тригером, тогда concat_ws не нужен будет и вообще залетает все.это всё можно и возможно сделать - нужно смотреть по конкретному случаю.
у меня в базе набор товара не достигал и 50 000, поэтому дополнительной оптимизации не требовалось.
счас появилась база в 2,9м - тут и требуется оптимизировать.
...
Рейтинг: 0 / 0
JDBC необязательные параметры
    #39700600
Partisan M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопрос не имеет отношения к JDBC.
...
Рейтинг: 0 / 0
JDBC необязательные параметры
    #39700611
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Partisan Mвопрос не имеет отношения к JDBC.
это точно.
...
Рейтинг: 0 / 0
JDBC необязательные параметры
    #39701202
Korcar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Partisan Mвопрос не имеет отношения к JDBC.
может в драйверах есть какие-то расширенные функции. там ж куча классов


автор1) подвержен SQL Injection
удалять или дублировать кавычки, если таковые есть в передаваемых параметрах не решат проблему?
...
Рейтинг: 0 / 0
JDBC необязательные параметры
    #39701208
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Korcarможет в драйверах есть какие-то расширенные функции. там ж куча классовдля чего?
Склейка строк она и в Африке склейка.
Зайди на ветку СУБД, там тебе тоже самое скажут.
...
Рейтинг: 0 / 0
JDBC необязательные параметры
    #39701218
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Korcarудалять или дублировать кавычки, если таковые есть в передаваемых параметрах не решат проблему?много что надо контролировать....
решение проблемы - хранимые процедуры.
Petro123Склейка строк она и в Африке склейка.
единственное - если обрабатывать строки в хранимых процедурах - возможно будет быстрее
...
Рейтинг: 0 / 0
JDBC необязательные параметры
    #39701223
Korcar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Korcarможет в драйверах есть какие-то расширенные функции. там ж куча классовдля чего?
Склейка строк она и в Африке склейка.
Зайди на ветку СУБД, там тебе тоже самое скажут.
Заранее мне это не было известно, иначе б не спрашивал.

По факту всё программирование - это строки и можно ляпать их в обычном блокнотике даже без подсветки синтаксиса, но почему-то большинство предпочитают ИДЕ и прочие удобства
...
Рейтинг: 0 / 0
JDBC необязательные параметры
    #39701228
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KorcarЗаранее мне это не было известно, иначе б не спрашивал.в том то и дело что это известно заранее - это не параметры запроса , это сам запрос.
...
Рейтинг: 0 / 0
25 сообщений из 158, страница 1 из 7
Форумы / Java [игнор отключен] [закрыт для гостей] / JDBC необязательные параметры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]