Archive for the ‘Java’ Category

  1. Hello, JNA World!

    Posted on 4月 9th, 2012 by cx20

    JNA

    JNA(Java Native Access)は、Java から C言語などの共有ライブラリにアクセスするライブラリである。

    ソースコード

    import com.sun.jna.Library;
    import com.sun.jna.Native;
    import com.sun.jna.Platform;
     
    public class Hello {
        public interface CLibrary extends Library {
            CLibrary INSTANCE = (CLibrary) Native.loadLibrary(Platform.isWindows() ? "msvcrt" : "c", CLibrary.class);
            void printf(String format, Object... args);
        }
     
        public static void main(String[] args) {
            CLibrary c = CLibrary.INSTANCE;
            c.printf("Hello, JNA World!n");
        }
    }

    コンパイル&実行方法

    $ javac -cp jna.jar:platform.jar:. Hello.java
    $ java -cp jna.jar:platform.jar:. Hello

    実行結果

    Hello, JNA World!
  2. Hello, SQLJ World!

    Posted on 4月 7th, 2012 by cx20

    SQLJ

    SQLJ は Oracle Database に対応した Java 用の埋め込み SQL(Embedded SQL)である。類似の製品としては、Pro*C/C++、Pro*COBOL、Pro*FORTRAN、Pro*Pascal 等がある。
    なお、埋め込み SQL 自体は、標準SQL として ANSI/ISO にて仕様が策定されている。

    ソースコード(SQLJ)

    import java.sql.*;
    import oracle.sqlj.runtime.Oracle;
     
    #sql iterator MessageIter ( String MESSAGE );
     
    class Hello {
        public static void main( String[] args ) throws Exception {
            Oracle.connect("jdbc:oracle:oci:@", "scott", "tiger");
            MessageIter iter;
            #sql iter = { SELECT 'Hello, SQLJ World!' AS Message FROM DUAL };
            while ( iter.next() ) {
                System.out.println( iter.MESSAGE() );
            }
        }
    }

    上記コードは、SQLJ トランスレータ により、以下の Java のコードが生成される。

    ソースコード(Java)

    /*@lineinfo:filename=Hello*//*@lineinfo:user-code*//*@lineinfo:1^1*/import java.sql.*;
    import oracle.sqlj.runtime.Oracle;
     
    /*@lineinfo:generated-code*//*@lineinfo:4^1*/
     
    //  ************************************************************
    //  SQLJ iterator declaration:
    //  ************************************************************
     
    class MessageIter
    extends sqlj.runtime.ref.ResultSetIterImpl
    implements sqlj.runtime.NamedIterator
    {
      public MessageIter(sqlj.runtime.profile.RTResultSet resultSet)
        throws java.sql.SQLException
      {
        super(resultSet);
        MESSAGENdx = findColumn("MESSAGE");
        m_rs = (oracle.jdbc.OracleResultSet) resultSet.getJDBCResultSet();
      }
      private oracle.jdbc.OracleResultSet m_rs;
      public String MESSAGE()
        throws java.sql.SQLException
      {
        return (String)m_rs.getString(MESSAGENdx);
      }
      private int MESSAGENdx;
    }
     
     
    //  ************************************************************
     
    /*@lineinfo:user-code*//*@lineinfo:4^44*/
     
    class Hello {
        public static void main( String[] args ) throws Exception {
            Oracle.connect("jdbc:oracle:oci:@", "scott", "tiger");
            MessageIter iter;
            /*@lineinfo:generated-code*//*@lineinfo:10^9*/
     
    //  ************************************************************
    //  #sql iter = { SELECT 'Hello, SQLJ World!' AS Message FROM DUAL  };
    //  ************************************************************
     
    {
      // declare temps
      oracle.jdbc.OraclePreparedStatement __sJT_st = null;
      sqlj.runtime.ref.DefaultContext __sJT_cc = sqlj.runtime.ref.DefaultContext.getDefaultContext(); if (__sJT_cc==null) sqlj.runtime.error.RuntimeRefErrors.raise_NULL_CONN_CTX();
      sqlj.runtime.ExecutionContext.OracleContext __sJT_ec = ((__sJT_cc.getExecutionContext()==null) ? sqlj.runtime.ExecutionContext.raiseNullExecCtx() : __sJT_cc.getExecutionContext().getOracleContext());
      try {
       String theSqlTS = "SELECT 'Hello, SQLJ World!' AS Message FROM DUAL";
       __sJT_st = __sJT_ec.prepareOracleStatement(__sJT_cc,"0MessageIter",theSqlTS);
       // execute query
       iter = new MessageIter(new sqlj.runtime.ref.OraRTResultSet(__sJT_ec.oracleExecuteQuery(),__sJT_st,"0MessageIter",null));
      } finally { __sJT_ec.oracleCloseQuery(); }
    }
     
     
    //  ************************************************************
     
    /*@lineinfo:user-code*//*@lineinfo:10^72*/
            while ( iter.next() ) {
                System.out.println( iter.MESSAGE() );
            }
        }
    }/*@lineinfo:generated-code*/

    コンパイル&実行方法

    C:¥> SET PATH=ORACLE_BASEORACLE_HOMEbin;%PATH%
    C:¥> SET CLASSPATH=ORACLE_BASEORACLE_HOMEsqljlibruntime12.jar;
         ORACLE_BASEORACLE_HOMEsqljlibtranslator.jar;
         ORACLE_BASEORACLE_HOMEjdbclibojdbc6.jar;%CLASSPATH%
    C:¥> sqlj Hello.sqlj
    C:¥> java Hello

    実行結果

    Hello, SQLJ World!
  3. Hello, JDBC Type4 World!

    Posted on 4月 6th, 2012 by cx20

    JDBC Type4

    JDBC(Java Database Connectivity)は、Java 用のデータベース接続 API である。実装方法によりType1~4の4つのタイプが存在する。
    Type4 は DBMS のクライアントライブラリを使用しない Pure Java の DBMS ドライバである。

    ソースコード(Java + JDBC Type4 + SQL Server)

    import java.sql.*;
     
    class Hello {
        public static void main( String[] args ) throws Exception {
            Class.forName ("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            Connection conn = DriverManager.getConnection("jdbc:sqlserver://;serverName=localhost", "sa", "P@ssW0rd");
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT 'Hello, JDBC Type4 World!' AS Message");
            while ( rs.next() ) {
                 System.out.println( rs.getString(1) );
            }
            rs.close();
            stmt.close();
            conn.close();
        }
    }

    コンパイル&実行方法(Java + JDBC Type4 + SQL Server)

    C:¥> javac Hello.java
    C:¥> java -cp "sqljdbc4.jar;." Hello

    ソースコード(Java + JDBC Type4 + Oracle)

    import java.sql.*;
     
    class Hello {
        public static void main( String[] args ) throws Exception {
            Class.forName ("oracle.jdbc.driver.OracleDriver");
            Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger");
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT 'Hello, JDBC Type4 World!' AS Message FROM DUAL");
            while ( rs.next() ) {
                 System.out.println( rs.getString(1) );
            }
            rs.close();
            stmt.close();
            conn.close();
        }
    }

    コンパイル&実行方法(Java + JDBC Type4 + Oracle)

    C:¥> javac Hello.java
    C:¥> java -cp "ojdbc6.jar;." Hello

    ソースコード(Java + JDBC Type4 + MySQL)

    import java.sql.*;
     
    class Hello {
        public static void main( String[] args ) throws Exception {
            Class.forName ("com.mysql.jdbc.Driver");
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306", "root", "P@ssW0rd");
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT 'Hello, JDBC Type4 World!' AS Message");
            while ( rs.next() ) {
                 System.out.println( rs.getString(1) );
            }
            rs.close();
            stmt.close();
            conn.close();
        }
    }

    コンパイル&実行方法(Java + JDBC Type4 + MySQL)

    C:¥> javac Hello.java
    C:¥> java -cp "mysql-connector-java-5.1.22-bin.jar;." Hello

    実行結果

    Hello, JDBC Type4 World!
  4. Hello, JDBC Type2 World!

    Posted on 4月 5th, 2012 by cx20

    JDBC Type2

    JDBC(Java Database Connectivity)は、Java 用のデータベース接続 API である。実装方法によりType1~4の4つのタイプが存在する。
    Type2 は JDBC と DBMS クライアントの API をマップさせたブリッジドライバである。
    例えば、Oracle であればクライアントライブラリとして OCI が使用される。

    ソースコード(Java + JDBC Type2 + Oracle)

    import java.sql.*;
     
    class Hello {
        public static void main( String[] args ) throws Exception {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            Connection conn = DriverManager.getConnection("jdbc:oracle:oci:@orcl", "scott", "tiger");
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT 'Hello, JDBC Type2 World!' AS Message FROM DUAL");
            while ( rs.next() ) {
                System.out.println( rs.getString(1) );
            }
            rs.close();
            stmt.close();
            conn.close();
        }
    }

    コンパイル&実行方法

    C:¥> javac Hello.java
    C:¥> java -cp "ojdbc6.jar;." Hello

    実行結果

    Hello, JDBC Type2 World!
  5. Hello, JDBC Type1 World!

    Posted on 4月 4th, 2012 by cx20

    JDBC Type1

    JDBC(Java Database Connectivity)は、Java 用のデータベース接続 API である。実装方法によりType1~4の4つのタイプが存在する。
    Type1 は JDBC と ODBC の API をマップさせたブリッジドライバである。

    ソースコード(Java + JDBC Type1 + ODBC + Jet データベース)

    import java.sql.*;
    import sun.jdbc.odbc.*;
     
    class Hello
    {
        public static void main( String[] args ) throws Exception {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            // ODBC DSN を使用したケース
            Connection conn = DriverManager.getConnection("jdbc:odbc:HELLODSN", "", "");
            // ODBC 接続文字列を使用したケース
            //Connection conn = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=.\hello.mdb", "", "");
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT 'Hello, JDBC Type1 World!' AS Message");
            while ( rs.next() ) {
                System.out.println( rs.getString(1) );
            }
            rs.close();
            stmt.close();
            conn.close();
        }
    }

    ソースコード(Java + JDBC Type1 + ODBC + ACE データベース)

    import java.sql.*;
    import sun.jdbc.odbc.*;
     
    class Hello
    {
        public static void main( String[] args ) throws Exception {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            // ODBC DSN を使用したケース
            Connection conn = DriverManager.getConnection("jdbc:odbc:HELLODSN", "", "");
            // ODBC 接続文字列を使用したケース
            //Connection conn = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=.\hello.accdb", "", "");
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT 'Hello, JDBC Type1 World!' AS Message");
            while ( rs.next() ) {
                System.out.println( rs.getString(1) );
            }
            rs.close();
            stmt.close();
            conn.close();
        }
    }

    ソースコード(Java + JDBC Type1 + ODBC + SQL Server)

    import java.sql.*;
    import sun.jdbc.odbc.*;
     
    class Hello
    {
        public static void main( String[] args ) throws Exception {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            // ODBC DSN を使用したケース
            Connection conn = DriverManager.getConnection("jdbc:odbc:HELLODSN", "sa", "P@ssW0rd");
            // ODBC 接続文字列を使用したケース
            //Connection conn = DriverManager.getConnection("jdbc:odbc:Driver={SQL Server};SERVER=(local)", "sa", "P@ssW0rd");
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT 'Hello, JDBC Type1 World!' AS Message");
            while ( rs.next() ) {
                System.out.println( rs.getString(1) );
            }
            rs.close();
            stmt.close();
            conn.close();
        }
    }

    ソースコード(Java + JDBC Type1 + ODBC + Oracle)

    import java.sql.*;
    import sun.jdbc.odbc.*;
     
    class Hello
    {
        public static void main( String[] args ) throws Exception {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            // ODBC DSN を使用したケース
            Connection conn = DriverManager.getConnection("jdbc:odbc:HELLODSN", "scott", "tiger");
            // ODBC 接続文字列を使用したケース1(MS 製 ODBC ドライバ)
            //Connection conn = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft ODBC for Oracle};Data Source=ORCL", "scott", "tiger");
            // ODBC 接続文字列を使用したケース2(Oracle 製 ODBC ドライバ)
            //Connection conn = DriverManager.getConnection("jdbc:odbc:Driver={Oracle in OraDb11g_home1};DBQ=ORCL", "scott", "tiger");
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT 'Hello, JDBC Type1 World!' AS Message FROM DUAL");
            while ( rs.next() ) {
                System.out.println( rs.getString(1) );
            }
            rs.close();
            stmt.close();
            conn.close();
        }
    }

    ソースコード(Java + JDBC Type1 + ODBC + MySQL)

    import java.sql.*;
    import sun.jdbc.odbc.*;
     
    class Hello
    {
        public static void main( String[] args ) throws Exception {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            // ODBC DSN を使用したケース
            Connection conn = DriverManager.getConnection("jdbc:odbc:HELLODSN", "root", "P@ssW0rd");
            // ODBC 接続文字列を使用したケース
            //Connection conn = DriverManager.getConnection("jdbc:odbc:Driver={MySQL ODBC 5.1 Driver};Server=localhost", "root", "P@ssW0rd");
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT 'Hello, JDBC Type1 World!' AS Message");
            while ( rs.next() ) {
                System.out.println( rs.getString(1) );
            }
            rs.close();
            stmt.close();
            conn.close();
        }
    }

    コンパイル&実行方法

    C:¥> javac Hello.java
    C:¥> java Hello

    実行結果

    Hello, JDBC Type1 World!
  6. Hello, Derby World!

    Posted on 3月 16th, 2012 by cx20

    Derby

    Apache Derby は Java で実装された RDBMS である。「derby」は英語で競馬の意味。
    現在、JDK に Java DB として組み込まれている。

    ソースコード

    SELECT 'Hello, Derby World!' AS Message FROM SYSIBM.SYSDUMMY1;

    設定ファイル

    ij.connection.hello=jdbc:derby://localhost/hello;create=true
    ij.user=sa
    ij.password=P@ssw0rd

    実行方法

    $ ij -p derby.properties hello.sql

    実行結果

    MESSAGE
    -------------------
    Hello, Derby World!
     
    1 行が選択されました
  7. Hello, H2 Database World!

    Posted on 3月 15th, 2012 by cx20

    H2 Database

    H2 Database は速さに定評のある Java 製の DBMS である。組み込みモードとサーバーモードがある。名前の由来は「Hypersonic2」から。

    ソースコード

    SELECT 'Hello, H2 Database World!' AS Message;

    実行方法

    $ java -cp h2*.jar org.h2.tools.RunScript -url "jdbc:h2:~/hello" -script "hello.sql" -showResults

    実行結果

    SELECT 'Hello, H2 Database World!' AS Message;
    --> Hello, H2 Database World!
    ;
  8. Hello, HSQLDB World!

    Posted on 3月 14th, 2012 by cx20

    HSQLDB

    HSQLDB(HyperSQL Database Engine)は Java 製の RDBMS である。インメモリモード、スタンドアローンモード、サーバーモードなどがある。
    OpenOffice.org の Base(データベースソフト)のデータベースエンジンとしても採用されている。

    ソースコード

    SELECT 'Hello, HSQLDB World!' AS Message FROM (VALUES(0));

    実行方法

    $ java -jar sqltool.jar --inlineRc url=jdbc:hsqldb:mem:memdbid,user=SA,password= hello.sql

    実行結果

    Hello, HSQLDB World!
  9. Hello, Java Applet World!

    Posted on 2月 28th, 2012 by cx20

    Java Applet

    Java Applet は Java プログラムの実行形態の1つである。ブラウザ上で動作する。「〜let」は小さいという意味。

    ソースコード(Java)

    import javax.swing.*;
     
    public class HelloApplet extends JApplet {
        public void init() {
            JLabel label = new JLabel("Hello, Java Applet World!");
            getContentPane().add(label);
        }
    }

    ソースコード(HTML)

    <html>
      <head>
        <title>Hello, World!</title>
      </head>
      <body>
        <applet code="HelloApplet.class" height="100" width="200"></applet>
      </body>
    </html>

    実行方法(AppletViewer による表示)

    $ appletviewer ./hello.html

    実行方法(ブラウザによる表示)

    1. Web サーバの公開フォルダ に配置
    2. ブラウザで表示
       http://localhost/doc/hello.html

    実行結果

    Hello, Java Applet World!
  10. Hello, Velocity World!

    Posted on 2月 19th, 2012 by cx20

    Velocity

    Velocity は Java 用のテンプレートエンジンである。英語で「速さ」を意味する。
    テンプレートファイルは VTL(Velocity Template Language)と呼ばれるテンプレート言語が用いられる。

    ソースコード(テンプレート)

    <html>
      <head>
        <title>Hello, World!</title>
      </head>
      <body>
        <p>Hello, $message World!</p>
      </body>
    </html>

    ソースコード(Java)

    import org.apache.velocity.Template;
    import org.apache.velocity.servlet.VelocityServlet;
    import org.apache.velocity.app.Velocity;
    import org.apache.velocity.context.Context;
    import javax.servlet.http.*;
     
    public class Hello extends VelocityServlet {
     
        public Template handleRequest( HttpServletRequest request,
                                       HttpServletResponse response,
                                       Context context ) {
     
            Template template = null;
     
            try {
                context.put("message", "Velocity");
                template = Velocity.getTemplate("hello.vm");
            } catch( Exception e ) {
                System.err.println("Exception: " + e.getMessage());
            }
     
            return template;
        }
    }

    実行方法

    ディレクトリ構成
    /hello               … 公開用フォルダ
        /WEB-INF         … アプリケーション設定ファイル配置場所
            /classes     … クラスファイル配置場所
            /templates   … テンプレート配置場所
     
    1. モジュールのコンパイル
       javac -cp $CATALINA_HOME/lib/velocity-1.7.jar:$CATALINA_HOME/lib/servlet-api.jar:. Hello.java
    2. モジュールの配置
       WEB-INF/classes
    3. テンプレートの配置
       WEB-INF/templates
    4. WEB-INF/velocity.properties の記載
    resource.loader = file
    file.resource.loader.class = org.apache.velocity.runtime.resource.loader.FileResourceLoader
    file.resource.loader.path = /usr/local/tomcat/current/webapps/hello/WEB-INF/templates
    file.resource.loader.cache = true
    file.resource.loader.modificationCheckInterval = 2
    5. WEB-INF/web.xml の記載
    <?xml version="1.0"?>
    <web-app>
      <servlet>
        <servlet-name>Hello</servlet-name>
        <servlet-class>Hello</servlet-class>
        <init-param>
          <param-name>properties</param-name>
          <param-value>/WEB-INF/velocity.properties</param-value>
        </init-param>
      </servlet>
      <servlet-mapping>
        <servlet-name>Hello</servlet-name>
        <url-pattern>/servlet/Hello</url-pattern>
      </servlet-mapping>
    </web-app>
    6. ブラウザで表示
       http://localhost:8080/hello/servlet/Hello

    実行結果

    Hello, Velocity World!