H2內嵌數據庫的使用


 
        

H2內嵌數據庫的使用

 

H2是一個開源的嵌入式數據庫引擎,采用java語言編寫,不受平台的限制。

同時H2提供了一個十分方便的web控制台用於操作和管理數據庫內容。

H2還提供兼容模式,可以兼容一些主流的數據庫,因此采用H2作為開發期的數據庫非常方便。

H2作為一個嵌入型的數據庫,它最大的好處就是可以嵌入到我們的Web應用中,和我們的Web應用綁定在一起,成為我們Web應用的一部分。

 

運行方式

H2數據庫有三種運行方式實現:

  1. 嵌入式(embedded):可以同應用程序打包在一起發布,這樣可以非常方便地存儲少量結構化數據

  2. 服務模式:

    1. TCP/IP server:支持客戶端/服務器端的連接方式

    2. web server:此種運行方式支持使用瀏覽器訪問H2 Console

    3. PG server:支持PostgreSQL客戶端

  3. 內存方式:可以作為緩存,作為NoSQL的一個補充。當某些場景下數據模型必須為關系型,可以拿它當Memcached使,作為后端MySQL/Oracle的一個緩沖層,緩存一些不經常變化但需要頻繁訪問的數據,比如字典表、權限表。

 

JDBC URL

 

1、內嵌模式不用啟動服務,已內嵌,不用顯示啟動服務

String jdbcURL = "jdbc:h2:~/h2/db";

 

2、TCP/IP server 服務器模式,必須要顯示啟動服務

String jdbcURL = "jdbc:h2:tcp://localhost/~/h2/db";

 

3、內存模式

String jdbcURL = "jdbc:h2:mem:h2db";
​
// 或者
​
String jdbcURL = "jdbc:h2:tcp://localhost/mem:h2db";

 

 


 

Java應用中的使用

 

操作實例

H2數據庫基本操作:

// ~ 用戶目錄C:\Users\用戶名\
String jdbcURL = "不同模式下,不同的jdbcURL,其他操作一樣";
​
//連接數據庫時使用的用戶名
final String user = "tianya";
​
//連接數據庫時使用的密碼
String password = "123456";
​
//連接H2數據庫時使用的驅動類
//org.h2.Driver 
String driverClass="org.h2.Driver";
​
try {
    
    // 1、加載驅動
    Class.forName(driverClass);
    
    // 2、獲取連接
    Connection connection = DriverManager.getConnection(jdbcURL, user, password);
    Statement statement = connection.createStatement();
    
    // 3、執行操作
    // 3.1、先刪除表,若存在
    statement.execute("drop table user_info if exists ");
    
    // 3.2、創建表
    statement.execute("create table user_info(id int primary key, name varchar(10), age int , sex varchar(2) )");
    
    // 4、新增
    statement.executeUpdate("insert into user_info(id,name,age,sex) values(1,'張三',23,'男' )");
    statement.executeUpdate("insert into user_info(id,name,age,sex) values(2,'李四',25,'男' )");
    statement.executeUpdate("insert into user_info(id,name,age,sex) values(3,'王五',33,'男' )");
    statement.executeUpdate("insert into user_info(id,name,age,sex) values(4,'珠簾',23,'女' )");
    statement.executeUpdate("insert into user_info(id,name,age,sex) values(5,'鯉魚',20,'女' )");
    
    // 5、查詢
    ResultSet rs = statement.executeQuery("select * from user_info");
    while (rs.next()) {
        System.out.println(rs.getInt(1) + " - " + rs.getString(2) 
        + " - " + rs.getInt(3)+ " - " + rs.getString(4) );
    }
    
    // 釋放資源
    statement.close();
    connection.close();
    
} catch (Exception e) {
    e.printStackTrace();
}
 

 

 


 

 

Java web 應用中的使用

 

H2服務的啟動

 

1.命令行啟動服務

java -cp h2*.jar org.h2.tools.Server -?
​
常見的選項如下:
​
-web:啟動支持H2 Console的服務
-webPort <port>:服務啟動端口,默認為8082
-browser:啟動H2 Console web管理頁面
-tcp:使用TCP server模式啟動
-pg:使用PG server模式啟動
​

 

如:

## 瀏覽器web服務方式
java -jar h2*.jar org.h2.tools.Server -web -webPort 8082 -browser 

 



## TCP服務方式
java -jar h2*.jar org.h2.tools.Server -tcp -tcpPort 9092 -tcpSSL 

 

 

 

 

 

 

2.Servlet的方式

 

注解的方式

package com.tianya.mw.web;
​
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
​
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRegistration.Dynamic;
import javax.servlet.annotation.WebListener;
​
import org.apache.log4j.Logger;
import org.h2.server.web.WebServlet;
import org.h2.tools.Server;
​
/**
 * Copyright: Copyright (c) 2019 tianwyam
 * 
 * @ClassName: H2DBServerListener.java
 * @Description: 在WEB應用中啟動H2數據庫服務的監聽器
 * @version: v1.0.0
 * @author: tianwyam
 * @date: 2019年3月18日 上午9:56:21
 */
@WebListener
public class H2DBServerListener implements ServletContextListener {
​
    private transient static final Logger log = Logger.getLogger(H2DBServerListener.class);
    // H2 DB 服務
    private Server server;
    
    // H2 tcp訪問的端口
    public static final int H2_DB_SERVER_PORT = 8082 ;
​
    @Override
    public void contextInitialized(ServletContextEvent event) {
        
        
        try {
            
            // 啟動H2數據庫服務
            log.info("啟動H2數據庫...");
            log.info(String.format("TCP客戶端訪問端口:%s", H2_DB_SERVER_PORT));
            // 默認端口為8082
            server = Server.createTcpServer(
                    "-tcpPort", 
                    String.valueOf(H2_DB_SERVER_PORT), 
                    "-tcpAllowOthers").start();
            log.info("H2數據庫啟動成功...");
            
​
            // 注解方式 添加 H2 DB console 訪問 WebServlet
            // 注冊 H2數據庫 web 控制台  
            // 添加 org.h2.server.web.WebServlet
            ServletContext servletContext = event.getServletContext();
            Dynamic webServlet = servletContext.addServlet("H2Console", WebServlet.class);
            // 控制台 訪問路徑
            webServlet.addMapping("/console/*");
            webServlet.setLoadOnStartup(1);
            // 設置配置
            Map<String, String> initParameters = new HashMap<>();
            initParameters.put("allowOthers", "true");
            initParameters.put("trace", "true");
            webServlet.setInitParameters(initParameters);
            
            log.info("H2 CONSOLE 默認訪問URL:http://localhost:8080/[project_name]/console/");
            
            
        } catch (SQLException e) {
            log.error("H2數據庫啟動失敗!", e);
        }
​
    }
​
    @Override
    public void contextDestroyed(ServletContextEvent event) {
​
        // 停止服務
        if (server != null) {
            log.info("關閉H2數據庫...");
            server.shutdown();
            log.info("關閉H2數據庫成功...");
        }
    }
​
}

 


 

web.xml配置方式

<!-- 注冊服務監聽 -->
<listener>
    <listener-class>com.tianya.mw.web.H2DBServerListener</listener-class>
</listener><!-- 使用H2控制台的Servlet H2控制台是一個獨立的應用程序,
包括它自己的Web服務器,但它可以作為一個servlet作為-->
<servlet>
    <servlet-name>H2Console</servlet-name>
    <servlet-class>org.h2.server.web.WebServlet</servlet-class>
     <init-param>
        <param-name>webAllowOthers</param-name>
        <param-value></param-value>
    </init-param>
    <init-param>
        <param-name>trace</param-name>
        <param-value></param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet><!-- 映射H2控制台的訪問路徑 -->
<servlet-mapping>
    <servlet-name>H2Console</servlet-name>
    <url-pattern>/console/*</url-pattern>
</servlet-mapping>

 

 

訪問 查看是否服務啟動成功

http://localhost:8080/[project_name]/console/

 

 

 

3.maven插件方式

<build><finalName>LearnH2DB</finalName>
    
    <!-- maven插件方式啟動 H2 DB 服務 -->
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>java</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <mainClass>org.h2.tools.Server</mainClass>
                <arguments>
                    <argument>-web</argument>
                    <argument>-webPort</argument>
                    <argument>8082</argument>
                    <argument>-browser</argument>
                </arguments>
            </configuration>
        </plugin>
    </plugins>
    
</build>

 

執行命令

mvn exec:java

 

 

相當於

java -jar h2*.jar org.h2.tools.Server -web -webPort 8082 -browser

 

 


 

數據庫初始化

 

1.maven方式

<!-- 初始化 配置  -->
<profiles>
    <profile>
        <id>init-db</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <version>1.8</version>
                    <configuration>
                        <target>
                            <property file="src/main/resources/h2_jdbc.properties" />
                            <sql driver="${jdbc.driver}" 
                                url="${jdbc.url}" 
                                userid="${jdbc.username}"
                                password="${jdbc.password}" 
                                onerror="continue"
                                encoding="${project.build.sourceEncoding}">
                                <classpath refid="maven.test.classpath" />
                                <transaction src="src/main/resources/sql/h2/schema.sql" />
                                <transaction src="src/main/resources/sql/h2/data.sql" />
                            </sql>
                        </target>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

 

執行命令:

mvn antrun:run -P init-db

 

 

 

 

2.spring方式

<beans profile="test">
    <context:property-placeholder ignore-resource-not-found="true"
        location="classpath*:/*_jdbc.properties" />    
    
    <!-- Spring Simple連接池 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
        <property name="driverClass" value="${jdbc.driver}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    </bean><!-- 初始化數據表結構 -->
    <jdbc:initialize-database data-source="dataSource" ignore-failures="ALL">
        <jdbc:script location="classpath:sql/h2/schema.sql" />
        <jdbc:script location="classpath:sql/h2/data.sql" encoding="UTF-8"/>
    </jdbc:initialize-database>
</beans>
 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM