JavaバックエンドDAO層学習レコード


DAOレイヤでは、主にデータベースと付き合い、いくつかのデータへのアクセスを担当します.バッチidに基づいて多くのユーザーの情報をクエリーし、通常の操作に従います.
  @Repository
    public class UserDao extends BaseDAO {
    //    RowMapper     
    public class UserMapper implements RowMapper {
            @Override
            public User mapRow(ResultSet resultSet,int index) throws SQLException{
                User user = new User();
                user.setId(resultSet.getInt("id"));
                user.setUsername(resultSet.getString("username"));
                user.setPassword(resultSet.getString("password"));
                return user;
            }
        }
            //     id         ,    
        public Collection findUsersByIDs(Collection ids){
            StringBuilder sql = new StringBuilder("select * from user where id in (");
            ids.forEach((id)->sql.append("?,"));
            sql.deleteCharAt(sql.length()-2);
    //        sql.deleteCharAt(sql.lastIndexOf(","));  //                  sql  ,        
            sql.append(")");
            //query     :SQL  ,    ,RowMapper  ,            ROwMapper UserMapper
            return jdbcTemplate.query(sql.toString(),ids.toArray(new Object[0]),new UserMapper());
        }



上記の書き方はforEachで賦値を遍歴するほか、通常のforループで賦値することもできるし、マルチスレッドで同時実行することもできる.以下のようにする.
 public Collection findUsersByIDs(Collection ids){
        StringBuilder sql = new StringBuilder("select * from user where id in (");
        Object[] args = new Object[ids.size()];
        AtomicInteger index = new AtomicInteger(0);
        ids.forEach((id)->{
            sql.append(id).append("?,");
            args[index.getAndIncrement()] = id;
        });
        sql.deleteCharAt(sql.length()-2);
        sql.append(")");
       // return jdbcTemplate.query(sql.toString(),args,new UserMapper());
        // TODO:                   
        return jdbcTemplate.query(sql.toString(),ids.toArray(new Object[0]),new UserMapper());
        }

ここでは、当時慕課ネットでspringを勉強していたときのspringのまとめを引用して、IOCであるDIは、呼び出し者が自分でnew被呼び出しオブジェクトに行く必要はなく、spring IOCコンテナを通じて配置されたbeanオブジェクトを注入し、注入であるsetterメソッドとコンストラクタ注入を設置することで理解を深めることができます.beanマウントはxml構成で設定してもよいし、スキャンパスを設定した後、注記でコンテナにマウントするbeanを認識させることもできる.aopは切面プログラミングに向いており、切面は業務と垂直であり、異なる業務は往々にして共通の類似の追加操作を行い、業務の前にしたり、業務の後にしたり、業務に異常が発生したときにしたり、業務の前後にしたりしなければならない.さらに、これらの額外操作は業務自体の入力パラメータと業務完了の出力結果にも使わなければならない.例えば、業務は一般的にログを記録しなければならない.例えば、データ更新に関する業務が完了した後、データベース操作を伴わなければならない.口座の各種操作の前にユーザー権限を検証しなければならない.これらの業務に伴う操作は大体似ていることが多い.もし各業務がこれらの操作を書くならば、特に煩雑で、これらの操作を提出すると切面となり、業務と分離する.xmlとAPI方式はいずれもaop構成を実現することができ、pointcutは業務であり、aspectは断面であり、その2つがどのようにインタラクティブに実行され、どのようにパラメータを伝達し、結果を呼び出すかは、xmlとAPI方式によって実現することができる.また、エージェントを構成するのは無理です.最もすごいのは、以前は馬鹿にしていたほど煩雑で複雑なxmlを見ていたが、api方式は簡単で直感的なaspectj方式で等価に実現でき、純Javaラベルを使って、xmlに自動エージェントを設置したことだ.ただし@Aspect容器のみは認識されず,@Componentを加えて認識する.