H2数据库

it2022-06-26  104

项目地址:https://gitee.com/firewolf/open-utils/tree/master/H2 H2官网地址:http://www.h2database.com/html/main.html

一、简单介绍

H2数据库是一个开源的关系型数据库。H2是一个嵌入式数据库引擎,采用java语言编写,不受平台的限制,同时支持网络版和嵌入式版本,有比较好的兼容性,支持相当标准的sql标准,支持集群提供JDBC、ODBC访问接口,提供了非常友好的基于web的数据库管理界面。一般情况下,我们会采用H2的内存数据库做单元测试的编写。

二、使用方式

因为现在的项目多半都是springboot项目,所以我这里只讲解springboot项目中的用H2进行单元测试的使用方式,其他的大同小异。

引入相关依赖<dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> 这里引入的是最新的版本,我们可以根据自己的需要进行版本指定。目前最新版本是1.4.199。 这里面用的两个数据库初始化脚本文件如下: schema.sql:create table if not exists user ( user_id int not null primary key auto_increment, user_name varchar(100), user_sex varchar(1), user_age NUMBER(3), user_id_no VARCHAR(18), user_phone_num VARCHAR(11), user_email VARCHAR(100), create_time DATETIME, modify_time DATETIME, user_status VARCHAR(1) ); data.sqlINSERT INTO USER (USER_NAME, USER_SEX, USER_AGE, USER_ID_NO, USER_PHONE_NUM, USER_EMAIL, CREATE_TIME, MODIFY_TIME, USER_STATUS) VALUES ('赵一', '0', 20, '142323198610051234', '12345678910', 'qe259@163.com', sysdate, sysdate, '0'); INSERT INTO USER (USER_NAME, USER_SEX, USER_AGE, USER_ID_NO, USER_PHONE_NUM, USER_EMAIL, CREATE_TIME, MODIFY_TIME, USER_STATUS) VALUES ('钱二', '0', 22, '142323198610051235', '12345678911', 'qe259@164.com', sysdate, sysdate, '0'); INSERT INTO USER (USER_NAME, USER_SEX, USER_AGE, USER_ID_NO, USER_PHONE_NUM, USER_EMAIL, CREATE_TIME, MODIFY_TIME, USER_STATUS) VALUES ('孙三', '1', 24, '142323198610051236', '12345678912', 'qe259@165.com', sysdate, sysdate, '0'); 在测试环境的配置文件application-test.properties中对h2进行配置server.port=7771 ##h2配置 ##数据库连接设置 #配置h2数据库的连接地址,这里指定使用内存进行存储,数据库名为test2 spring.datasource.url=jdbc:h2:mem:test2 #配置数据库用户名 spring.datasource.username=sa #配置数据库密码 spring.datasource.password=sa #配置JDBC Driver spring.datasource.driverClassName=org.h2.Driver ##数据初始化设置 #进行该配置后,每次启动程序,程序都会运行resources/db/schema.sql文件,对数据库的结构进行操作。 spring.datasource.schema=classpath:db/schema.sql #进行该配置后,每次启动程序,程序都会运行resources/db/data.sql文件,对数据库的数据操作。 spring.datasource.data=classpath:db/data.sql ##h2 web console设置 #表明使用的数据库平台是h2 spring.datasource.platform=h2 # 进行该配置后,h2 web consloe就可以在远程访问了。否则只能在本机访问。 spring.h2.console.settings.web-allow-others=true #进行该配置,你就可以通过YOUR_URL/h2访问h2 web consloe。YOUR_URL是你程序的访问URl。 spring.h2.console.path=/h2 #进行该配置,程序开启时就会启动h2 web consloe。当然这是默认的,如果你不想在启动程序时启动h2 web consloe,那么就设置为false spring.h2.console.enabled=true 我们可以根据自己的需要进行删减这样,我们就可以在项目中使用了 无论我们使用什么持久层框架,都是没有影响的,比如,使用JDBC:package com.firewolf.utils.open.h2.repository; import com.firewolf.utils.open.h2.bean.User; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import lombok.extern.slf4j.Slf4j; @Slf4j public class H2Utils { private Connection conn; private static H2Utils instance; private H2Utils() { try { Class.forName("org.h2.Driver"); conn = DriverManager. getConnection("jdbc:h2:mem:test2", "sa", "sa"); } catch (Exception e) { log.error("get connection error", e); } } public static H2Utils getInstance() { if (instance == null) { instance = new H2Utils(); } return instance; } public void addUser(User user) { try { String sql = "INSERT INTO USER " + "(USER_NAME, USER_SEX, USER_AGE, USER_ID_NO, USER_PHONE_NUM, USER_EMAIL, CREATE_TIME,MODIFY_TIME, USER_STATUS) " + "VALUES (?, ?, ?, ?,?, ?, sysdate, sysdate, ?)"; PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, user.getUserName()); ps.setString(2, user.getUserSex()); ps.setInt(3, user.getUserAge()); ps.setString(4, user.getUserIdNo()); ps.setString(5, user.getUserPhoneNum()); ps.setString(6, user.getUserEmail()); ps.setString(7, user.getUserStatus()); ps.executeUpdate(); } catch (SQLException e) { log.error("insert user error !!! ", e); } } public List<User> findAll() { List<User> userList = new ArrayList<>(); try { String sql = "select * from user"; Statement statement = conn.createStatement(); ResultSet rs = statement.executeQuery(sql); while (rs.next()) { User user = new User(); user.setUserName(rs.getString("user_name")); user.setUserId(rs.getInt("user_id")); user.setUserAge(rs.getInt("user_age")); user.setUserEmail(rs.getString("user_email")); user.setUserIdNo(rs.getString("user_id_no")); user.setUserPhoneNum(rs.getString("user_phone_num")); user.setUserSex(rs.getString("user_sex")); user.setUserStatus(rs.getString("user_status")); user.setCreateTime(rs.getDate("create_time")); user.setModifyTime(rs.getDate("modify_time")); userList.add(user); } } catch (SQLException e) { log.error("find data error !!!", e); } return userList; } public void update(User user) { String sql = "update user set " + "USER_NAME=?,USER_SEX=?,USER_AGE=?,USER_ID_NO=?,USER_PHONE_NUM=?,USER_EMAIL=?,MODIFY_TIME=sysdate,USER_STATUS=? " + "where USER_ID=?"; try { PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, user.getUserName()); ps.setString(2, user.getUserSex()); ps.setInt(3, user.getUserAge()); ps.setString(4, user.getUserIdNo()); ps.setString(5, user.getUserPhoneNum()); ps.setString(6, user.getUserEmail()); ps.setString(7, user.getUserStatus()); ps.setInt(8, user.getUserId()); ps.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } } public void delete(Integer id) { String sql = "delete from user where user_id=?"; try { PreparedStatement ps = conn.prepareStatement(sql); ps.setInt(1, id); ps.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } } } 我们会发现,其实持久层的代码编写和H2根本就没有关系,还是JDBC那一套,该怎么写就怎么写,Mybatis也是一样的。项目就能正常使用了,这里不都啰嗦控制台 我们可以通过web访问h2数据库,根据在配置文件中配置的路径,我们在浏览器输入http://localhost:7771/h2,效果如下: 我们根据配置文件中的信息输入登录后如下: 这里可以看到刚才创建的表,也可以执行语句进行数据库操作。

最新回复(0)