有时,特别是对于内存数据库,在客户端连接到数据库时自动执行 DDL 或 DML 命令是非常有用的。这一功能可通过 INIT 属性启用。请注意,可以向 INIT 传递多个命令,但必须转义分号分隔符,如下例所示。
jdbc:h2:mem:test;INIT=runscript from '~/create.sql'\;runscript from '~/init.sql'
示例代码:
(1)在用户主目录下面创建 create.sql,内容如下:
CREATE TABLE PERSON( id int primary key, name varchar(255) );
(2)在用户主目录下面创建 init.sql,内容如下:
INSERT INTO PERSON(`id`, `name`) values (1, 'Tom'); INSERT INTO PERSON(`id`, `name`) values (2, 'Bill'); INSERT INTO PERSON(`id`, `name`) values (3, 'Helen');
(3)编写测试代码:
package com.hxstrive.h2.jdbc_url; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; /** * H2 JDBC URL 示例,连接时执行SQL语句 * @author hxstrive.com * @since 1.0.0 2024/9/25 10:57 */ public class UrlDemo10 { public static void main(String[] args) { try { // 连接到数据库时,执行SQL脚本创建表和初始化数据 // 注意:URL 中的 ~ 符号表示用户主目录 Connection connection = DriverManager.getConnection( "jdbc:h2:mem:test;INIT=runscript from '~/create.sql'\\;runscript from '~/init.sql'"); // 查询数据 Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT * FROM PERSON"); while(resultSet.next()) { System.out.println(resultSet.getInt("id") + " - " + resultSet.getString("name")); } // 释放资源 resultSet.close(); statement.close(); connection.close(); } catch (Exception e) { e.printStackTrace(); } } }
执行代码,输出如下:
1 - Tom 2 - Bill 3 - Helen
⚠️注意:只有在 Java 或属性文件中,“转义分号分隔符”才需要使用双反斜线。在图形用户界面或 XML 文件中,只需要一个反斜杠。例如:
<property name="url" value="jdbc:h2:mem:test;INIT=runscript from '~/create.sql'\;runscript from '~/init.sql'" /> <property name="url" value="jdbc:h2:mem:test;INIT=create schema if not exists test\;runcript from '~/sql/init.sql'" />
初始脚本中的反斜线(例如在运行脚本语句中指定 Windows 中的文件夹名称)也需要转义(使用第二个反斜线)。因此,在文件夹名称中避免使用反斜线可能会更简单,而应使用正斜线。