2

メインクラス、DTO、DAOがあります。私がやりたいのは、データベーステーブルCUSTOMER(2つのフィールドNAME、SURNAME)を読み取り、それをtxtファイルに書き込むことです。メインクラスが取得できるように、DTOに値を格納するために取得できないようです。

私のDTOは、ゲッターとセッターを含むNAMEとSURNAMEの2つのフィールドで構成されています。問題はリスト付きの私のDAOにあります

*私は学生ですのでご注意ください。

これは私がこれまでに行ったことです:結果、次のようにファイルに書き込みます:[名前の名前、名前の名前、名前の名前、]ファイルパイプに書き込むために必要です "|"

public CustomerDTO getDetails(Connection conn) throws SQLException {

    CustomerDTO customerDTO = new CustomerDTO();
    ResultSet rs = null;
    PreparedStatement pstmnt = null;

    try {
        // SELECT NAME, SURNAME FROM CUSTOMER
        StringBuffer stringBuffer = new StringBuffer("SELECT " + DBConstants.CUST_NAME + ", ");
        stringBuffer.append(DBConstants.CUST_SURNAME);
        stringBuffer.append(" FROM " + "CUSTOMER");
        //build string
        String query = stringBuffer.toString();
        //prepared statement
        pstmnt = conn.prepareStatement(query);
        //execute preparestatement
        rs = pstmnt.executeQuery();
        //keep reading next line in table - .next() method means next line
        List myList = new ArrayList();

        while (rs.next()) {
            String ss = rs.getString("NAME");
            String sss = rs.getString("SURNAME");
            myList.add(ss + " " + sss);
            customerDTO.setName(myList.toString());
            customerDTO.setSurname(myList.toString());
        }
    } catch (Exception e) {
        e.getMessage();
    }
    rs.close();
    //return DTO with details.
    return customerDTO;
}
4

3 に答える 3

3

このファイルがどこにどのように書かれているのかわかりませんが、コードをたどると、間違っていると思われるものがあります。

この WILE ループでは:

while (rs.next()) {
    String ss = rs.getString("NAME");
    String sss = rs.getString("SURNAME");

    // You'r adding an element here that would have a value like this: "John Doe"
    myList.add(ss + " " + sss);


    // Single instance of a DTO whose value. State values will always be replaced with the
    // string represenation of the myList variable.
    //
    // Both properties will always contain the same value no matter what.
    customerDTO.setName(myList.toString());
    customerDTO.setSurname(myList.toString());
}

あなたが本当にやるべきことは次のようなことだと思います:

// Notice the use of Generics (Look it up). It is more compile time safe and better practice.
ArrayList<CustomerDTO> customerDTOS = new ArrayList<CustomerDTO>();
while (rs.next()) {
    String ss = rs.getString("NAME");
    String sss = rs.getString("SURNAME");

    CustomerDTO customerDTO = new CustomerDTO();
    customerDTO.setName(ss);
    customerDTO.setSurName(sss);

    customerDTOS.Add(customerDTO);
}

return customerDTOS;

つまり、メソッドはのリストを返す必要がCustomerDTOsあり、それらを使用してファイルに書き込むことができます。

幸運を。

于 2012-10-26T06:10:00.143 に答える
2

メソッドは次のように宣言する必要があります

public List<CustomerDTO> getDetails(Connection conn) throws SQLException {
    ...
}

その目的は、顧客のリストを返すことです (テーブルの行ごとに 1 つ)。

メソッド内には、次のものが必要です。

// create the result list, initially empty
List<CustomerDTO> result = new ArrayList<CustomerDTO>();

// iterate through the rows
while (rs.next()) {

    // TODO: create a new CustomerDTO, and populate it with the row's data
    // TODO: add this DTO to the result list
}

return result;

次に、このメソッドの呼び出し元は、CustomerDTO のリストを反復処理し、それらをファイルに書き込みます。各メソッドにはそれぞれの責任があります。DAO はデータベースの取得を処理しますが、ファイル IO は処理しません。

于 2012-10-26T06:11:54.573 に答える
0

完全な例を次に示します。

public void caller() {
    Connection conn = null;
    // TODO: setup connection
    List list = getDetails(conn);
    for (int i=0; i<list.size(); i++) {
      CustomerDTO dto = list.get(i);
      write(dto.getName(), dto.getSurname());
    }
}

public List getDetails(Connection conn) throws SQLException {

    List myList = new ArrayList();
    ResultSet rs = null;
    PreparedStatement pstmnt = null;

    try {
        // SELECT NAME, SURNAME FROM CUSTOMER
        StringBuffer stringBuffer = new StringBuffer("SELECT " + DBConstants.CUST_NAME     + ", ");
        stringBuffer.append(DBConstants.CUST_SURNAME);
        stringBuffer.append(" FROM " + "CUSTOMER");
        //build string
        String query = stringBuffer.toString();
        //prepared statement
        pstmnt = conn.prepareStatement(query);
        //execute preparestatement
        rs = pstmnt.executeQuery();
        //keep reading next line in table - .next() method means next line

        while (rs.next()) {
            String ss = rs.getString("NAME");
            String sss = rs.getString("SURNAME");
            CustomerDTO customerDTO = new CustomerDTO();
            customerDTO.setName(ss);
            customerDTO.setSurname(sss);
            myList.add(customerDTO);
        }
    } catch (Exception e) {
        e.getMessage();
    }
    rs.close();
    //return list of DTOs.
    return myList;
}

write メソッドの実装はあなたに任せます。また。Java で許可されている場合は、ジェネリックの使用を検討してください。

于 2012-10-26T06:21:35.217 に答える