Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4 5 6 7   вперед  Ctrl      все
 JDBC необязательные параметры  [new]
Korcar
Member

Откуда:
Сообщений: 7316
Всем привет.

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

Типа есть поле id и name. Юзер может искать по одному из этих полей, а может и по обоим сразу. Как быть в этом случае? 3 текста запроса прописывать - это ж не комильфо
10 сен 18, 14:57    [21669901]     Ответить | Цитировать Сообщить модератору
 Re: JDBC необязательные параметры  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 34416
Korcar,
Без параметров. Склейкой строк. Не рекомендуется.
10 сен 18, 15:02    [21669908]     Ответить | Цитировать Сообщить модератору
 Re: JDBC необязательные параметры  [new]
Korcar
Member

Откуда:
Сообщений: 7316
Petro123
Korcar,
Без параметров. Склейкой строк. Не рекомендуется.

склейкой строк? ну это же фу ...

а если столбцов поиска 10шт, тогда как? неужели в такой сложной технологии нет простого решения по мультиколоночному поиску?
10 сен 18, 15:06    [21669911]     Ответить | Цитировать Сообщить модератору
 Re: JDBC необязательные параметры  [new]
chpasha
Member

Откуда:
Сообщений: 7218
Korcar
неужели в такой сложной технологии

что в ней сложного?

Korcar
простого решения по мультиколоночному поиску

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

я бы не стал заниматься преждевременной оптимизацией - динамический запрос с параметрами скорее всего закроет вопрос. Главное чтобы поиск происходил по индексу, тут уже зависит от возможностей БД. Если у тебя база от такого прогибается, то возможно нужно радикально другое решение.
10 сен 18, 15:17    [21669926]     Ответить | Цитировать Сообщить модератору
 Re: JDBC необязательные параметры  [new]
Alexander A. Sak
Member

Откуда: Омск
Сообщений: 976
В простом случае можно написать под себя генератор SQL-запроса по переданным значениям.
В сложном случае внезапно может получиться MyBatis, поэтому можно сразу попробовать с него.
10 сен 18, 15:17    [21669927]     Ответить | Цитировать Сообщить модератору
 Re: JDBC необязательные параметры  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 34416
Аффтар! Сегодня не пятница.
10 сен 18, 15:50    [21669974]     Ответить | Цитировать Сообщить модератору
 Re: JDBC необязательные параметры  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 14482
Korcar
Юзер может искать по одному из этих полей, а может и по обоим сразу. Как быть в этом случае? 3 текста запроса прописывать - это ж не комильфо
средствами sql решается просто.
но для этого надо сформировать sql строку. тут StringBuilder рулит .
один из вариантов для mysql
ввёл юзер :
про 65 дло

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сек - любое количество полей
10 сен 18, 16:13    [21669994]     Ответить | Цитировать Сообщить модератору
 Re: JDBC необязательные параметры  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7104
вадя
.... like '%65%'

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

если можно использовать Bind переменные, их использвать практически __обязательно__. AFAIK
10 сен 18, 16:22    [21670006]     Ответить | Цитировать Сообщить модератору
 Re: JDBC необязательные параметры  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7104
в процессе склеевания 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
10 сен 18, 16:26    [21670010]     Ответить | Цитировать Сообщить модератору
 Re: JDBC необязательные параметры  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 14482
Leonid Kudryavtsev
Для Oracle и других серьезных СУБД - говнокод, который:
про оракл не отвечаю, а mssql и mysql работает на отлично
10 сен 18, 16:27    [21670011]     Ответить | Цитировать Сообщить модератору
 Re: JDBC необязательные параметры  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7104
вадя
StringBuilder рулит
....
про оракл не отвечаю, а mssql и mysql работает на отлично


А как проблемы с безопасностью (SQL Injection) обходишь?
Одного StringBuilder'а явно не достаточно )))
10 сен 18, 16:30    [21670016]     Ответить | Цитировать Сообщить модератору
 Re: JDBC необязательные параметры  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7104
Самый главный пункт забыл )))

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

если можно использовать Bind переменные, их использвать практически __обязательно__. AFAIK
10 сен 18, 16:31    [21670018]     Ответить | Цитировать Сообщить модератору
 Re: JDBC необязательные параметры  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 14482
Leonid Kudryavtsev
А как проблемы с безопасностью (SQL Injection) обходишь?
Одного StringBuilder'а явно не достаточно )))
ожидаемый вопрос :)
я не зря написал
вадя
один из вариантов для mysql

я принципиально использую только хранимки
а в них динамичесий запрос https://dev.mysql.com/doc/refman/8.0/en/sql-syntax-prepared-statements.html
и ни каких проблем с инъекциями
10 сен 18, 16:39    [21670023]     Ответить | Цитировать Сообщить модератору
 Re: JDBC необязательные параметры  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7104
Ваш пример - запрос с литералами. Даже по Вашей ссылке на "Prepared SQL Statement Syntax" первый же пример, создание запроса с биндами.

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

AFAIK
10 сен 18, 16:50    [21670037]     Ответить | Цитировать Сообщить модератору
 Re: JDBC необязательные параметры  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 14482
Leonid Kudryavtsev
Ваш пример - запрос с литералами. Даже по Вашей ссылке на "Prepared SQL Statement Syntax" первый же пример, создание запроса с биндами.
по ссылке mysql 8.0, я же указал 5.7.
хоть 8.0 и идёт после 5.7 , но это достаточно большие разницы
и я показал как основу, оптимизация и улучшения - по месту только поощряется
10 сен 18, 16:57    [21670047]     Ответить | Цитировать Сообщить модератору
 Re: JDBC необязательные параметры  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 14482
я уже давно применяю такое для поиска и отображения найденного после каждого введённого символа, только для ограничения вывода использую limit 5
10 сен 18, 17:07    [21670059]     Ответить | Цитировать Сообщить модератору
 Re: JDBC необязательные параметры  [new]
Андрей Панфилов
Member

Откуда: Москва > Melbourne
Сообщений: 2846
вадя
средствами sql решается просто.
но для этого надо сформировать sql строку. тут StringBuilder рулит .
один из вариантов для mysql
ввёл юзер :
про 65 дло

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 не нужен будет и вообще залетает все.
10 сен 18, 17:21    [21670086]     Ответить | Цитировать Сообщить модератору
 Re: JDBC необязательные параметры  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 14482
Андрей Панфилов
а зачем вы так сложно делаете? добавьте новое поле и заполняйте его тригером, тогда concat_ws не нужен будет и вообще залетает все.
это всё можно и возможно сделать - нужно смотреть по конкретному случаю.
у меня в базе набор товара не достигал и 50 000, поэтому дополнительной оптимизации не требовалось.
счас появилась база в 2,9м - тут и требуется оптимизировать.
10 сен 18, 17:41    [21670117]     Ответить | Цитировать Сообщить модератору
 Re: JDBC необязательные параметры  [new]
Partisan M
Member

Откуда:
Сообщений: 1275
вопрос не имеет отношения к JDBC.
10 сен 18, 18:40    [21670176]     Ответить | Цитировать Сообщить модератору
 Re: JDBC необязательные параметры  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 14482
Partisan M
вопрос не имеет отношения к JDBC.

это точно.
10 сен 18, 19:00    [21670194]     Ответить | Цитировать Сообщить модератору
 Re: JDBC необязательные параметры  [new]
Korcar
Member

Откуда:
Сообщений: 7316
Partisan M
вопрос не имеет отношения к JDBC.

может в драйверах есть какие-то расширенные функции. там ж куча классов


автор
1) подвержен SQL Injection

удалять или дублировать кавычки, если таковые есть в передаваемых параметрах не решат проблему?
12 сен 18, 07:05    [21671674]     Ответить | Цитировать Сообщить модератору
 Re: JDBC необязательные параметры  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 34416
Korcar
может в драйверах есть какие-то расширенные функции. там ж куча классов
для чего?
Склейка строк она и в Африке склейка.
Зайди на ветку СУБД, там тебе тоже самое скажут.
12 сен 18, 07:22    [21671681]     Ответить | Цитировать Сообщить модератору
 Re: JDBC необязательные параметры  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 14482
Korcar
удалять или дублировать кавычки, если таковые есть в передаваемых параметрах не решат проблему?
много что надо контролировать....
решение проблемы - хранимые процедуры.
Petro123
Склейка строк она и в Африке склейка.

единственное - если обрабатывать строки в хранимых процедурах - возможно будет быстрее
12 сен 18, 07:42    [21671693]     Ответить | Цитировать Сообщить модератору
 Re: JDBC необязательные параметры  [new]
Korcar
Member

Откуда:
Сообщений: 7316
Petro123
Korcar
может в драйверах есть какие-то расширенные функции. там ж куча классов
для чего?
Склейка строк она и в Африке склейка.
Зайди на ветку СУБД, там тебе тоже самое скажут.

Заранее мне это не было известно, иначе б не спрашивал.

По факту всё программирование - это строки и можно ляпать их в обычном блокнотике даже без подсветки синтаксиса, но почему-то большинство предпочитают ИДЕ и прочие удобства
12 сен 18, 08:15    [21671700]     Ответить | Цитировать Сообщить модератору
 Re: JDBC необязательные параметры  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 14482
Korcar
Заранее мне это не было известно, иначе б не спрашивал.
в том то и дело что это известно заранее - это не параметры запроса , это сам запрос.
12 сен 18, 08:23    [21671706]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4 5 6 7   вперед  Ctrl      все
Все форумы / Java Ответить