[Java][Database] Javaでwebサービス - JavaDB

Javaには,JavaDBという組み込みのSQLがあるのです.
詳しくは,

データベースを触る部分のラッパーを書きました.
必要なライブラリは,
derby.jar と derbyclient.jar

ただこのコードはSQLサーバを立ち上げて複数クライアントからの通信を受け付けるって感じではないので,複数のインスタンスをつくることは出来ません.ご了承を.

というかそういう使い方をするのならMySQLの方が良いと思う.

Database.java

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class Database {
    private Connection connection;
    private Statement statement;
    private String databaseName;
    public Database(String databaseName){
        this.databaseName = databaseName;
        this.connect();
    }
    private void connect(){
        this.connection = null;
        this.statement = null;
        try {
            this.connection = DriverManager.getConnection(
                    "jdbc:derby:" + this.databaseName + ";create=true"
            );
            try {
                this.statement = this.connection.createStatement();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        } catch(SQLException se) {
            for (SQLException e = se; e != null; e = e.getNextException()) {
                System.err.printf("%s: %s%n", e.getSQLState(), e.getMessage());
            }
        }
    }
    public boolean checkTableExist(String table){
        String query = "SELECT * FROM SYS.SYSTABLES WHERE TABLENAME='" + table + "'";
        ResultSet rs = this.throwQueryGet(query);
        int i = 0;
        try {
            while(rs.next()){
                i++;
            }
            rs.close();
        } catch (SQLException e) {
        }
        if( i > 0){
            return true;
        }else{
            return false;
        }
    }

    public void insert(String table,HashMap<String,String> values){
        if(this.checkTableExist(table)){
            Set<Map.Entry<String, String>> set = values.entrySet();
            Iterator<Map.Entry<String, String>> it = set.iterator();
            HashMap<String,Integer> tableType = this.getTableType(table);

            String query = "INSERT INTO " + table;
            String key = "(";
            String data = "(";
            while(it.hasNext()){
                Map.Entry<String, String> entry = it.next();
                String nowKey = entry.getKey();
                String nowData = entry.getValue();
                if(tableType.get(nowKey) == java.sql.Types.VARCHAR || tableType.get(nowKey) == java.sql.Types.CHAR ){
                    data += "'" + nowData + "',";
                }else{
                    data += nowData + ",";
                }
                key += nowKey + ",";
            }
            key = key.substring(0,key.length()-1);
            data = data.substring(0,data.length()-1);
            key += ")";
            data += ")";
            query += key + " VALUES "+ data;
            this.throwQuery(query);
        }else{
            System.out.println(table+" is not exist.");
        }
    }

    public void createTable(String name,ArrayList<String> info){
        if(!this.checkTableExist(name)){
            String query = "CREATE TABLE "+ name + " (";
            for(int i=0;i<info.size();i++){
                query += info.get(i) + ",";
            }
            query = query.substring(0,query.length()-1);
            query += ")";
            this.throwQuery(query);
        }else{
            System.out.println(name+" is exist.");
        }
    }

    public HashMap<String,Integer> getTableType(String table){
        HashMap<String,Integer> type = new HashMap<String,Integer>();
        ResultSet rs = this.throwQueryGet("SELECT * FROM "+table);
        try {
            ResultSetMetaData metaData = rs.getMetaData();
            int columnCount = metaData.getColumnCount();
            for(int i=1;i<columnCount+1;i++){
                type.put(metaData.getColumnName(i),metaData.getColumnType(i));
            }
            return type;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    public ArrayList<HashMap<String,Object>> select(ArrayList<String> info){
        ArrayList<HashMap<String,Object>> array = new ArrayList<HashMap<String,Object>>();
        String query = "SELECT ";
        for(int i=0;i<info.size();i++){
            query += info.get(i) + " ";
        }
        query = query.substring(0,query.length()-1);
        ResultSet rs = this.throwQueryGet(query);
        try {
            ResultSetMetaData metaData = rs.getMetaData();
            int columnCount = metaData.getColumnCount();
            ArrayList<String> columnNameList = new ArrayList<String>();
            for(int i=1;i<columnCount+1;i++){
                columnNameList.add(metaData.getColumnName(i));
            }
            while (rs.next()) {
                HashMap<String,Object> dataMap = new HashMap<String,Object>();
                for(int i=0;i<columnCount;i++){
                    String columnName = columnNameList.get(i);
                    dataMap.put(columnName,rs.getObject(columnName));
                }
                array.add(dataMap);
            }
            rs.close();
            return array;
        } catch (SQLException e1) {
            e1.printStackTrace();
        }
        return null;
    }

    public void dumpData(ArrayList<HashMap<String,Object>> data){
        System.out.println("----DataDumper----");
        for(int i=0;i<data.size();i++){
            Iterator it = data.get(i).keySet().iterator();
            while (it.hasNext()){
                Object o = it.next();
                System.out.println(o + " = " + data.get(i).get(o));
            }
            System.out.println();
        }
        System.out.println("------------------");
    }

    private void throwQuery(String query){
        System.out.println(query);
        try {
            this.statement.execute(query);
        } catch (SQLException se) {
            for (SQLException e = se; e != null; e = e.getNextException()) {
                System.err.printf("%s: %s%n", e.getSQLState(), e.getMessage());
            }
        }
    }

    private ResultSet throwQueryGet(String query){
        System.out.println(query);
        try {
            return this.statement.executeQuery(query);
        } catch (SQLException se) {
            for (SQLException e = se; e != null; e = e.getNextException()) {
                System.err.printf("%s: %s%n", e.getSQLState(), e.getMessage());
            }
            return null;
        }
    }

    public void finalize(){
        try {
            this.statement.close();
            this.connection.close();
            DriverManager.getConnection("jdbc:derby:"+this.databaseName + ";shutdown=true");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}