Питання Java, як змінити поточну базу даних на іншу?


У мене є підключення Java-програми до бази даних MySQL, як я можу змінити поточну базу даних на інший на тому ж з'єднання?

Я підключаюся до MySQL таким чином:

DriverManager.getConnection("jdbc:mysql://"+server+"/",log,pass);

Після деяких операцій я хочу підключитися до іншої бази даних mysql на тому ж з'єднання. Як я можу це зробити?

Я спробував використати:

Statement stat= con.createStatement();
ResultSet r=stat.executeQuery("use mysql"); 

Але це не змінює використовувану базу даних.


18
2017-11-17 18:11


походження




Відповіді:


Як описано в Документація MySQL вам потрібно використовувати Connection.setCatalog() перейти на іншу базу даних. Це також прямо говорить, що ви повинні ні виконати a USE <databasename> переключитися

Причиною такого попередження є те, що JDBC є загальним інтерфейсом до баз даних, і тому забезпечує методи для найбільш поширених завдань, включаючи перемикання catalogs (або databases як вони знаходяться в MySQL). Специфікація JDBC / javadoc також чітко говорить, що люди повинні використовувати API за допомогою конкретних команд баз даних (якщо обидва доступні). Для цього є кілька причин: 1) він пропагує незалежний від бази даних код; 2) водій може робити додаткові речі внутрішньо в відповідь на один з методів API. Використання конкретних команд бази даних може призвести до неправильного керування драйвером, оскільки його внутрішній стан не відповідає стану бази даних.

Заклик до setCatalog(String) не вплине на існуючі заяви, як зазначено в документації API JDBC:

Дзвінок setCatalog не впливає на раніше створені або підготовлені Statement об'єкти Встановлено, чи виконується операція підготовки СУБД негайно, коли Connection метод prepareStatement або prepareCall викликається Для максимальної портативності setCatalog слід називати перед а Statement створено або підготовлено.


27
2017-11-17 18:18



дуже тобі дякую :) - ognistysztorm
Слід додати, що заяви, створені раніше Connection.setCatalog() був викликаний, як і раніше матиме доступ до попередньої бази даних. - Max
@ Макс Чи знаєте ви, чи це вказано в специфікації JDBC, чи це конкретне правило для реалізації MySQL? Я, як правило, працюю з Firebird, і оскільки у нього немає каталогів, я зазвичай глянець над такими подробицями;) - Mark Rotteveel
@MarkRotteveel Я не маю ідеї бути чесним. Я просто спробував переключити бази даних, як ви запропонували, і він працював тільки після того, як також відтворити заявлення. - Max
@Макс Ok, просто подивився його: це вказано в документі API. Я додам посилання на нього в моєму відповіді. - Mark Rotteveel


Ви можете префіксувати ім'я бази даних у ваших табличних іменах, як це.

Наприклад: db1 has table1 і db2 has table2

select * from db1.table1, db2.table2;

Це дозволить вам виконувати перехресні запити бази даних


4
2017-11-17 18:19