平时做项目的时候不免要与数据库打交道,而连接数据库是一个非常麻烦的操作:
- 如果是新开的时候,还需要反复确认数据库要建立在哪里。
- 要确保自己的机器与数据库服务器之间的网络可靠性
- 因为数据库可能是共享的,不能因为自己对结构的调整,就影响了其他人的工作。
... ...
H2作为一款纯Java实现的内存数据库,可以在项目完全不依赖外部项目的情况下,帮助验证我们与数据库相关的代码。毕竟大多数时候,我们只是在验证自己的功能,而不是数据库好不好用。
在Maven的pom.xml
中添加:
com.h2database
h2
${h2.version}
在开始验证,我们需要准备一些文件,假设我们有这样一张表,我将其命名为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数据库来模拟我们真实的数据库对我们的应用进行功能性的验证了。