订阅博客
收藏博客
微博分享
QQ空间分享

Java嵌入式数据库H2(二)--在Web应用程序中使用H2数据库

频道:技术分享 标签:菜鸟程序员数据库相关学习缓存相关学习 时间:2016年02月22日 浏览:1608次 评论:0条

(一)建立Java项目以及环境搭建

在这里我建立了一个普通的java项目,如下:

1.png

之前说到h2是一个比较容易操作的开源数据库,在我们操作之前我们需要导入一个唯一依赖包【h2-****.jar】,在下载h2的时候就已近下载过了,如下图:

2.png

到这里我们的项目和开发环境就搭建好了!

(二)java中操作H2数据库

2.1 以嵌入式(本地)连接方式连接h2数据库

这种连接方式默认情况下只允许有一个客户端连接到H2数据库,有客户端连接到H2数据库之后,此时数据库文件就会被锁定,那么其他客户端就无法再连接了。

  连接语法:jdbc:h2:[file:][<path>]<databaseName>

       例如:

    jdbc:h2:~/test //连接位于用户目录下的test数据库

    jdbc:h2:file:/data/sample

    jdbc:h2:file:E:/H2/gacl(Windows only)

编写测试代码,如下:

package com.cuiyongzhi.h2project;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.UUID;

/**
 * <p>ClassName: H2ConnTest1<p>
 * <p>Description: Java通过JDBC方式连接H2数据库<p>
 * @author cuiyongzhi
 * @version 1.0 V
 * @createTime 2016-2-22 上午11:22:12
 */
public class H2ConnTest1 {
    //数据库连接URL,当前连接的是E:/H2目录下的cuiyongzhi数据库
    private static final String JDBC_URL = "jdbc:h2:E:/H2/cuiyongzhi";
    //连接数据库时使用的用户名
    private static final String USER = "cuiyongzhi";
    //连接数据库时使用的密码
    private static final String PASSWORD = "123456";
    //连接H2数据库时使用的驱动类,org.h2.Driver这个类是由H2数据库自己提供的,在H2数据库的jar包中可以找到
    private static final String DRIVER_CLASS="org.h2.Driver";
    
    public static void main(String[] args) throws Exception {
        // 加载H2数据库驱动
        Class.forName(DRIVER_CLASS);
        // 根据连接URL,用户名,密码获取数据库连接
        Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
        Statement stmt = conn.createStatement();
        //如果存在USER_INFO表就先删除USER_INFO表
        stmt.execute("DROP TABLE IF EXISTS USER_INFO");
        //创建USER_INFO表
        stmt.execute("CREATE TABLE USER_INFO(id VARCHAR(36) PRIMARY KEY,name VARCHAR(100),sex VARCHAR(4))");
        //新增
        stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','大日如来','男')");
        stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','青龙','男')");
        stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','白虎','男')");
        stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','朱雀','女')");
        stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','玄武','男')");
        stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','崔用志','男')");
        //删除
        stmt.executeUpdate("DELETE FROM USER_INFO WHERE name='大日如来'");
        //修改
        stmt.executeUpdate("UPDATE USER_INFO SET name='大鵬鳥' WHERE name='崔用志'");
        //查询
        ResultSet rs = stmt.executeQuery("SELECT * FROM USER_INFO");
        //遍历结果集
        while (rs.next()) {
            System.out.println(rs.getString("id") + "," + rs.getString("name")+ "," + rs.getString("sex"));
        }
        //释放资源
        stmt.close();
        //关闭连接
        conn.close();
    }
}

执行结果如下:

3.png

登录到H2控制台当中也可以看到创建好的USER_INFO表和表里面的数据,如下图所示:

4.png

到这里表明我们的代码已经执行成功了,有时候我们在执行代码的时候会遇到下面这样的错误:

5.png我们通过提示可以看到【已经有一个h2在使用连接了】,之前我们说过我们的这种建立连接方式每次只能有一个连接数,所以我们要做的就是断开我们的web控制台的连接即可,如下图:

6.png

2.2、使用TCP/IP的服务器模式(远程连接)方式连接H2数据库(推荐)

  这种连接方式就和其他数据库类似了,是基于Service的形式进行连接的,因此允许多个客户端同时连接到H2数据库

  连接语法:jdbc:h2:tcp://<server>[:<port>]/[<path>]<databaseName>

  范例:jdbc:h2:tcp://localhost/~/test

测试代码如下:

package com.cuiyongzhi.h2project;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.UUID;

/**
* @ClassName: TestMemH2
* @Description:H2数据库的内存模式(数据只保存在内存中)
* @author: 崔用志
* @date: 2014-12-18 下午10:47:01
*
*/ 
public class TestMemH2 {

        //数据库连接URL,通过使用TCP/IP的服务器模式(远程连接),当前连接的是192.168.2.84的h2数据库
        private static final String JDBC_URL = "jdbc:h2:tcp://192.168.2.84/h2/xiaocui";
        //连接数据库时使用的用户名
        private static final String USER = "xiaocui";
        //连接数据库时使用的密码
        private static final String PASSWORD = "123456";
        //连接H2数据库时使用的驱动类,org.h2.Driver这个类是由H2数据库自己提供的,在H2数据库的jar包中可以找到
        private static final String DRIVER_CLASS="org.h2.Driver";
        
        public static void main(String[] args) throws Exception {
        	 // 加载H2数据库驱动
            Class.forName(DRIVER_CLASS);
            // 根据连接URL,用户名,密码获取数据库连接
            Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
            Statement stmt = conn.createStatement();
            //如果存在USER_INFO表就先删除USER_INFO表
            stmt.execute("DROP TABLE IF EXISTS USER_INFO");
            //创建USER_INFO表
            stmt.execute("CREATE TABLE USER_INFO(id VARCHAR(36) PRIMARY KEY,name VARCHAR(100),sex VARCHAR(4))");
            //新增
            stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','大日如来','男')");
            stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','青龙','男')");
            stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','白虎','男')");
            stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','朱雀','女')");
            stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','玄武','男')");
            stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','崔用志','男')");
            //删除
            stmt.executeUpdate("DELETE FROM USER_INFO WHERE name='大日如来'");
            //修改
            stmt.executeUpdate("UPDATE USER_INFO SET name='大鵬鳥' WHERE name='崔用志'");
            //查询
            ResultSet rs = stmt.executeQuery("SELECT * FROM USER_INFO");
            //遍历结果集
            while (rs.next()) {
                System.out.println(rs.getString("id") + "," + rs.getString("name")+ "," + rs.getString("sex"));
            }
            //释放资源
            stmt.close();
            //关闭连接
            conn.close();
        }
}

2.3、H2数据库的内存模式

  H2数据库被称为内存数据库,因为它支持在内存中创建数据库和表,但是要注意的是如果使用H2数据库的内存模式,那么我们创建的数据库和表都只是保存在内存中,一旦服务器重启,那么内存中的数据库和表就不存在了!

测试代码如下:

package com.cuiyongzhi.h2project;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.UUID;

/**
* @ClassName: TestMemH2
* @Description:H2数据库的内存模式(数据只保存在内存中)
* @author: 崔用志
* @date: 2014-12-18 下午10:47:01
*
*/ 
public class TestMemH2 {
	//数据库连接URL,通过使用TCP/IP的服务器模式(远程连接),当前连接的是192.168.1.144的数据库
//     private static final String JDBC_URL = "jdbc:h2:tcp://192.168.1.144/data/xiaocui";
	
        //数据库连接URL,通过使用TCP/IP的服务器模式(远程连接),当前连接的是内存里面的xiaocui数据库
        private static final String JDBC_URL = "jdbc:h2:tcp://localhost/mem:xiaocui";
        //连接数据库时使用的用户名
        private static final String USER = "xiaocui";
        //连接数据库时使用的密码
        private static final String PASSWORD = "123456";
        //连接H2数据库时使用的驱动类,org.h2.Driver这个类是由H2数据库自己提供的,在H2数据库的jar包中可以找到
        private static final String DRIVER_CLASS="org.h2.Driver";
        
        public static void main(String[] args) throws Exception {
        	 // 加载H2数据库驱动
            Class.forName(DRIVER_CLASS);
            // 根据连接URL,用户名,密码获取数据库连接
            Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
            Statement stmt = conn.createStatement();
            //如果存在USER_INFO表就先删除USER_INFO表
            stmt.execute("DROP TABLE IF EXISTS USER_INFO");
            //创建USER_INFO表
            stmt.execute("CREATE TABLE USER_INFO(id VARCHAR(36) PRIMARY KEY,name VARCHAR(100),sex VARCHAR(4))");
            //新增
            stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','大日如来','男')");
            stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','青龙','男')");
            stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','白虎','男')");
            stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','朱雀','女')");
            stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','玄武','男')");
            stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','崔用志','男')");
            //删除
            stmt.executeUpdate("DELETE FROM USER_INFO WHERE name='大日如来'");
            //修改
            stmt.executeUpdate("UPDATE USER_INFO SET name='大鵬鳥' WHERE name='崔用志'");
            //查询
            ResultSet rs = stmt.executeQuery("SELECT * FROM USER_INFO");
            //遍历结果集
            while (rs.next()) {
                System.out.println(rs.getString("id") + "," + rs.getString("name")+ "," + rs.getString("sex"));
            }
            //释放资源
            stmt.close();
            //关闭连接
            conn.close();
        }
}

2.4 查看h2库中是否存在表名为【USER_INFO】的表

测试代码如下:

package com.cuiyongzhi.h2project;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;

/**
* @ClassName: TestMemH3
* @Description:H2数据库的内存模式(数据只保存在内存中)
* @author: cuiyongzhi
* @date: 2014-12-18 下午10:47:01
*
*/ 
public class TestMemH3 {

        //数据库连接URL,通过使用TCP/IP的服务器模式(远程连接),当前连接的是内存里面的xiaocui数据库
        private static final String JDBC_URL = "jdbc:h2:tcp://localhost/mem:xiaocui";
        //连接数据库时使用的用户名
        private static final String USER = "xiaocui";
        //连接数据库时使用的密码
        private static final String PASSWORD = "123456";
        //连接H2数据库时使用的驱动类,org.h2.Driver这个类是由H2数据库自己提供的,在H2数据库的jar包中可以找到
        private static final String DRIVER_CLASS="org.h2.Driver";
        
        public static void main(String[] args) throws Exception {
            // 加载H2数据库驱动
            Class.forName(DRIVER_CLASS);
            // 根据连接URL,用户名,密码获取数据库连接
            Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
            ResultSet rss  = conn.getMetaData().getTables(null, null,  "USER_INFO", null ); //USER_INFO为要查询的表名
            if (rss.next())  {
          //yourTable exist
            	System.out.println("数据库存在表!");
          }else  {
           //yourTable not exist
        	  System.out.println("数据库不存在表!");
           }
           
            conn.close();
        }
}

如下图,表明我机器内存中存在表名为【USER_INFO】的表:

7.png感谢你的翻阅,如有疑问可以留言讨论!

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

分享:

支付宝

微信