我可以让H2在内存数据库中自动创build一个模式吗?
(我已经看到H2数据库在内存中 – 通过Spring / Hibernate问题的初始化模式 ;这里不适用。)
我想知道H2中是否有一个设置可以让我在连接的时候自动创build一个模式。 如果有帮助,我只对内存情况感兴趣。
H2支持URL末尾的各种以分号分隔的修饰符,但是我没有find自动创build模式的修饰符。 有这样的function吗?
是的,H2 连接时支持执行SQL语句 。 你可以运行一个脚本,或者只是一个或两个语句:
String url = "jdbc:h2:mem:test;" + "INIT=CREATE SCHEMA IF NOT EXISTS TEST" String url = "jdbc:h2:mem:test;" + "INIT=CREATE SCHEMA IF NOT EXISTS TEST\\;" + "SET SCHEMA TEST"; String url = "jdbc:h2:mem;" + "INIT=RUNSCRIPT FROM '~/create.sql'\\;" + "RUNSCRIPT FROM '~/populate.sql'";
请注意,在Java中只需要双反斜杠( \\
)。 之前的反斜杠;
在INIT
是必需的。
“默认情况下,当应用程序调用DriverManager.getConnection(url, ...)
并且URL中指定的数据库尚不存在时,将创build一个新的(空的)数据库。” – H2数据库 。
附录:@Thomas Mueller展示了如何在Connection上执行SQL ,但我有时只是在代码中创build并填充,如下所示。
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; /** @see http://stackoverflow.com/questions/5225700 */ public class H2MemTest { public static void main(String[] args) throws Exception { Connection conn = DriverManager.getConnection("jdbc:h2:mem:", "sa", ""); Statement st = conn.createStatement(); st.execute("create table customer(id integer, name varchar(10))"); st.execute("insert into customer values (1, 'Thomas')"); Statement stmt = conn.createStatement(); ResultSet rset = stmt.executeQuery("select name from customer"); while (rset.next()) { String name = rset.getString(1); System.out.println(name); } } }