JDBC中的添加/刪除/修改操作的共用方法

字號(hào):


    用來(lái)實(shí)現(xiàn)添加、刪除、修改操作的共用方法。分為兩個(gè)方法,一個(gè)是設(shè)置PreparedStatement ps;對(duì)象參數(shù)的方法。一個(gè)是執(zhí)行泛型PreparedStatement ps;對(duì)象的.
    下面來(lái)看一下吧:
    /*
    * Author:spring
    * Date :09-03-06 20:28
    */
    private PreparedStatement setPreparedStatement(PreparedStatement ps,
    List pars) throws SQLException {
    try {
    // 1.獲取數(shù)組的長(zhǎng)度這樣能提高一點(diǎn)性能
    int x = pars.size();
    // 2.循環(huán)設(shè)置ps中需要的參數(shù)
    for (int i = 0; i ﹤ x; i++) {
    ps.setObject(i + 1, pars.get(i));
    System.out.println(pars.get(i));
    }
    // 3.添加到緩沖區(qū)中
    ps.addBatch();
    // 4.設(shè)置完參數(shù)的ps返回
    return ps;
    } finally {
    }
    }
    /*
    * 執(zhí)行PreparedStatement泛型列表的方法
    */
    privateboolean exceurePreparedStatement(List﹤PreparedStatement> pss)
    throws SQLException {
    int x = 0;
    try {
    // 1.為手動(dòng)提交
    this.conn.setAutoCommit(false);
    // 2.執(zhí)行所有的PreparedStatement對(duì)象
    x = pss.size();
    for (int i = 0; i ﹤ x; i++) {
    pss.get(i).executeBatch();
    }
    // 3.沒有錯(cuò)誤的話的就提交事務(wù)
    this.conn.commit();
    System.out.println("執(zhí)行executeBatch()");
    // 4.如果提交成功那就返回成功true
    returntrue;
    } catch (Exception e) {
    // 出現(xiàn)異?;貪L事務(wù)
    e.printStackTrace();
    System.out.println("執(zhí)行批量時(shí)error");
    this.conn.rollback();
    //個(gè)性化異常
    thrownew MyException("page.error.1000","1000 數(shù)據(jù)執(zhí)行的批量出錯(cuò).");
    //throw new SQLException();
    } finally {
    // 最后把手動(dòng)提交改為自動(dòng)提交
    this.conn.setAutoCommit(true);
    // 關(guān)閉不用的資源
    for (int i = 0; i ﹤ x; i++) {
    DBUtils.close(pss.get(i));
    }
    }
    }
    //下面來(lái)介紹一下它們的用法
    要實(shí)現(xiàn)一個(gè)用戶添加的功能,在添加的同時(shí)還要往log日志表中添加是誰(shuí)操作的
    這就要用到事務(wù)處理了
    /*
    *添加用戶
    */
    public Boolean add_Users() throws SQLException {
    try {
    // 1.要執(zhí)行的sql語(yǔ)句
    sql1 = new StringBuilder()
    .append("insert into spring_users(U_ID,u_Name,u_Password,u_Email,u_State)")
    .append(" values(SEQ_USERS.NEXTVAL,?,?,?,?)");
    // 添加日志
    sql2 = new StringBuilder()
    .append("insert into SPRING_LOG(L_ID,L_NAME,U_ID,L_MESSAGE,L_DATE)")
    .append(" values(SEQ_LOG.nextval,?,?,?,?)");
    // 2.要設(shè)置的參數(shù)列表
    pars1 = new ArrayList();
    pars1.add(dto.get("u_Name")); // 用戶名
    pars1.add(dto.get("u_Password")); // 用戶密碼
    pars1.add(dto.get("u_Email")); // 用戶E-email
    pars1.add(dto.get("u_Rating"));//權(quán)限與用戶狀態(tài)
    // 獲取當(dāng)前操作員的u_id
    String u_Id = (String) dto.get("u_Id");
    pars2 = new ArrayList();
    pars2.add("SPRING_USERS"); // 設(shè)置1 操作的表名
    pars2.add(u_Id); // 設(shè)置2 操作人id
    pars2.add("這是用戶添加操作:用戶名:" + this.dto.get("u_Name"));// 設(shè)置3
    // 描述看看是不是添加操作
    pars2.add(Tools.getSqlTimestamp()); // 設(shè)置4 操作時(shí)間
    // 3.編譯sql語(yǔ)句并設(shè)置參數(shù)
    pss = new ArrayList();
    ps1 = this.conn.prepareStatement(sql1.toString());
    ps2 = this.conn.prepareStatement(sql2.toString());
    // 設(shè)置參數(shù)
    pss.add(this.setPreparedStatement(ps1, pars1));
    pss.add(this.setPreparedStatement(ps2, pars2));
    // 4.調(diào)用執(zhí)行sql語(yǔ)句的方法
    returnthis.exceurePreparedStatement(pss);
    } finally {
    // 5.釋放使用資源
    DBUtils.close(ps1);
    DBUtils.close(ps2);
    }
    }
    這里的一些方法是我封裝的像獲取當(dāng)前用戶的u_id , String u_Id = (String) dto.get("u_Id");這是我用的構(gòu)造傳過來(lái)的dto所以我們不用管它;
    分析一下用法:
    1. 設(shè)置sql語(yǔ)句
    2. 編譯sql語(yǔ)句(用PreparedStatement)
    3. 定義一個(gè)泛型PreparedStatement
    4. 設(shè)置PreparedStatement的參數(shù)返回來(lái)添加到泛型里
    5. 調(diào)用執(zhí)行泛型中的PreparedStatement 對(duì)象
    6. 關(guān)閉不需要的資源