アプリケーションにH2DBを組み込む


アプリケーションにDBを組み込めたらいいなと思い自分でやってみた．

## 従来
アプリケーションが動くサーバにデータベースをつくって，それとアプリケーションを接続して使っていた．

ただ，自分たちでつくったアプリを公開しようとしたり，配布しようとした時にどうしてもダンプファイルを配布したり，mysqlのユーザ作ったり，権限作ったりなどなどする手間があった．

そこで組み込み型で使用できるH2DBに目をつけた．

## 環境
今回はwebアプリケーションを作ったのでその環境を

>Tomcat7
Java7
H2DB1.4

## 導入
Mavenとかは使わなかったので直接`WEB-INF/lib`にjarファイルをぶち込む

h2のjarファイルは[公式サイト](http://www.h2database.com/html/download.html)から取得可能

## javaと連携させる
### 接続する
接続するための設定ファイルです．

```java:DriverAccessor.java
package utility;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DriverAccessor {

	//~/awaretweetっていうのはDB名です．
	//~とかつけずにDB名だけ書くとカレントディレクトリにDBができるらしいです．
	private final static String DRIVER_URL="jdbc:h2:file:~/awaretweet";


	private final static String DRIVER_NAME="org.h2.Driver";

	
	private final static String USER_NAME="sa";


	private final static String PASSWORD="";


	public Connection createConnection(){
	try{
		Class.forName(DRIVER_NAME);
		Connection con=DriverManager.getConnection(DRIVER_URL,USER_NAME,PASSWORD);
		return con;
		}catch(ClassNotFoundException e){
			System.out.println("Can't Find H2 Driver.\n");
			}catch(SQLException e){
				 System.out.println("Connection Error.\n");
				}
				return null;
		}

	public void closeConnection(Connection con){
		try{
			con.close();
		}catch(Exception ex){}
	}
}

```

次からのh2DBへの操作はこのファイルを継承して書いていきます！


### データベース作成
組み込んで配布したいという希望を叶えるためにはまず，データベースを作成しないと行けない．

あらかじめ，やりたいことを言うと，
1. テーブルがなかったらテーブルを作る．
2. `root`ユーザをあらかじめつくる(ただし，すでに存在する場合はつくらない．)

です．

```java:GenerateDB.java

package utility;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import dao.UserDAO;


public class GenerateDB extends DriverAccessor{

	public void createDB(){

		createUser();
		createIp_history();
		createTweet();
		
		String userId = "root";
		String userName = "root";
		String password = "root";

		UserDAO userDAO = new UserDAO();
		//rootユーザがいるかチェック(有:1,無:0)
		int flag = userDAO.selectCountByID(userId);

		if(flag == 0){
			userDAO.insertUser(userId, userName, password);
		}else{
			//何もしない(将来的に何か処理があるかもしれないから一応書いておく)
		}

	}

    private void createUser(){


        Connection con = null;
        con = createConnection();

        try {
            String sql = "create table if not exists user("
            		+ "id varchar(16) PRIMARY KEY NOT NULL,"
            		+ "name varchar(64) NOT NULL,"
            		+ "password text NOT NULL)";

            PreparedStatement stmt = con.prepareStatement(sql);

            stmt.executeUpdate();

            stmt.close();
            con = null;
        }catch(SQLException e){


        }finally{

        }
    }

    private void createIp_history(){

        //割愛
    }

    private void createTweet(){

		//割愛
   	}
}
```

```java:dao.UserDAO
package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import utility.DriverAccessor;
import utility.PasswordEncryption;
import beans.User;

public class UserDAO extends DriverAccessor{


	public void insertUser(String userId, String userName, String password){

		Connection con = null;
		con = createConnection();
		try{
			String sql="insert into user values (?,?,?);";

			PreparedStatement stmt = con.prepareStatement(sql);

			stmt.setString(1,userId);
			stmt.setString(2, userName);
    		stmt.setString(3, password);

			stmt.executeUpdate();

			stmt.close();
			con = null;

		}catch(SQLException e){

		}finally{

		}
	}
}
```

あまりH2DBの組み込みサンプルは見当たらなかったので自分で書いてみました．

実行したあと`~/awaretweet`ができてるはずです．