Всегда используйте «prepare», будет аналога prepareStatement, но точное имя функции будет зависеть от вашей базы данных и комбинации драйверов.
Преимущества подготовленного оператора перед execute (String) много: -
Оператор анализируется, и план доступа определяет только один раз при выполнении оператора "prepare". В зависимости от того, сколько раз вы выполняете оператор, это может
привести к гораздо лучшей производительности.
Вам не нужно беспокоиться о специальных символах в строковых данных, когда вы передаете их через
SetString (). При выполнении (строка) любые одинарные кавычки или точки с запятой в данных приведут к ошибке разбора.
Хуже то, как работают атаки "sql инъекция". Если в качестве данных введена строка типа «x» из cust_table; delete from cust_table; select », это может привести к тому, что оператор delete будет проанализирован и выполнен.
Обработка чисел намного эффективнее. Вызов setInt принимает целочисленное значение, как и для эквивалентной строки SQL, которую необходимо преобразовать в символы, а затем СУБД должна преобразовать ее обратно в целое число.
читаемость. Вы кодируете один SQL-оператор с несколькими вопросительными знаками, куда идут переменные, которые относительно легко читаются, в отличие от умственного анализа и анализа последовательности конкатенаций строк, создающих дополнительный шум для экранированных кавычек и т. Д.
Однако есть пара случаев, когда execute (String) на самом деле лучше.
Там, где ваши ключи распределены очень неравномерно. НАПРИМЕР. Если 95% ваших клиентов живут в США, и вы хотите перечислить 4%, которые живут в Канаде, то "где страна =?" обычно приводит к сканированию табличного пространства, в то время как при использовании "where country = 'CA'" у вас есть шанс использовать индекс.
В другом случае пользователь может ввести или опустить несколько критериев поиска. Намного лучше создать строку SQL для заданных вами критериев, чем составить сложный запрос, который справляется со всеми возможными перестановками входных критериев.