H2数据库的使用指南

平时做项目的时候不免要与数据库打交道,而连接数据库是一个非常麻烦的操作:

  • 如果是新开的时候,还需要反复确认数据库要建立在哪里。
  • 要确保自己的机器与数据库服务器之间的网络可靠性
  • 因为数据库可能是共享的,不能因为自己对结构的调整,就影响了其他人的工作。
    ... ...

H2作为一款纯Java实现的内存数据库,可以在项目完全不依赖外部项目的情况下,帮助验证我们与数据库相关的代码。毕竟大多数时候,我们只是在验证自己的功能,而不是数据库好不好用。

在Maven的pom.xml中添加:

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>${h2.version}</version>
</dependency>

在开始验证,我们需要准备一些文件,假设我们有这样一张表,我将其命名为book.sql放到resource目录下。

CREATE TABLE IF NOT EXISTS `book`
(
    `id`           INT           NOT NULL AUTO_INCREMENT,
    `bookname`     VARCHAR(45)   NULL,
    `publish_time` DATETIME      NULL,
    `author`       VARCHAR(200)  NULL,
    `web_url`      VARCHAR(2000) NULL,
    `description`  VARCHAR(2000) NULL,
    PRIMARY KEY (`id`)
)
    ENGINE = InnoDB;

数据库里面肯定是需要数据的,如果我们的初始化数据使用insert语句在完成,从可操作性和可读性上来说实在是太糟糕了,还好H2提供了内置的函数可以帮助我们从CSV获取数据。

INSERT INTO book(`id`,`bookname`,`publish_time`,`author`,`web_url`,`description`)
SELECT *
FROM CSVREAD('classpath:book.csv');

CSV格式的文件比较简单,编辑器在编辑这种格式的文件时候也有很多很好用的插件可以支持我们来编辑它,比如下面这样的CSV文件:

`id`,`bookname`,`publish_time`,`author`,`web_url`,`description`
1,hello,2020-02-07 11:47:47,zhangsan,https://book.douban.com/subject/26279878/,balalalalalal

在IDEA中允许以表格的样式对csv文件进行调整(需要安装插件):

编辑csv格式的数据

以上的文件均放到maven的resource目录下。

基础工作完成之后,我们就可以利用最基本的JDBC接口对H2进行一番验证了。

public class H2DatabaseTest {
    
    // 数据库的基本配置
    private static final String DRIVER_CLASS = "org.h2.Driver";
    private static final String DATABASE_URL = buildDatabaseUrl();
    private static final String USERNAME = "sa";
    private static final String PASSWORD = "sa";

    public static void main(String[] args) throws Exception {

        Class.forName(DRIVER_CLASS);
        final Connection connection = DriverManager
                .getConnection(DATABASE_URL, USERNAME, PASSWORD);

        String sql = "select * from book";

        final PreparedStatement preparedStatement = connection.prepareStatement(sql);

        final ResultSet resultSet = preparedStatement.executeQuery();

        while (resultSet.next()) {
            System.out.println(resultSet.getInt("id"));
            System.out.println(resultSet.getDate("publish_time"));
        }

        preparedStatement.close();
        connection.close();

        // in memory模式下,如果希望外部客户端访问内存数据库,需要额外启动 tcp 服务器
        final Server server = Server.createTcpServer().start();

        server.shutdown();

    }

    private static String buildDatabaseUrl() {

        String ddl_file = "classpath:book.sql";
        String data_file = "classpath:book_init.sql";

        // 通过URL配置H2内存数据库的参数
        return new StringBuilder()
                // 指定数据库的启动模式,以及启动的数据库名称
                .append("jdbc:h2:mem:test;")
                // 要求以MySQL的语法模式运行
                .append("MODE=mysql;")
                // 要求数据库名称小写
                .append("DATABASE_TO_LOWER=TRUE;")
                // 要求对字段的大小写不敏感
                .append("CASE_INSENSITIVE_IDENTIFIERS=TRUE;")
                // 要求数据库在程序停止之前,一直保存在内存中
                .append("DB_CLOSE_DELAY=-1;")
                // 运行初始化语句,将数据库的初始化结构和数据导入,这里要注意如果要运行多个脚本的话,最后的分好要放好转义符。
                .append("INIT=RUNSCRIPT from '").append(ddl_file).append("'\\;")
                .append("RUNSCRIPT from '").append(data_file).append("';")
                .toString();

    }

}

以上代码运行一遍,可以很明显看到console中输出了csv中保存的数据。

运行的结果

H2本身提供了非常丰富的功能,也提供了很完善的文档 ,在单元测试中,我们就可以使用H2数据库来模拟我们真实的数据库对我们的应用进行功能性的验证了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,780评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,424评论 1 305
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,397评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,576评论 0 218
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,997评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,945评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,107评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,850评论 0 208
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,625评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,804评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,285评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,613评论 3 261
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,291评论 3 242
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,164评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,963评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,096评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,886评论 2 278

推荐阅读更多精彩内容