H2 连接时执行SQL

有时,特别是对于内存数据库,在客户端连接到数据库时自动执行 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 中的文件夹名称)也需要转义(使用第二个反斜线)。因此,在文件夹名称中避免使用反斜线可能会更简单,而应使用正斜线。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号