配列の要素のあるなしでデータベースへの登録を分けたい
商品情報の配列のcodeの要素のあるなしでデータベースへの登録を分けたいです。
しかし、クラスかコントローラのどちらにどのような記述をすればいいのかわかりません。
CSVReader クラスに
package drinkMachine.csv;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class CSVReader {
private String fileName;
private Integer num;
public void csvAdd(HttpServletRequest request, ServletContext con)
{
// サーブレットファイルアップロードオブジェクトを生成
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
// 基準値
factory.setSizeThreshold(1024);
upload.setSizeMax(-1);
upload.setHeaderEncoding("UTF-8");
// try catch 必要あり?
List<FileItem> fileList;
try {
fileList = upload.parseRequest(request);
System.out.println("fileList" + fileList);
for (FileItem uploadItem : fileList) {
// isFormFieldはフォームデータであるかの真偽を返す。fileならFalse
if (!(uploadItem.isFormField())) {
// ファイルデータのファイル名(PATH名含む)
fileName = uploadItem.getName();
if ((fileName != null) && (!fileName.equals(""))
&& fileName.matches(".+\\.(csv)$")) {
// PATH名を除くファイル名を取得
fileName = (new File(fileName)).getName();
// ファイルを格納するフォルダのパス
String path = "C:\\pleiades\\workspace\\jspServlet\\WebContent\\csv";
// ファイルデータを指定されたファイルに書き出し
try {
uploadItem.write(new File(path + fileName));
} catch (Exception e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
// fileの名前は(パスは)プログラム内で使うため受け取る
// image はname属性
if (uploadItem.getFieldName().equals("csv")) {
String file = path + "\\" + fileName;
}
}
}
}
} catch (FileUploadException e1) {
// TODO 自動生成された catch ブロック
e1.printStackTrace();
}
}
public List<List<String>> read() {
// 返却用リスト箱作成
List<List<String>> ret = new ArrayList<List<String>>();
if (fileName != null) {
System.out.println("fileName" + fileName);
String inputCsvFile = "C:\\pleiades\\workspace\\jspServlet\\WebContent\\csv\\test1.csv";
File csv = new File(inputCsvFile);
System.out.println(csv);
BufferedReader br = null;
try {
int lineCount = 0;
// ファイルオープン
br = new BufferedReader(new FileReader(csv));
// num行読み込む(0の場合は全行)
String line = "";
int idx = 0;
while ((line = br.readLine()) != null) {
lineCount++;
// 1行を格納する箱作成
List<String> tmpList = new ArrayList<String>();
// 文字列index
int idxFrom = 0;
int idxTo = 0;
// 文字列長
while (true) {
// 最終項目を取得後は終了
if (idxFrom > line.length()) {
break;
}
// 次のセパレータ位置を取得
idxTo = line.indexOf(",", idxFrom);
// セパレータが発見できない場合は最終項目を取得
if (idxTo == -1) {
idxTo = line.length();
}
// 文字列取得
String word = line.substring(idxFrom, idxTo);
// 文字列を格納
tmpList.add(word);
// 検索開始位置を更新
idxFrom = idxTo + 1;
}
// 返却用リストに1行データを格納
ret.add(tmpList);
// カウンタ
if (idx % 1000 == 0) {
System.out.println("入力: " + idx + " 件");
}
idx++;
// numを超えたら読み込み終了。numが0のときは全量読む。
if (lineCount != 0 && idx > lineCount) {
break;
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null) {
br.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
return ret;
}
}
と書きreturn retで何個かCSVファイルに記載されている商品データの配列(例えば、[1(code),100(price),apple(name)])をそれぞれ取得することができました。
CsvUpdateControllerには
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
CSVReader csvReading;
String fileName;
ServletContext con = getServletConfig().getServletContext();
csvReading = new CSVReader();
csvReading.csvAdd(request,con);
List<List<String>> csvResult = csvReading.read();
System.out.println("csvResult"+csvResult);
}
}
Dao クラスには
package drinkMachine.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import drinkMachine.beans.ItemBean;
public class T001ItemDao {
private Connection conn = null;
private PreparedStatement pstmt = null;
public T001ItemDao() throws ClassNotFoundException, SQLException {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(
"XXX",
"xxx", "xxx");
}
// 商品登録メソッド
public int addItem(String name, String price, String count,String isPR) {
int result = 0;
try {
String query = "INSERT INTO T001_ITEM" + "(ITEM_NO,ITEM_NM,UNIT_PRICE,STOCK_COUNT,RECORD_DATE,IS_PR)" +"VALUES(TABLE_SEQ.NEXTVAL,'"+ name +"','"+ price +"','"+ count +"', sysdate,'"+ isPR +"')";
System.out.println(query);
pstmt = conn.prepareStatement(query);
result = pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
// TODO: handle exception
}
return result;
}
public String checkAdd(String name) {
// Dataの重複チェック
String kensaku = "";
try {
Statement statement = conn.createStatement();
String sql = "SELECT count(*) as checkItem" + " FROM T001_ITEM"
+ " WHERE ITEM_NM ='" + name + "'";
kensaku = "";
System.out.println(sql);
ResultSet resultSet = statement.executeQuery(sql);
resultSet.next();
kensaku = resultSet.getString("checkItem");
} catch (SQLException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
System.out.println(kensaku);
return kensaku;
}
//引数:商品コード、商品名、金額、数量
//戻り値:結果更新できたか否か YES or NO
public int update(String code,String name,String price,String count) {
int result = 0;
try {
Statement stmt = conn.createStatement();
String sql = "UPDATE T001_ITEM SET"
+ " ITEM_NM ='" + name + "'," +
" UNIT_PRICE = '" + price + "', " +
" STOCK_COUNT = '" + count + "'," +
" RECORD_DATE = CURRENT_TIMESTAMP"+
" WHERE ITEM_NO = " + code;
result = stmt.executeUpdate(sql);
}catch (SQLException e){
System.out.println("SQLException:" + e.getMessage());
}
return result;
}
public ItemBean getLineItems(String code){
String sql = "SELECT ITEM_NO,ITEM_NM,UNIT_PRICE,STOCK_COUNT FROM T001_ITEM WHERE ITEM_NO ='" + code + "'";
ItemBean ItemInfo = new ItemBean();
try {
Statement statement = conn.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
resultSet.next();
ItemInfo.setCode(resultSet.getString("ITEM_NO"));
ItemInfo.setName(resultSet.getString("ITEM_NM"));
ItemInfo.setPrice(resultSet.getString("UNIT_PRICE"));
ItemInfo.setCount(resultSet.getString("STOCK_COUNT"));
} catch (SQLException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
return ItemInfo;
}
}
と書きました。
登録にはaddItem を、更新にはupdate メソットを使います。
その商品情報のcodeがあれば、Daoクラスに記載しているUPDATE文を呼び出し、codeがなければDaoクラスに記載しているINSERT文を呼び出したいです。
そのようなことを行いたいなら、配列名[0]のように指定しif文であるなしを分岐させたら良いのでしょうか?
また、何個も商品の配列(例えば、[1,100,apple],[2,300,orange],[,500.banana]など)リストの中に何個もの配列が入っている時、それぞれの配列がcodeを持つか持たないかで呼び出すSQL文を変えたい時どのように書けばいいのでしょうか?