Home > Archives > 2009-01 Archive

2009-01 Archive

COUNT関数のパフォーマンス

  • Posted by: sinsengumi
  • 2009年1月30日 5:37 PM
  • DataBase

COUNT関数はCOUNT(*)を使うより、COUNT(定数)、COUNT(PK)で使ったほうが速度が出るらしい。
COUNT(*)だとすべての列を検査するため、あらかじめインデックスの張られたPKとかを指定するといい。

SELECT COUNT(*) FROM Sales;
SELECT COUNT(id) FROM Sales;

参考

Ubuntuでルートにログインする

Ubuntuではセキュリティのために原則rootにログインしないでsudoコマンドで作業する。
けど毎回パスワードとかだるいので、以下のコマンドでrootにログインできる。

$ sudo su

Strutsで「サーブレット action が利用できません」が出た時

「サーブレット action が利用できません」というようなエラーが出たら、だいたいstruts-config.xmlが間違っています。

Struts入門

実はStruts2しか仕事で使ったことが無く、Struts1系を触ったことが無かったので、とりあえず動かすところまでしてみました。

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
    <!-- Standard Action Servlet Configuration -->
    <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
        <init-param>
            <param-name>config</param-name>
            <param-value>/WEB-INF/struts-config.xml</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>

    <!-- Standard Action Servlet Mapping -->
    <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

    <!-- The Usual Welcome File List -->
    <welcome-file-list>
        <welcome-file>/webContents/html/index.html</welcome-file>
    </welcome-file-list>
</web-app>

はまったところなんですが、以下のXML以外に余計なものは書いちゃダメ絶対!!
バリデートの宣言とかプラグインとかあるんですが、今の例では使わないのでそれは書きません。
struts-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts-config PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
    "http://struts.apache.org/dtds/struts-config_1_3.dtd">

<struts-config>
    <!-- Form Bean Definitions -->
    <form-beans>
    </form-beans>

    <!-- Global Exception Definitions -->
    <global-exceptions>
    </global-exceptions>

    <!--  Global Forward Definitions -->
    <global-forwards>
    </global-forwards>

    <!-- Action Mapping Definitions -->
    <action-mappings>
        <action path="/hello" type="hello.HelloAction">
            <forward name="success" path="/webContents/jsp/hello.jsp" />
        </action>
    </action-mappings>
</struts-config>

参考

log4j入門

  • Posted by: sinsengumi
  • 2009年1月23日 5:31 PM
  • Java
  • |

導入

log4jのインストール

インストールといっても以下のようなjarファイルをクラスパスに追加するだけです。

  • log4j-1.2.15.jar

http://logging.apache.org/log4j/1.2/download.html からダウンロード。

フォルダ構成

log4jを配置したフォルダ構成は以下のようにしています。

log4j(フォルダ構成)

使ってみる

1. 設定ファイルを記述する。

log4j.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
    <!-- ファイルへの出力設定 -->
    <appender name="FILE" class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="sample.log" />
        <param name="Append" value="true" />
        <param name="MaxFileSize" value="1MB" />
        <param name="MaxBackupIndex" value="10" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{yyyy/MM/dd HH:mm:ss.SSS} %-5p [%c] %m%n" />
        </layout>
    </appender>

    <!-- コンソールへの出力設定 -->
    <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{yyyy/MM/dd HH:mm:ss.SSS} %-5p [%c] %m%n" />
        </layout>
    </appender>

    <!-- 出力するパッケージを設定 -->
    <logger name="log4j">
        <level value="info" />
        <appender-ref ref="FILE" />
        <appender-ref ref="STDOUT" />
    </logger>
</log4j:configuration>

2. 実際に動かしてみる。

動かしてみます。

LogSample.java

package log4j;

import java.io.FileReader;
import java.io.IOException;
import org.apache.log4j.Logger;

public class LogSample {
    static Logger logger = Logger.getLogger(LogSample.class);

    public static void main(String[] args) {
        // 設定ファイルを別名で使う場合は設定ファイルを読み込む必要あり。
        // DOMConfigurator.configure("log4j.xml");

        LogSample obj = new LogSample();

        obj.sampleMethod();
    }

    public void sampleMethod() {
        FileReader in = null;
        try {
            in = new FileReader("test.txt");
            logger.info("ファイルを正常に開きました。");
        } catch (IOException e) {
            logger.error("指定されたファイルが見つかりません。");
        } finally {
            if (in != null) {
                try {
                    in.close();
                    logger.info("ファイルを正常に閉じました。");
                } catch (IOException e) {
                    logger.error("ファイルを閉じる途中でエラーが発生しました。");
                }
            }
        }
    }
}

読み込むテキストファイルを置いたり、無くしたりしてログとコンソールに正常に出力されてればOK。

参考

Ubuntuでhomeのフォルダの日本語表示を英語に変更する

端末で以下を実行する。

LANG=C xdg-user-dirs-gtk-update

Ubuntuでビープ音を鳴らないように設定する

/etc/modprobe.d/blacklistのファイルに以下を追加する。

blacklist pcspkr

Javaのまぎらわしい用語

  • Posted by: sinsengumi
  • 9:29 PM
  • Java

Javaの敷居を高めてるのに、JavaにはなんかJ〜〜ってのが多すぎるってのあって、よく分からなかったので調べてみました。

用語 説明
JRE(Java Runtime Environment) Javaのプログラムを実行する際に必要になるJava仮想マシン(JVM, Java VM)とクラスライブラリのパッケージ。
正式名称はJava SE Runtime Environment(JRE)と呼ばれる。
JDK(Java Development Kit) 開発者向けのコンパイラなどのツールとクラスライブラリのパッケージ、JREも付属している。
正式名称はJava SE Development Kit(JDK)と呼ばれる。
SDK(Software Development Kit) Java 2以降では、JDKをSDKと呼ぶようになった。最近はあまり使われない?
Java SE(Java Platform, Standard Edition) JavaのAPI(関数群)で、Javaを使うための最も基本的なAPIが含まれている。
ちなみにJDKにはこのJava SEが含まれている。Java EEは含まれていない。
J2SE(Java 2 Platform, Standard Edition) Java SEの過去のバージョンの呼び名
Java EE(Java Platform, Enterprise Edition) JavaのAPI(関数群)で、エンタープライズ(WebとかDBとかサーバ?)向けのためのAPIが含まれている。
ちなみにJava EEはJava SEを含んでいる。
J2EE(Java 2 Enterprise Edition) Java EEの過去のバージョンの呼び名
Java ME(Java Platform, Micro Edition) JavaのAPI(関数群)で携帯電話、PDA、テレビのようなデバイスに特化したAPIが含まれている。
J2ME(Java 2 Platform, Micro Edition) Java MEの過去のバージョンの呼び名

ふぅ、調べるのにだいぶ時間がかかって疲れた。

参考

eclipseでコメントアウトしたりコメントを外したりする

ソースコードをコメントアウトしたり、そのコメントをはずしたりする。

# コメントアウトする
CTRL + SHIFT + /

# コメントをはずす
CTRL + SHIFT + \

iBATIS入門

導入

iBATISのインストール

インストールといってもjarファイルをクラスパスに追加するだけです。
以前は以下のような3つのファイルに分かれてたみたいですが、今は1つに集約されてます。

  • ibatis-common-2.jar
  • ibatis-dao-2.jar
  • ibatis-sqlmap-2.jar

こんな感じ(/libフォルダに入ってます。)

  • ibatis-2.3.4.726.jar

http://ibatis.apache.org/ からダウンロード。

あと今回はDBにPostgreSQLを使用するので、PostgreSQLのJDBCドライバもクラスパスに追加しておく。
ちゃんとJDKのバージョンに対応したドライバを使うこと。詳しくはPostgreSQL JDBC ドライバを使用する時の注意点を参照。
http://jdbc.postgresql.org/ からダウンロード。

DBの準備

DBにはPostgreSQLを利用します。
サンプルとして以下のようなテーブルを作成(DB名はsampledbとしています)

id name age
1 Yoshida 23
2 Abe 34
3 Ogawa 17
CREATE TABLE users (
    id serial NOT NULL,
    name character varying(100),
    age integer,
    CONSTRAINT id PRIMARY KEY (id)
)

※ちなみにnameというのはPostgreSQLでは予約語らしいですが。。。

フォルダ構成

ちなみにフォルダ構成はこんな感じにしています。

iBATIS(フォルダ構成)

使ってみる

1. SqlMapConfigを作成する。

まずiBATIS用configファイルを記述します。
DB接続設定やマッピングファイルの参照を書いていきます。

SqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
    "http://www.ibatis.com/dtd/sql-map-config-2.dtd">

<sqlMapConfig>
    <!-- DB接続設定 -->
    <transactionManager type="JDBC">
        <dataSource type="SIMPLE">
            <property name="JDBC.Driver" value="org.postgresql.Driver"/>
            <property name="JDBC.ConnectionURL" value="jdbc:postgresql://localhost:5432/sampledb"/>
            <property name="JDBC.Username" value="postgres"/>
            <property name="JDBC.Password" value="postgres"/>
        </dataSource>
    </transactionManager>

    <!-- sqlMapファイルの参照 -->
    <sqlMap resource="ibatis/dao/user.SqlMap.xml" />
</sqlMapConfig>

2. SqlMapConfig.xmlを読み込むクラスを作成する。

DBアクセスがあるたびに毎回SqlMapConfig.xmlを直接読み込んでもいいんですけど、DBアクセスするたびにファイルを開いたりしてたら大変だよね、っていう話で一回だけ読み込んでインスタンスを作成・保持しておくということをしておきます。
こういうのをデザインパターンで「シングルトン(Singleton)」というらしいです。

MyAppSqlConfig.java

package ibatis;

import java.io.IOException;
import java.io.Reader;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;

/**
* SqlMapClientを返すクラス
*/
public class MyAppSqlConfig {
    private static SqlMapClient sqlMap;

    static {
        try {
            String resource = "SqlMapConfig.xml";
            //シングルトンとして利用
            if (sqlMap == null) {
                Reader reader = Resources.getResourceAsReader(resource);
                sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SqlMapClient getSqlMapInstance() {
        return sqlMap;
    }
}

3. DTOを作成する。

DBのテーブルに対応したDTOクラスを作成しておきます。

User.java

package ibatis.dto;

public class User {
    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

4. マッピングファイル(SQL Mapファイル)を作成する。

ここでJDBCだとDBアクセスのためのDAOクラスを作るんですが、iBATISではそれをマッピングファイルとしてXMLで記述します。

user.SqlMap.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
    "http://www.ibatis.com/dtd/sql-map-2.dtd">

<sqlMap namespace="User">
    <!-- SELECT -->
    <select id="getUser" parameterClass="Integer" resultClass="ibatis.dto.User">
        SELECT
            ID,
            NAME,
            AGE
        FROM
            USERS
        WHERE
            ID = #VALUE#
    </select>

    <!-- UPDATE -->
    <update id="updateUser" parameterClass="ibatis.dto.User">
        UPDATE USERS
        SET NAME = #name#
        <dynamic>
            <isNotEqual prepend="," compareValue="0" property="age">
                AGE = #age#
            </isNotEqual>
        </dynamic>
        WHERE id = #id#
    </update>

    <!-- DELETE -->
    <delete id="deleteUser" parameterClass="Integer">
        DELETE
        FROM USERS
        WHERE ID = #id#
    </delete>

    <!-- INSERT -->
    <insert id="insertUser" parameterClass="ibatis.dto.User">
        INSERT INTO USERS (
            ID,
            NAME,
            AGE
        ) VALUES (
            #id#,
            #name#,
            #age#
        )
    </insert>
</sqlMap>

5. 実際に動かしてみる。

動かしてみます。

Sample1.java

package ibatis;

import ibatis.dto.User;
import com.ibatis.sqlmap.client.SqlMapClient;
import java.sql.SQLException;

public class Sample1 {

    public static void main(String[] args) throws SQLException {
        // SqlMapClientを生成
        SqlMapClient sqlMap = MyAppSqlConfig.getSqlMapInstance();

        // SELECT
        User user = (User) sqlMap.queryForObject("getUser", 1);
        System.out.println(user.getId() + "\t" + user.getName());

        // UPDATE
        user.setId(2);
        user.setName("Yuzawa");
        user.setAge(27);
        sqlMap.update("updateUser", user);

        // INSERT
        user.setId(4);
        user.setName("Morita");
        user.setAge(30);
        sqlMap.insert("insertUser", user);

        // DELETE
        sqlMap.delete("deleteUser", 3);
    }
}

以上を実行すると、テーブルが以下のようになり、

id name age
1 Yoshida 23
2 Yuzawa 27
4 Morita 30

実行結果は以下のようになる。

1	Yoshida

参考

Home > Archives > 2009-01 Archive

Search
Feeds
Meta

Return to page top