ページの先頭行へ戻る
Interstage Business Application Server 12.0.0 オープンJavaフレームワークユーザーズガイド Java EE 7編
FUJITSU Software

4.4.5 アプリケーションの実装

以下の2パターンのアプリケーション実装方法の例を示します。

MyBatisを使用するEJBアプリケーションを作成する場合はWebアプリケーションの作成の手順を参照してデータベースアクセスクラスを作成し、Session Beanからデータベースアクセスクラスを呼び出してください。また、アプリケーションでトランザクション制御を行う場合はトランザクション種別にBeanを指定し、MyBatis設定ファイルのtransactionManagerタグにJDBCを指定してください。コンテナでトランザクション制御を行う場合はトランザクション種別にContainerを指定し、MyBatis設定ファイルのtransactionManagerタグにMANAGEDを指定してください。トランザクション制御の詳細は“Interstage Application Server Java EE 7設計・構築・運用ガイド”の“トランザクションの制御方法”を参照してください。

4.4.5.1 MyBatisを使用するWebアプリケーションの作成

MyBatisを使用してデータベースにアクセスするWebアプリケーションの作成例として、SQL文の対応付けをアノテーションで記述する方法の例を示します。

以下の手順で資材を作成します。

  1. エンティティクラスの作成

  2. MyBatis設定ファイルの作成

  3. Mapperインターフェースの作成

  4. データベースアクセスクラスの作成

  5. データベースアクセスクラスを呼び出すクラスの作成

上記の手順で作成する資材のほか、JSP画面やweb.xmlなどのWebアプリケーションに必要な資材を作成してください。

作成した資材はwarファイルにまとめてください。

(1) エンティティクラスの作成

データを格納するためのJavaBeanであるエンティティクラスを作成します。このクラスは“(3) Mapperインターフェースの作成”で使用します。

select文で取得するカラムが複数個の場合にJavaBeanでselect文の結果を受け取ってください。またSQL文の引数が複数個の場合にJavaBeanを引数の型として使用してください。

JavaBeanのプロパティは、select文の受け取りにJavaBeanを使用する場合はプロパティ名をselect句のカラム名と同じ、またはResultMapで設定した名前と同じにしてください。SQL文の引数の型としてJavaBeanを使用する場合はプロパティ名をSQL文の変数名と同じにしてください。

例を以下に示します。

■UserModel.java

package com.example.model;
public class UserModel {
    private int id;
    private String username;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
}

(2) MyBatis設定ファイルの作成

MyBatis設定ファイルはMyBatisの設定を記述するためのXML設定ファイルです。データソースやトランザクションマネージャ、SQL文の対応付けを記述したファイルの設定が必要です。

MyBatis設定ファイルのファイル名は任意ですが、applicationContext.xmlやサーブレット名-servlet.xmlなど他のフレームワークで使用されるファイル名とは異なるファイル名にしてください。

データソース管理のタイプはJNDIを指定してください。またデータベースの種別毎に考慮が必要なパラメーターを表に示します。

データベース名

パラメーター名

パラメーター値

説明

Symfoware Server(Postgres)

jdbcTypeForNull

OTHER(デフォルト値)

ステートメントの引数のJDBCタイプが未指定の場合、null値に対して割り当てられるJDBCタイプです。

Oracle

jdbcTypeForNull

NULL

上記を参照

MyBatis設定ファイルの例を以下に示します。

■mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- (a) -->
    <settings>
        <setting name="jdbcTypeForNull" value="OTHER"/>
    </settings>
    <environments default="development">
        <environment id="development">
            <!-- (b) -->
            <transactionManager type="JDBC"/>
            <!-- (c) -->
            <dataSource type="JNDI">
                <property name="DataSource" value="jdbc/mybatisAppDataSource"/>
            </dataSource>
        </environment>
    </environments>
    <!-- (d) -->
    <mappers>
        <mapper class="com.example.mapper.SqlMapper" />
    </mappers>
</configuration>

(a) settingsタグ

MyBatis全体に適用する設定を指定してください。

(b) transactionManagerタグ
使用するトランザクションマネージャを指定します。Webアプリケーションの場合はJDBCを指定してください。

(c) dataSourceタグ

使用するデータソースを指定します。データソースのタイプはJNDIを指定してください。DataSourceプロパティには“4.5.3 データソースの登録”で作成したデータソースを指定してください。

(d) mappersタグ

“(3) Mapperインターフェースの作成”で作成するSQL文の対応付けを記述したMapperインターフェースを指定してください。

(3) Mapperインターフェースの作成

Mapperインターフェースにはオブジェクトを操作するためのSQL文の対応付けとSQL実行のメソッドを記述してください。

データベース種別毎に考慮が必要なパラメーターを表に示します。

データベース名

パラメーター名

パラメーター値

説明

Symfoware Server(Postgres)

keyColumn

テーブル内でキーの自動生成を使用する対象の列の名前を指定(列が複数の場合はカンマ区切りで指定してください)

データベース側で自動生成したキーを取得する場合、かつテーブルの2番目以降の列に対してキーの自動生成が設定されている場合に設定してください。

Oracle

keyColumn

同上

データベース側で自動生成したキーを取得する場合に設定してください。

Mapperインターフェースの例を以下に示します。

■SqlMapper.java

package com.example.mapper;
import com.example.model.UserModel;
public interface SqlMapper {
    // (a)
    @Insert("INSERT INTO USERLIST (ID, USERNAME) VALUES (#{id}, #{username})")
    void insertUser(UserModel usermodel);
    // (b)
   @Select("SELECT ID, USERNAME FROM USERLIST WHERE ID = #{id}")
    UserModel selectUser(int id);
}

(a) insert文の定義

アノテーションの引数にSQL文を記述します。またSQL文を実行するメソッドを記述します。

(b) select文の定義

アノテーションの引数にSQL文を記述します。またSQL文を実行するメソッドを記述します。

(4) データベースアクセスクラスの作成

MyBatisのSQL実行のAPIを使用してデータベースへアクセスするクラスを作成してください。

例を以下に示します。

■MyBatisExecutor.java

package com.example;
import com.example.mapper.SqlMapper;
import com.example.model.UserModel;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisExecutor {
    private SqlSessionFactory sqlSessionFactory;
    // (a) 
    public void initSqlSessionFactory() throws IOException {
        String resource = "com/example/mapper/mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }
    public void execSql(int id, String name) throws IOException {
        if (sqlSessionFactory == null ) {
            initSqlSessionFactory();
        }
        UserModel usermodel = new UserModel();
        usermodel.setId(id);
        usermodel.setUsername(name);
        SqlSession session = sqlSessionFactory.openSession();
        try {
            // (b) 
            SqlMapper mapper = session.getMapper(SqlMapper.class);
            mapper.insertUser(usermodel);
            session.commit();
            UserModel resultUsermodel = mapper.selectUser(id);
        } finally {
            session.close();
        }
}

(a) MyBatisの設定

“(2) MyBatis設定ファイルの作成”で作成したMyBatis設定ファイルを指定してください。MyBatis設定ファイルの情報をもとにSqlSessionFactoryのインスタンスを作成します。

SqlSessionFactoryは削除せずにアプリケーション実行中は保持してください。SqlSessionFactoryBuilderはSqlSessionFactoryのインスタンス作成後は削除しても問題ありません。

(b) SQLの実行

Mapperインターフェースに記述したメソッドを呼び出してSQL文を実行します。

SQLSession、Mapperインターフェースのインスタンスはスレッドセーフではないためローカル変数としfinallyブロックでクローズさせます。

(5) データベースアクセスクラスを呼び出すクラスの作成

データベースアクセスクラスを呼び出すクラスを作成してください。データベースアクセスクラスのインスタンスはアプリケーション実行中は保持してください。サーブレットがデータベースアクセスクラスを呼ぶ例を以下に示します。

■MyBatisServlet.java

package com.example;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class MyBatisServlet extends HttpServlet {
    private MybatisExecutor executor = new MybatisExecutor();
    public void service(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        int id = Integer.parseInt(request.getParameter("id"));
        String name = request.getParameter("name");
        try {
            executor.execSql(id, name);
        } catch (Exception e) {
            e.printStackTrace();
        }
        response.setContentType("text/html; charset=utf8");
        RequestDispatcher dispatcher = request.getRequestDispatcher("/index.jsp");
        dispatcher.forward(request, response);
    }
}

4.4.5.2 MyBatisを使用するSpring Frameworkのアプリケーションの作成

MyBatisを使用してデータベースにアクセスするSpring Frameworkのアプリケーションの作成例として、SQL文の対応付けをアノテーションで記述する例を説明します。

以下の手順で資材を作成します。

  1. エンティティクラスの作成

  2. 設定ファイルの作成

  3. Mapperインターフェースの作成

  4. データベースアクセスクラス(サービスクラス)の作成

  5. データベースアクセスクラスを呼び出すクラス(コントローラクラス)の作成

上記の手順で作成する資材のほか、JSP画面やweb.xmlなどのSpring Frameworkのアプリケーションに必要な資材を作成してください

作成した資材はwarファイルにまとめてください。

(1) エンティティクラスの作成

データを格納するためのJavaBeanであるエンティティクラスを作成します。

select文で取得するカラムが複数個の場合にJavaBeanでselect文の結果を受け取ってください。またSQL文の引数が複数個の場合にJavaBeanを引数の型として使用してください。

JavaBeanのプロパティは、select文の受け取りにJavaBeanを使用する場合はプロパティ名をselect句のカラム名と同じ、またはResultMapで設定した名前と同じにしてください。SQL文の引数の型としてJavaBeanを使用する場合はプロパティ名をSQL文の変数名と同じにしてください。

例を以下に示します。

■UserModel.java

package com.example.model;
public class UserModel {
    private int id;
    private String username;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
}

(2) 設定ファイルの作成

Spring FrameworkのO/Rマッピング連携にMyBatisを使用するためにBean定義ファイルの設定が必要です。SqlSessionFactoryとMapperインターフェースを定義してください。

例を以下に示します。

■applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
    <!--- JNDIからデータソースを取得 -->
    <jee:jndi-lookup id="dataSource" jndi-name="jdbc/mybatisAppDataSource"/>
    <!--- トランザクションマネージャの設定 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <!-- (a) -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configuration">
            <bean class="org.apache.ibatis.session.Configuration">
                <property name="jdbcTypeForNull" value="OTHER"/>
            </bean>
        </property>
    </bean>
    <!-- (b) -->
    <mybatis:scan base-package="com.example.mapper" />

(a) セションファクトリの設定

SqlSessionFactoryBeanを使用してSqlSessionFactoryを生成してください。

MyBatisの設定を行う場合はconfigurationプロパティで指定してください。データソースとトランザクションマネージャの設定はSpring Frameworkが行うためMyBatisで設定する必要はありません。

データベースの種別毎に考慮が必要なMyBatisのパラメーターは“4.4.5.1 MyBatisを使用するWebアプリケーションの作成”の“(2) MyBatis設定ファイルの作成”を参照してください。

(b) Mapperインターフェースの設定

“(3) Mapperインターフェースの作成”で作成するMapperインターフェースのパッケージを指定してください。パッケージに含まれるインターフェースをMapperインターフェースとして取得します。

(3) Mapperインターフェースの作成

Mapperインターフェースにはオブジェクトを操作するためのSQL文の対応付けとSQL実行のメソッドを記述してください。

データベースの種別毎に考慮が必要なMyBatisのパラメーターは“4.4.5.1 MyBatisを使用するWebアプリケーションの作成”の“(3) Mapperインターフェースの作成”を参照してください。

例を以下に示します。

■SqlMapper.java

package com.example.mapper;
import com.example.model.UserModel;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
public interface SqlMapper {
    @Insert("INSERT INTO USERLIST (ID, USERNAME) VALUES (#{id}, #{username})")
    void insertUser(UserModel usermodel);
    @Select("SELECT ID, USERNAME FROM USERLIST WHERE ID = #{id}")
    UserModel selectUser(int id);
}

(4) データベースアクセスクラス(サービスクラス)の作成

データベースにアクセスするためのクラスを作成します。この例ではサービスクラスがデータベースにアクセスします。

MyBatisが出力する例外はSpring Frameworkの例外であるDataAccessExceptionに変換して出力されます。

サービスクラスを作成する前に、サービスクラスのインターフェースを作成してください。

例を以下に示します。

■UserService.java(インターフェース)

package com.example.service;
import com.example.model.UserModel;
public interface UserService {
    public void add(int id, String username);
    public UserModel find(int id);
}

インターフェースを実装して、クラスを作成してください。

■UserServiceImple.java(実装クラス)

package com.example.service;
import com.example.mapper.SqlMapper;
import com.example.model.UserModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class UserServiceImpl implements UserService {
    // Mapperインターフェースに対する依存性の注入
    @Autowired
    private SqlMapper sqlMapper;
    // Mapperインターフェースで定義したメソッドを呼び出しSQLを実行
    @Transactional
    public void add(int id, String username) throws Exception {
        UserModel usermodel = new UserModel();
        usermodel.setId(id);
        usermodel.setUsername(username);
        this.sqlMapper.insertUser(usermodel);
    }
    // Mapperインターフェースで定義したメソッドを呼び出しSQLを実行
    @Transactional
    public UserModel find(int id) {
        return this.sqlMapper.selectUser(id);
    }
}

(5) データベースアクセスクラスを呼び出すクラス(コントローラクラス)の作成

データベースアクセスクラスを呼び出すクラスを作成してください。

また、Spring Frameworkのアプリケーションに必要な資材を作成してください。

コントローラクラスでデータベースアクセスクラスを呼び出す例を以下に示します。

■UserController.java

package com.example.controller;
import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
@Scope(value = WebApplicationContext.SCOPE_REQUEST)
public class UserController {
    @Autowired
    private UserService userService;
    @RequestMapping(value="/add", method=RequestMethod.POST)
    public String add(@RequestParam("id") int id, @RequestParam("name") String name, Model model) {
        userService.add(id, name);
...
        return "index";
    }
    @RequestMapping(value="/find", method=RequestMethod.POST)
    public String find(@RequestParam("id") int id, Model model) {
        String name = userService.find(id);
...
        return "index";
    }
}