Я использую Java, Spring (NamedParameterJdbcTemplate) и MySQL. Мой оператор похож на это:
INSERT INTO Table1 (Name) VALUES (?);
INSERT INTO Table2 (Path, Table1Id) VALUES (?, LAST_INSERT_ID())
Но это бросает следующую ошибку:
PreparedStatementCallback; bad SQL grammar [INSERT INTO Table1 (Name) VALUES (?);
INSERT INTO Table2 (Path, Table1Id) VALUES (?, LAST_INSERT_ID())
] `
Вложенная исключительная ситуация:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT INTO Table2 (Path, Table1Id' at line 1
Синтаксис хорошо работает в MySQL, но что-то произошло при объединении через шаблон Spring.
Спасибо!
Используйте метод addBatch для запуска нескольких операторов
Statement stmt = con.createStatement();
stmt.addBatch(
"update registration set balance=balance-5.00
where theuser="+theuser);
stmt.addBatch(
"insert into auctionitems(
description, startprice)
values("+description+","+startprice+")");
int[] results = stmt.executeBatch();
вы пропустили точку с запятой; во втором заявлении. Я думаю, что это синтаксическая ошибка, чем что-либо еще.
попытка запустить две команды на консоли mysql и se, если синтаксис правильный.
Я всегда запускаю команду на консоли, чтобы убедиться, что sytax.
Драйвер MySQL JDBC не поддерживает несколько операторов, разделенных символом ';', даже если это делает сам клиент MySQL. Вы не можете полагаться на это, если вам нужно делать это с помощью Java.
Если у вас 100 000 записей, уверены ли вы, что Java - подходящий инструмент для работы? Мне было бы интересно, были бы лучше инструменты импорта MySQL или ETL, если бы это было пакетное задание.
А как насчет пакетного модуля Spring? Есть ли что-нибудь специально для этой проблемы?
Вам нужно выполнять каждую инструкцию отдельно. Сначала вставьте в table1, затем вставьте в table2
Для тех, кто хочет выполнять несколько операторов из jdbcTemplate с MySQL без использования пакетного обновления:
Добавить «? AllowMultiQueries = true "в конце URL-адреса (см. пример ниже).
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/tt?allowMultiQueries=true" />
<property name="username" value="root" />
<property name="password" value="" />
</bean>
Протестировано с помощью метода jdbcTemplate.execute, Spring 3.0.2 и драйвера MySQL v5.1.9
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>