本文主要介绍采用内存模式访问H2数据库。
推荐H2的理由:
1. H2对Oracle语法的支持(这方面H2完爆Derby);
2. 采用内存模式访问数据库时,数据库在内存中创建,运行结束后无残留,
非常适合持久层的单元测试;
开发环境:JDK,Eclipse, Maven
开发实践:
注意事项:1. 在eclipse中创建一个maven工程;
2. 在pom.xml中添加对h2的依赖,如下:
<dependencies>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.192</version>
</dependency>
</dependencies>
3. 编写数据访问类(DAO), 如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
public class UserMapper {
public static void main(String[] args) throws Exception {
//初始H2的数据库驱动
Class.forName("org.h2.Driver");
//获取数据库连接
//jdbc:h2:mem:test, mem表示采用内存模式访问数据库
Connection conn = DriverManager.getConnection("jdbc:h2:mem:test");
//创建表并插入初始数据
String sql = "drop table if exists firsttable;"
+ "create table firsttable (id int primary key, name varchar(255));"
+ "insert into firsttable values (1, 'Hello');"
+ "insert into firsttable values (2, 'World');";
//查询数据
Statement stmt = conn.createStatement();
stmt.execute(sql);
PreparedStatement ppstmt = conn.prepareStatement("select * from firsttable");
ResultSet r = ppstmt.executeQuery();
while(r.next())
System.out.println(r.getInt("id") +", "+ r.getString("name"));
//关闭数据库连接
conn.close();
}
}
当使用jdbc:h2:mem:访问数据库时, 执行序列的sql "select seq_user.nextval from dual"时会报一个错误:sql "identifier" error;
将url改成jdbc:h2:mem:数据库名后,问题解决
常见问题
1. 数据库文件存在哪里 (以下内容是摘自H2 Documentation)
当使用数据库链接 jdbc:h2:~test时,数据库文件会存储在系统用户所在的文件夹。对应windows系统,对应的路径为
C:\Documents and Settings\<userName> or C:\Users\<userName>。如果路径为jdbc:h2:./test, 数据库文件会存放在
应用启动的目录下。如果通过开始目录里面生成的H2应用打开数据库,数据库文件会存储在 <H2安装路径>/bin。
数据库文件路径可以根据需要自定义。可以采用相对/绝对路径。比如jdbc:h2:file:./data/sample, 数据库文件sample.mv.db存储