データベース接続部分を比較してみた

ふと、自分が扱えるプログラミング言語でデータベースへ接続する部分を比較してみたくなったので、書いてみた。表示のさせ方はそれぞれ異なるけれど、取得しているデータはどのプログラミング言語も同じ。

接続先はデスクトップPC上のMySQLサーバーで、テーブルは去年PHPの勉強で作成したものを利用。

Perl

#!/usr/local/bin/perl

use strict;
use warnings;
binmode STDERR, ":encoding(shiftjis)";
$/ = "\r\n";

use Encode;
use Encode::Guess qw/euc-jp shiftjis 7bit-jis/;
use DBI;

#MySQLの設定
my $sql_server = 'localhost';
my $sql_user   = 'hogehoge';
my $sql_pass   = 'fizzbuzz';
my $sql_db     = 'dbname';

#MySQLのデータベースへ接続
my $db = DBI->connect("DBI:mysql:$sql_user:$sql_server", $sql_user, $sql_pass, {RaiseError => 0, PrintError => 1});

#クエリの準備
my $sth = $db->prepare("select id, name, address, tel, fax, mail, site, station from company");

#クエリーを実行して結果を取得
$sth->execute;
while (my @row = $sth->fetchrow_array) {
    #undef要素があれば、 "null" という文字列を代入(warning回避)
    @row = map {    $_ = (defined($_) ? $_ : "null")    } @row;
    #grep {    $_ = (defined($_) ? $_ : "null")    } @row;    #上の行は、grepを使っても書ける

    print encode("shiftjis", decode("Guess", join("\t", @row))), "\n";
}
$sth->finish;

#データベースから切断
$db->disconnect;

exit;

PHP

<?php
print '<?xml version="1.0" encoding="EUC_JP"?>'."\n";
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; Charset=euc-jp" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Cache-Control" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<meta name="Robots" content="noindex, nofollow" />
<meta name="Robots" content="noarchive" />

<title>db-connect</title>

<link type="text/css" rel="stylesheet" href="./default.css" />
<link type="text/css" rel="stylesheet" href="./default-style.css" />
</head>

<body>
<h1>db-connect</h1>

<hr />

<table>
<caption>Company List</caption>
<tr>
<th>id</th>
<th>name</th>
<th>address</th>
<th>tel</th>
<th>fax</th>
<th>mail</th>
<th>site</th>
<th>station</th>
</tr>

<?php
$sql_server = "localhost";
$sql_user = "hogehoge";
$sql_pass = "fizzbuzz";
$sql_db  = "dbname";

//MySQLのデータベースへ接続
$db = mysql_connect($sql_server, $sql_user, $sql_pass);

//データベースの選択
mysql_select_db($sql_db, $db);

//クエリの準備
$query = "select id, name, address, tel, fax, mail, site, station from company";

//クエリーを実行して結果を取得
$rows = mysql_query($query, $db);

//データベースから切断
mysql_close();

//検索された行数分ループ
while ($row = mysql_fetch_assoc($rows)) {
    print <<<TEXT_HTML

<tr>
<td>{$row['id']}</td>
<td>{$row['name']}</td>
<td>{$row['address']}</td>
<td>{$row['tel']}</td>
<td>{$row['fax']}</td>
<td>{$row['mail']}</td>
<td>{$row['site']}</td>
<td>{$row['station']}</td>
</tr>

TEXT_HTML;
}
?>

</table>

<hr />

</body>
</html>

JSP

<?xml version="1.0" encoding="EUC_JP"?>
<%@ page import="java.sql.*" %>
<%@ page language="java" contentType="text/html; charset=euc-jp" pageEncoding="euc-jp"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; Charset=euc-jp" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Cache-Control" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<meta name="Robots" content="noindex, nofollow" />
<meta name="Robots" content="noarchive" />

<title>db-connect</title>

<link type="text/css" rel="stylesheet" href="./default.css" />
<link type="text/css" rel="stylesheet" href="./default-style.css" />
</head>

<body>
<h1>db-connect</h1>

<hr />

<table>
<caption>Company List</caption>
<tr>
<th>id</th>
<th>name</th>
<th>address</th>
<th>tel</th>
<th>fax</th>
<th>mail</th>
<th>site</th>
<th>station</th>
</tr>

<%
    String sql_server = "localhost";
    String sql_user = "hogehoge";
    String sql_pass = "fizzbuzz";
    String sql_db = "dbname";
    //String sql_url = "jdbc:mysql://localhost/" + sql_db;
    String sql_url = "jdbc:mysql://localhost/dbname?user=hogehoge&password=fizzbuzz";

    try {
        //JDBCドライバの読み込み
        Class.forName("com.mysql.jdbc.Driver").newInstance();

        //MySQLのデータベースへ接続
        //Connection db = DriverManager.getConnection(sql_url, sql_user, sql_pass);
        Connection db = DriverManager.getConnection(sql_url);

        //ステートメントオブジェクトの取得
        Statement stmt = db.createStatement();

        //クエリの準備
        String query = "select id, name, address, tel, fax, mail, site, station from company";

        //クエリーを実行して結果を取得
        ResultSet rs = stmt.executeQuery(query);

        //検索された行数分ループ
        while(rs.next()){
%>

<tr>
<td><%= rs.getInt("id") %></td>
<td><%= rs.getString("name") %></td>
<td><%= rs.getString("address") %></td>
<td><%= rs.getString("tel") %></td>
<td><%= rs.getString("fax") %></td>
<td><%= rs.getString("mail") %></td>
<td><%= rs.getString("site") %></td>
<td><%= rs.getString("station") %></td>
</tr>

<%
        }

        //データベースから切断
        stmt.close();

        //MySQLのデータベースとの接続を切断
        db.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
%>

</table>

<hr />

</body>
</html>

Javaアプリケーション

import java.sql.*;

public class DBConnect {
    public static void main(String[] args) {
        String sql_server = "localhost";
        String sql_user    = "hogehoge";
        String sql_pass    = "fizzbuzz";
        String sql_db    = "dbname";
        //String sql_url    = "jdbc:mysql://localhost/" + sql_db;
        String sql_url = "jdbc:mysql://localhost/dbname?user=hogehoge&password=fizzbuzz";

        try {
            //JDBCドライバの読み込み
            Class.forName("com.mysql.jdbc.Driver").newInstance();

            //MySQLのデータベースへ接続
            //Connection db = DriverManager.getConnection(sql_url, sql_user, sql_pass);
            Connection db = DriverManager.getConnection(sql_url);

            //目的のテーブルを操作

            //ステートメントオブジェクトの取得
            Statement stmt = db.createStatement();

            //クエリの準備
            String query = "select id, name, address from company";

            //クエリーを実行して結果を取得
            ResultSet rs = stmt.executeQuery(query);

            //検索された行数分ループ
            while (rs.next()) {
                System.out.printf("%2d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",
                    rs.getInt("id"),
                    rs.getString("name"),
                    rs.getString("address"),
                    rs.getString("tel"),
                    rs.getString("fax"),
                    rs.getString("mail"),
                    rs.getString("site"),
                    rs.getString("station")
                );
            }

            //データベースから切断
            stmt.close();

            //MySQLのデータベースとの接続を切断
            db.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

こうしてみると、JavaアプリケーションとJSPはデータを表示させる部分が異なるだけで、データベースへ接続する処理は全く同じなのがわかる。異なるのは、JSPの場合はJDBCドライバを所定のディレクトリに用意しておくぐらい。

PHPはphp.iniの設定でデータベースを扱えるように変更、PerlはDBIモジュールとDBD::mysqlモジュールをuseすれば、それぞれデータベースにアクセス出来るようになる。

本当はRubyとExcelでも試してみたかったのだが、Rubyはまだ習得出来ておらず、またExcelはMyODBCは用意出来たのだが、データベースクエリが用意出来なかったので、今回は割愛。

今回試した中では、一番手軽にデータベースへ接続出来たのは、Perlだった。なんと言ってもモジュールさえ利用出来れば、接続出来てしまうというのが理由。

その次は、PHP。設定が必要だが、一度設定してしまえば、あとは関数をコールするだけというお手軽さ。実行速度の面もPerlと並んで申し分ない。

残るJSPとJavaアプリケーションは、コードの再利用性という面では一番かもしれないけれど、接続出来るようにするまでの手間は微妙、実行速度は早いと思う。

以上、独断と偏見に満ちた、私の環境での比較結果。

また時間が出来たら、次回はRubyとExcel、Javaアプレット等からデータベースへ接続できるかどうかも試してみたい。