19
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-12-11

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

従来

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

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

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

環境

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

Tomcat7
Java7
H2DB1.4

導入

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

h2のjarファイルは公式サイトから取得可能

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ユーザをあらかじめつくる(ただし,すでに存在する場合はつくらない.)

です.

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(){

		//割愛
   	}
}
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ができてるはずです.

19
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?