|
JDBC необязательные параметры
|
|||
---|---|---|---|
#18+
Всем привет. Кто делал поиск по базе с препарированием по заранее неизвестному количеству полей? Как при этом запрос выглядит и параметры указываются? Типа есть поле id и name. Юзер может искать по одному из этих полей, а может и по обоим сразу. Как быть в этом случае? 3 текста запроса прописывать - это ж не комильфо ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2018, 14:57 |
|
JDBC необязательные параметры
|
|||
---|---|---|---|
#18+
Korcar, Без параметров. Склейкой строк. Не рекомендуется. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2018, 15:02 |
|
JDBC необязательные параметры
|
|||
---|---|---|---|
#18+
Petro123Korcar, Без параметров. Склейкой строк. Не рекомендуется. склейкой строк? ну это же фу ... а если столбцов поиска 10шт, тогда как? неужели в такой сложной технологии нет простого решения по мультиколоночному поиску? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2018, 15:06 |
|
JDBC необязательные параметры
|
|||
---|---|---|---|
#18+
Korcarнеужели в такой сложной технологии что в ней сложного? Korcarпростого решения по мультиколоночному поиску и как это должно работать, если правила применения критериев известны только тебе? ну например, что ID нужно искать по условию = , name по ilike '%value%', a personalNumber пo like 'value%'? я бы не стал заниматься преждевременной оптимизацией - динамический запрос с параметрами скорее всего закроет вопрос. Главное чтобы поиск происходил по индексу, тут уже зависит от возможностей БД. Если у тебя база от такого прогибается, то возможно нужно радикально другое решение. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2018, 15:17 |
|
JDBC необязательные параметры
|
|||
---|---|---|---|
#18+
В простом случае можно написать под себя генератор SQL-запроса по переданным значениям. В сложном случае внезапно может получиться MyBatis, поэтому можно сразу попробовать с него. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2018, 15:17 |
|
JDBC необязательные параметры
|
|||
---|---|---|---|
#18+
Аффтар! Сегодня не пятница. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2018, 15:50 |
|
JDBC необязательные параметры
|
|||
---|---|---|---|
#18+
KorcarЮзер может искать по одному из этих полей, а может и по обоим сразу. Как быть в этом случае? 3 текста запроса прописывать - это ж не комильфосредствами sql решается просто. но для этого надо сформировать sql строку. тут StringBuilder рулит . один из вариантов для mysql ввёл юзер : Код: plaintext
Код: sql 1. 2. 3. 4.
по скорости - mysql 5.7.23 - 2 950 000 записей - 1.14сек - любое количество полей ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2018, 16:13 |
|
JDBC необязательные параметры
|
|||
---|---|---|---|
#18+
вадя.... like '%65%' Для Oracle и других серьезных СУБД - говнокод, который: 1) может замусоривать SGA (system global area). В наиболее продвинутых случаях, может даже приводить к эффекту "все стоит колом" 2) т.к. каждый запрос уникальный, будет hard parse. Есть опция позволяющая даже такой говнокод свести в soft parse, но она может вызывать проблемы и так далее если можно использовать Bind переменные, их использвать практически __обязательно__. AFAIK ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2018, 16:22 |
|
JDBC необязательные параметры
|
|||
---|---|---|---|
#18+
в процессе склеевания 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.09.2018, 16:26 |
|
JDBC необязательные параметры
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevДля Oracle и других серьезных СУБД - говнокод, который:про оракл не отвечаю, а mssql и mysql работает на отлично ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2018, 16:27 |
|
JDBC необязательные параметры
|
|||
---|---|---|---|
#18+
вадяStringBuilder рулит .... про оракл не отвечаю, а mssql и mysql работает на отлично А как проблемы с безопасностью (SQL Injection) обходишь? Одного StringBuilder'а явно не достаточно ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2018, 16:30 |
|
JDBC необязательные параметры
|
|||
---|---|---|---|
#18+
Самый главный пункт забыл ))) говнокод, который: 1) подвержен SQL Injection 2) может замусоривать SGA (system global area). В наиболее продвинутых случаях, может даже приводить к эффекту "все стоит колом" 3) т.к. каждый запрос уникальный, будет hard parse. Есть опция позволяющая даже такой говнокод свести в soft parse, но она может вызывать проблемы и так далее если можно использовать Bind переменные, их использвать практически __обязательно__. AFAIK ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2018, 16:31 |
|
JDBC необязательные параметры
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevА как проблемы с безопасностью (SQL Injection) обходишь? Одного StringBuilder'а явно не достаточно )))ожидаемый вопрос :) я не зря написал вадяодин из вариантов для mysql я принципиально использую только хранимки а в них динамичесий запрос https://dev.mysql.com/doc/refman/8.0/en/sql-syntax-prepared-statements.html и ни каких проблем с инъекциями ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2018, 16:39 |
|
JDBC необязательные параметры
|
|||
---|---|---|---|
#18+
Ваш пример - запрос с литералами. Даже по Вашей ссылке на "Prepared SQL Statement Syntax" первый же пример, создание запроса с биндами. Клеет запросы и вклеевать туда литералы - плохой стиль. Если можно через Bind - нужно делать через Bind. Кода, конечно, будет больше (практически ровно в 2-а раза) AFAIK ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2018, 16:50 |
|
JDBC необязательные параметры
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevВаш пример - запрос с литералами. Даже по Вашей ссылке на "Prepared SQL Statement Syntax" первый же пример, создание запроса с биндами.по ссылке mysql 8.0, я же указал 5.7. хоть 8.0 и идёт после 5.7 , но это достаточно большие разницы и я показал как основу, оптимизация и улучшения - по месту только поощряется ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2018, 16:57 |
|
JDBC необязательные параметры
|
|||
---|---|---|---|
#18+
я уже давно применяю такое для поиска и отображения найденного после каждого введённого символа, только для ограничения вывода использую limit 5 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2018, 17:07 |
|
JDBC необязательные параметры
|
|||
---|---|---|---|
#18+
вадясредствами sql решается просто. но для этого надо сформировать sql строку. тут StringBuilder рулит . один из вариантов для mysql ввёл юзер : Код: plaintext
Код: sql 1. 2. 3. 4.
по скорости - mysql 5.7.23 - 2 950 000 записей - 1.14сек - любое количество полейа зачем вы так сложно делаете? добавьте новое поле и заполняйте его тригером, тогда concat_ws не нужен будет и вообще залетает все. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2018, 17:21 |
|
JDBC необязательные параметры
|
|||
---|---|---|---|
#18+
Андрей Панфилова зачем вы так сложно делаете? добавьте новое поле и заполняйте его тригером, тогда concat_ws не нужен будет и вообще залетает все.это всё можно и возможно сделать - нужно смотреть по конкретному случаю. у меня в базе набор товара не достигал и 50 000, поэтому дополнительной оптимизации не требовалось. счас появилась база в 2,9м - тут и требуется оптимизировать. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2018, 17:41 |
|
JDBC необязательные параметры
|
|||
---|---|---|---|
#18+
вопрос не имеет отношения к JDBC. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2018, 18:40 |
|
JDBC необязательные параметры
|
|||
---|---|---|---|
#18+
Partisan Mвопрос не имеет отношения к JDBC. это точно. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2018, 19:00 |
|
JDBC необязательные параметры
|
|||
---|---|---|---|
#18+
Partisan Mвопрос не имеет отношения к JDBC. может в драйверах есть какие-то расширенные функции. там ж куча классов автор1) подвержен SQL Injection удалять или дублировать кавычки, если таковые есть в передаваемых параметрах не решат проблему? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2018, 07:05 |
|
JDBC необязательные параметры
|
|||
---|---|---|---|
#18+
Korcarможет в драйверах есть какие-то расширенные функции. там ж куча классовдля чего? Склейка строк она и в Африке склейка. Зайди на ветку СУБД, там тебе тоже самое скажут. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2018, 07:22 |
|
JDBC необязательные параметры
|
|||
---|---|---|---|
#18+
Korcarудалять или дублировать кавычки, если таковые есть в передаваемых параметрах не решат проблему?много что надо контролировать.... решение проблемы - хранимые процедуры. Petro123Склейка строк она и в Африке склейка. единственное - если обрабатывать строки в хранимых процедурах - возможно будет быстрее ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2018, 07:42 |
|
JDBC необязательные параметры
|
|||
---|---|---|---|
#18+
Petro123Korcarможет в драйверах есть какие-то расширенные функции. там ж куча классовдля чего? Склейка строк она и в Африке склейка. Зайди на ветку СУБД, там тебе тоже самое скажут. Заранее мне это не было известно, иначе б не спрашивал. По факту всё программирование - это строки и можно ляпать их в обычном блокнотике даже без подсветки синтаксиса, но почему-то большинство предпочитают ИДЕ и прочие удобства ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2018, 08:15 |
|
|
start [/forum/topic.php?fid=59&msg=39701223&tid=2121789]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
33ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
70ms |
get tp. blocked users: |
1ms |
others: | 319ms |
total: | 472ms |
0 / 0 |