平時做項目的時候不免要與數據庫打交道,而連接數據庫是一個非常麻煩的操作:
- 如果是新開的時候,還需要反覆確認數據庫要建立在哪裏。
- 要確保自己的機器與數據庫服務器之間的網絡可靠性
- 因爲數據庫可能是共享的,不能因爲自己對結構的調整,就影響了其他人的工作。
... ...
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文件進行調整(需要安裝插件):
以上的文件均放到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數據庫來模擬我們真實的數據庫對我們的應用進行功能性的驗證了。