package com.business;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
@SuppressWarnings("serial")
public class bomSvlt extends HttpServlet{
@Override
public void doGet (HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException{
String rv = "";
req.setCharacterEncoding("utf-8");
res.setContentType("text/html; charset=utf-8");
PrintWriter out;
out = res.getWriter();
String mode = req.getParameter("mode"); //(1)
bomBean bom = new bomBean(); //ビーンスインスタンスの生成
if(mode.equals("getfinal_j")){ //(2)
rv = bom.getFinal_j(); //完成品
}else if(mode.equals("getchild_j")){
String p_item = req.getParameter("p_item");
rv = bom.getChild_j(p_item); //子部品
}else if(mode.equals("getiteminfo_j")){
String item_no = req.getParameter("item_no");
rv = bom.getItemInfo_j(item_no); //部品情報
}
:
リスト1のWebクライアントから送られた非同期リクエストはリスト3のサーブレットが受信し、(1)のmodeパラメータの値から(2)以下のif〜else判断で、処理リクエストに対応するBeansメソッドを呼び出しています。
package com.business;
import java.sql.*;
import java.util.List;
import com.google.appengine.api.rdbms.AppEngineDriver;
import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.EntityNotFoundException;
import com.google.appengine.api.datastore.FetchOptions;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import com.google.appengine.api.datastore.Query;
public class bomBean{
StringBuffer respBuf = new StringBuffer("");
StringBuffer rv1 = new StringBuffer("");
String rv = "";
String db = "business";
String user = "user1";
String pass = "pass1";
Connection con = null;
DatastoreService ds = null;
/* ****************************************** *
* コンストラクタ
* ****************************************** */
public bomBean(){
try{
DriverManager.registerDriver(new AppEngineDriver());
con = DriverManager.getConnection("jdbc:google:rdbms://branecosmology:business/business",user,pass);
//(1) Cloud SQL
} catch (SQLException e) {
respBuf.append("jdbc Driver load error<r>");
}
ds = DatastoreServiceFactory.getDatastoreService(); //(2) Bigtable
}
:
/* ****************************************** *
* 完成品検索
* ****************************************** */
public String getFinal_j(){ //(3)
try{
Statement stmt = con.createStatement();
String sql = "select distinct p_item from item_master where final='y' order by p_item";
//(4)
ResultSet rset = stmt.executeQuery(sql); //(5)
rv = "{ \"entries\":[";
while(rset.next()){ //(6)
String p_item = rset.getString("p_item");
rv += "{\"p_item\": \"" + p_item + "\"},";
}
rv = rv.substring(0, rv.length() - 1);
rv += "]}";
rset.close();
stmt.close();
}catch(SQLException e){
rv = "接続失敗\n理由:" + e.toString();
}catch(Exception e){
e.printStackTrace();
}finally{
try{
con.close();
}catch(Exception e){}
}
return rv; //(7)
}
/* ****************************************** *
* 子部品検索
* ****************************************** */
public String getChild_j(String p_item){
try{
Statement stmt = con.createStatement();
String sql = "select * from item_master where p_item='"+p_item+"' order by c_item";
//(8)
ResultSet rset = stmt.executeQuery(sql); //(9)
rv = "{ \"entries\":[";
while(rset.next()){
String c_item = rset.getString("c_item");
String make = rset.getString("make");
String stock = rset.getString("stock");
String vendor = rset.getString("vendor");
rv += "{\"p_item\": \"" + p_item + "\",\"c_item\": \"" + c_item + "\", \"make\": \"" + make + "\", \"stock\": \"" + stock + "\", \"vendor\": \"" + vendor + "\"},"; //(10)
}
rv = rv.substring(0, rv.length() - 1);
rv += "]}";
rset.close();
stmt.close();
}catch(SQLException e){
rv = "接続失敗\n理由:" + e.toString();
}catch(Exception e){
e.printStackTrace();
}finally{
try{
con.close();
}catch(Exception e){}
}
return rv; //(11)
}
/* ****************************************** *
* 部品情報検索
* ****************************************** */
public String getItemInfo_j(String item_no){
try{
// Start Timer
long start = System.currentTimeMillis();
// Start Timer
Statement stmt = con.createStatement();
String sql = "select * from item_info where item_no='" + item_no + "';";
ResultSet rset = stmt.executeQuery(sql);
if(rset.next()){
String item_name = rset.getString("item_name");
String final_flag = rset.getString("final_flag");
String vendor_no = rset.getString("vendor_no");
String vendor_name = rset.getString("vendor_name");
// End Timer
long stop = System.currentTimeMillis();
long time = stop - start;
// End Timer
rv = "{\"stat\": \"" + time + "\",\"item_name\": \"" + item_name + "\", \"final_flag\": \"" + final_flag + "\", \"vendor_no\": \"" + vendor_no + "\", \"vendor_name\": \"" + vendor_name + "\"}";
}else{
rv = "NO<i>部品番号:" + item_no + "は存在しません。";
}
rset.close();
stmt.close();
}catch(SQLException e){
rv = "接続失敗\n理由:" + e.toString();
}catch(Exception e){
e.printStackTrace();
}finally{
try{
con.close();
}catch(Exception e){}
}
return rv;
}
ここでは、Cloud SQLにだけアクセスしています。同じプログラムからCloud SQL(MySQL)とBigtableの両方に接続が可能です。コンストラクタでは、どちらのアクセスにも対応できるようにしています。
(1)では、Cloud SQLで提供される専用ドライバを使用してMySQLデータベースへ接続します。(2)では、Bigtableアクセス用にDatastoreServiceインスタンス(ここではds)を生成しています。以上の準備で、このBeansからは、Cloud SQLのMySQLとBigtableの両方にアクセスできるようになります。
(2)のDBへの接続では、ユーザー名とパスワードで「user1」「pass1」を指定しています。これは、事前にGoogle APIs Consoleから登録してあるもので、図3のようにuser1にはSELECT、INSERT、UPDATE、DELETEの権限が付与されています。
Google Cloud SQLでは専用ドライバを使用しているため、コンストラクタ内では独自の処理部分がありますが、DB接続は、通常行われるJavaからのMySQL接続とまったく同じです。従って、JavaからのMySQLアクセス経験のある方には、まったく問題のない処理手順です。
完成品の検索は(3)のgetFinalメソッドで行われます。検索パターンは(4)のSQL文で指定されています。
完成品は、部品マスタ(item_master)内で、ファイナルフラグ(final)が「y」に設定されているので、それを検索条件に指定して、親部品(p_item)をDISTINCTで重複値を排除し、ORDER BYで部品番号を降順ソートしています。
次に、(5)で検索を実行して(6)のwhile文でJSONフォーマットの返信データを作り、(7)でサーブレットに返信しています。
子部品検索では、(8)で親部品(p_item)をキーにしてSQL文を作成しています。(9)でSQLを実行して、その結果を(10)を主体にJSONフォーマットのデータにして(11)でサーブレットに返しています。
部品情報検索ではアクセスするテーブルが違うだけで手順は同じです。(12)でキー検索のSQL文指定後、(13)で実行し、実行結果を(14)でJSONフォーマットに組み立てて(15)でサーブレットに返します。
Copyright © ITmedia, Inc. All Rights Reserved.