

商品情報の配列のcodeの要素のあるなしでデータベースへの登録を分けたいです。  
しかし、クラスかコントローラのどちらにどのような記述をすればいいのかわかりません。  
CSVReader クラスに

[code]

    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;
        }
    
    }
    
[/code]

と書きreturn
retで何個かCSVファイルに記載されている商品データの配列（例えば、[1(code),100(price),apple(name)])をそれぞれ取得することができました。  
CsvUpdateControllerには

[code]

        /**
         * @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);
        }
    
    }
    
[/code]

Dao クラスには

[code]

    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;
    }
    }
    
[/code]

と書きました。  
登録にはaddItem を、更新にはupdate メソットを使います。  
その商品情報のcodeがあれば、Daoクラスに記載しているUPDATE文を呼び出し、codeがなければDaoクラスに記載しているINSERT文を呼び出したいです。  
そのようなことを行いたいなら、配列名[0]のように指定しif文であるなしを分岐させたら良いのでしょうか？  
また、何個も商品の配列（例えば、[1,100,apple],[2,300,orange],[,500.banana]など）リストの中に何個もの配列が入っている時、それぞれの配列がcodeを持つか持たないかで呼び出すSQL文を変えたい時どのように書けばいいのでしょうか？


CC BY-SA 3.0
2017-01-26T14:04:39.533
32175
2018-03-09T08:12:26.847
2018-03-09T08:12:26.847
3054
14754
question
java jsp servlet
配列の要素のあるなしでデータベースへの登録を分けたい


CSVの仕様にもよると思います。  
もしcodeなしがCSVに表現されるなら、読み込み時に単純に空文字になると思うので、質問に記載されたコードの場合、Listの先頭が空文字だとINSERTするメソッドを実行する、といった分岐になると思います。  
もしcodeなしがCSVに表現されない（カラムが省略されて読み込むカラム数が減る）場合、Listのsizeで判定するようになると思います。  
もしカラム数がレコードによってバラつく場合、これはCSVの仕様でカラム数をそろえてもらう必要があると思います。

ちなみに、上記質問ではカンマの位置を調べてカンマ区切りでListにaddするように実装されていますが、Stringメソッドを使うともっと簡単に実装できます。

[code]

    String str = "aaa,bbb,ccc,ddd";
    String[] strArray = str.split(",");
    /* strArrayの中身は["aaa","bbb","ccc","ddd"]となります */
    
[/code]

参考まで。


CC BY-SA 3.0
2017-03-01T08:17:30.033
33011
2017-03-01T08:17:30.033
20758
32175
answer