string中執行sql語句


Spring(JdbcTemplate.class)中的queryForMap()、queryForObject()、queryForLong()、queryForInt()等方法都會去調用
public static Object requiredSingleResult(Collection results) throws IncorrectResultSizeDataAccessException這個方法(DataAccessUtils.class)
,此方法中會判斷得到的結果集Collection是否為空,為空就拋出異常EmptyResultDataAccessException
結果程序出錯,在程序中catch該異常並處理一下就可以了。
Integer intTest;
  try {
    Map mapTemp = getJdbcTemplate().queryForMap(sSql,
 oArry );
   intTest= (Integer) mapTemp.get("N_Column");
  } catch (EmptyResultDataAccessException e) {
     intTest=new Integer(0);
  }

 

或者可以考慮使用queryForList()、queryForRowSet()這些方法,去處理。
List listTest = getJdbcTemplate().queryForList(sSql, oArry );

 

 

、、、、、、、、、、、、、、、、、、、、、

轉自:http://hi.baidu.com/storex/blog/item/666b8f3889d7c92f97ddd89d.html
Spring 框架 執行SQL getJdbcTemplate().query update 用法
2010-04-14 13:56

 

 


Spring JdbcDaoSupport 執行SQL

return int: getJdbcTemplate().queryForInt(sql)    select count(*)...
return List:getJdbcTemplate().query(sql, rowMapper)   select ... from ...
return null:getJdbcTemplate().update(sql)     insert into ... values or delete from ... 
return null:getJdbcTemplate().update(sql, objects, types) insert into ... values 
return List:getJdbcTemplate().query(sql, new Object[] { assetId }, new int[] { Types.INTEGER }, rowMapper)   select * from ... where id= 
Object[] objects = new Object[]{user.getId(),user.getName(),user.getPassword()...};
int[] types = new int[]{Type.VARCHAR,Type.VARCHAR,Type.VARCHAR,...}

RowMapper對象
RowMapper的 mapRow() 方法是留給我們去組裝實體類用的,返回是這種類的集合List

Public List<User> getUsers() {
String sql = "select * from User";
return getJdbcTemplate().query(sql,new ItemRowMapper());
}


protected class ItemRowMapper implements RowMapper { //這個類也可以定義在方法里如 RowMapper rowMapper = new RowMapper(){}
public Object mapRow(ResultSet rs, int rowNum) throws SQLException { 
   Item item = new Item(); 
   item.setId(rs.getInt("id")); 
   item.setUserId(rs.getInt("user_id")); 
   item.setName(rs.getString("name")); 
   item.setEmail(rs.getString("email")); 
   return item; 

}

想象 getJdbcTemplate().query()方法 和 RowMapper類

public List query(String sql, RowMapper rowMapper){
int num = 0;
List<Object> list = null;
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try{
   conn = getConn();
   pstmt = conn.prepareStatement(sql);
   rs = pstmt.executeQuery();
   num = 0;
   while(rs.next()){num++};
   list = rowMapper.execute(rs, num);
}catch(Exception e){
  
}finall{
   rs.close();
   pstmt.close();
   conn.close();
}
return list;
}
abstract Class RowMapper(){
List<Object> list = null;
public List execute(ResultSet rs, int rowNum){ //rowNum沒用到
   while(rs.next){
    list.add(mapRow(rs, rowNum));
   }
   return list;
}
public Object mapRow(ResultSet rs, int RowNum);
}

 

 

 

第二部分:轉自:http://peirenlei.javaeye.com/blog/353170


Spring JdbcTemplate 應用

JdbcTemplate中的封裝了很多實用的方法。 
首先來介紹一下用JdbcTemplate來查詢數據的方法。 
1.返回指定對象類型的List (query方法)


Java代碼 復制代碼 
Java代碼 復制代碼
public List getProductModle(String value) throws DataAccessException {    
        List resultList = new ArrayList();    
        List args = new ArrayList();    
        String sql = "select F_CPUT_MOD_ID as id ,F_CPUT_MOD_NAME as name from CPUT_MOD_T"+    
            " WHERE F_MARKET_LOCA_ID = ?  order by F_CPUT_MOD_ID";    
        if(StringUtils.isNotEmpty(value)){    
            args.add(value);    
        }    
        resultList = this.getJdbcTemplate().query(sql,args.toArray(),    
                                            new ProductModleRowMapper());    
        return resultList;    
    }    
    /**   
     * @author rockjava   
     * @description 封裝產品型號結果集   
     */   
    private   class  ProductModleRowMapper  implements  RowMapper{    
   
        public Object mapRow(final ResultSet rs, final int rowNum) throws SQLException {    
            ProductModleVO vo = new ProductModleVO();    
            vo.setProModleId((String)rs.getString("id"));    
            vo.setProModleName((String)rs.getString("name"));    
            return vo;    
        }    
            
    }  

public List getProductModle(String value) throws DataAccessException {    List resultList = new ArrayList();    List args = new ArrayList();    String sql = "select F_CPUT_MOD_ID as id ,F_CPUT_MOD_NAME as name from CPUT_MOD_T"+     " WHERE F_MARKET_LOCA_ID = ?  order by F_CPUT_MOD_ID";    if(StringUtils.isNotEmpty(value)){     args.add(value);    }    resultList = this.getJdbcTemplate().query(sql,args.toArray(),             new ProductModleRowMapper());    return resultList;   }   /**    * @author rockjava    * @description 封裝產品型號結果集    */   private   class  ProductModleRowMapper  implements  RowMapper{      public Object mapRow(final ResultSet rs, final int rowNum) throws SQLException {     ProductModleVO vo = new ProductModleVO();     vo.setProModleId((String)rs.getString("id"));     vo.setProModleName((String)rs.getString("name"));     return vo;    }       }

 

 
這里實現了RowMapper類的mapRow方法,用來把查詢到的結果集用指定的類來封裝,最后返回一個List,List中裝着 
我們自定的值對象。 
2.返回指定類型的結果 (queryForObject方法)


Java代碼 復制代碼
public String getCurrentPhase(String arg) throws DataAccessException {    
        String currentPhase = "";    
        String sql="select F_CURR_YEAR from COMPETITION_BASE_T where F_COMPETITION_ID=?";    
        Object[] o ={arg};     
        try {    
            currentPhase = (String)this.getJdbcTemplate().queryForObject(sql,o, String.class);    
        } catch (Exception e) {    
            currentPhase = "";    
            e.printStackTrace();    
        }    
            
        return currentPhase;    
    }  

public String getCurrentPhase(String arg) throws DataAccessException {    String currentPhase = "";    String sql="select F_CURR_YEAR from COMPETITION_BASE_T where F_COMPETITION_ID=?";    Object[] o ={arg};     try {     currentPhase = (String)this.getJdbcTemplate().queryForObject(sql,o, String.class);    } catch (Exception e) {     currentPhase = "";     e.printStackTrace();    }        return currentPhase;   }

 

 
在這個例子中,用到了queryForObject這個方法,其中第一個參數是要執行的sql,第二個參數是Object數組類型(其中裝的是sql腳本用到 
的參數),第三個參數就是要制定返回結果的類型(這里我定義的是String類型) 
3.查詢結果返回Int類型 (queryForInt方法)


 
Java代碼 復制代碼
public boolean doCheckCompete(Map args) throws DataAccessException {    
        ....省略代碼    
            
        /**sql腳本用到的參數集合*/   
        Object[] args = new Object[]{    
                companyId,            
                competitionId,        
                marketType,           
                martID,               
                currentPhase          
        };    
        StringBuffer sql = new StringBuffer();    
        sql.append("SELECT   COUNT ( * ) ");    
        sql.append("FROM   BEFOR_ORDER_T t ");    
        sql.append("WHERE   T.F_COMPANY_ID = ? ");    
        sql.append(" and T.F_COMPETITION_ID=? ");    
        sql.append(" and T.F_MARKET_LOCA_ID=? ");    
        sql.append(" and T.F_MARKET_SCOPE_ID=? ");    
        sql.append(" and T.F_CURRENT_PHASE = ? ");    
        int i=0;    
        i = this.getJdbcTemplate().queryForInt(sql.toString(), args);    
        if(i>0){    
            return true;    
        }    
        return false;    
    }  

public boolean doCheckCompete(Map args) throws DataAccessException {    ....省略代碼        /**sql腳本用到的參數集合*/    Object[] args = new Object[]{      companyId,              competitionId,          marketType,             martID,                 currentPhase          };    StringBuffer sql = new StringBuffer();    sql.append("SELECT   COUNT ( * ) ");    sql.append("FROM   BEFOR_ORDER_T t ");    sql.append("WHERE   T.F_COMPANY_ID = ? ");    sql.append(" and T.F_COMPETITION_ID=? ");    sql.append(" and T.F_MARKET_LOCA_ID=? ");    sql.append(" and T.F_MARKET_SCOPE_ID=? ");    sql.append(" and T.F_CURRENT_PHASE = ? ");    int i=0;    i = this.getJdbcTemplate().queryForInt(sql.toString(), args);    if(i>0){     return true;    }    return false;   }

 

 
這里用的是queryForInt方法返回int類型。 
4.查詢結果返回Map類型 (queryForMap方法)

 

 


Java代碼 
String sql = "select T.F_COMPETE_ORDER_STATE ,T.F_GENERATED_ORDERS " +    
        "from COMPETITION_BASE_T t " +    
        "where T.F_COMPETITION_ID = ?";    
   
Map state = (Map)this.getJdbcTemplate().queryForMap(sql,new Object[]{args});    
   
String compete_order_state = state.get("F_COMPETE_ORDER_STATE").toString();    
   
String generated_orders = state.get("F_GENERATED_ORDERS").toString();  

String sql = "select T.F_COMPETE_ORDER_STATE ,T.F_GENERATED_ORDERS " +    "from COMPETITION_BASE_T t " +    "where T.F_COMPETITION_ID = ?";    Map state = (Map)this.getJdbcTemplate().queryForMap(sql,new Object[]{args});    String compete_order_state = state.get("F_COMPETE_ORDER_STATE").toString();    String generated_orders = state.get("F_GENERATED_ORDERS").toString();

 

 
返回后的map中的鍵值對應的是select語句中的字段名字。 
5.查詢結果集直接返回list (queryForList方法)


Java代碼 
List list = new ArrayList();    
String sql="select T.F_OFF_PERIOD,T.F_PROBABILITY from ORDER_OFF_PERIOD_T t "+    
    "where T.F_COMPETITION_ID=?";    
Object[] args ={arg};     
try {    
    list = this.getJdbcTemplate().queryForList(sql, args);    
} catch (Exception e) {    
    e.printStackTrace();    
}    
...代碼省略    
   
String a = (String)(((Map) list.get(0)).get("F_PROBABILITY"));    
String b = (String)(((Map) list.get(1)).get("F_PROBABILITY"));    
String c = (String)(((Map) list.get(2)).get("F_PROBABILITY"));  

List list = new ArrayList();  String sql="select T.F_OFF_PERIOD,T.F_PROBABILITY from ORDER_OFF_PERIOD_T t "+   "where T.F_COMPETITION_ID=?";  Object[] args ={arg};   try {   list = this.getJdbcTemplate().queryForList(sql, args);  } catch (Exception e) {   e.printStackTrace();  }  ...代碼省略    String a = (String)(((Map) list.get(0)).get("F_PROBABILITY"));  String b = (String)(((Map) list.get(1)).get("F_PROBABILITY"));  String c = (String)(((Map) list.get(2)).get("F_PROBABILITY"));

 

 
返回的List中裝載的是Map對象,沒個map對象中的鍵值對應sql腳本的字段名字。

 

 

 

上一篇中介紹了JdbcTemplate 的一些常用的查詢方法,在這篇里將介紹用JdbcTemplate做更新數據操作

 

和調用存儲過程。

 

 

 

1. JdbcTemplate 更新數據

 

 


Java代碼 
public boolean switchStartOrderMeeting(String argument, String flag)    
            throws DataAccessException {    
        boolean result = false;    
        String sql =     
            sql = "update COMPETITION_BASE_T t set T.F_COMPETE_ORDER_STATE = '0'"+    
            " where T.F_COMPETITION_ID = ?";    
        int i = 0;    
        //返回所影響的行數    
        i = this.getJdbcTemplate().update(sql, new Object[] { argument });    
        if (i > 0) {    
            result = true;    
        }    
        return result;    
    }  

public boolean switchStartOrderMeeting(String argument, String flag)     throws DataAccessException {    boolean result = false;    String sql =      sql = "update COMPETITION_BASE_T t set T.F_COMPETE_ORDER_STATE = '0'"+     " where T.F_COMPETITION_ID = ?";    int i = 0;    //返回所影響的行數    i = this.getJdbcTemplate().update(sql, new Object[] { argument });    if (i > 0) {     result = true;    }    return result;   }

 

 

 

 

 

 這個方法很簡單,update方法只要傳入sql腳本和腳本參數(Object數組類型)。

 

 

 

2. JdbcTemplate 調用存儲過程

 

 


Java代碼 
/**代碼片段*/   
//5個輸入參數,3個輸出參數    
String sql = "{call GENERATEORDERS_P(?,?,?,?,?,?,?,?)}";    
                                
final String company_id = result.get("F_COMPANY_ID").toString();           // 公司ID    
final String competition_id = result.get("F_COMPETITION_ID").toString();   // 比賽ID    
final String current_phase = result.get("F_CURRENT_PHASE").toString();     // 當前周期    
final String market_scope_id = result.get("F_MARKET_SCOPE_ID").toString(); // 市場ID    
final String market_loca_id = result.get("F_MARKET_LOCA_ID").toString();   // 產品類型ID    
   
Map mapR = (Map) getJdbcTemplate().execute(sql,new CallableStatementCallback() {    
            public Object doInCallableStatement(CallableStatement cs)throws SQLException,DataAccessException {    
                cs.setString(1, current_phase);    // 輸入參數    
                cs.setString(2, competition_id);   // 輸入參數    
                cs.setString(3, market_scope_id);  // 輸入參數    
                cs.setString(4, market_loca_id);   // 輸入參數    
                cs.setString(5, company_id);       // 輸入參數    
                cs.registerOutParameter(6,Types.VARCHAR);//輸出參數    
                cs.registerOutParameter(7,Types.VARCHAR);//輸出參數    
                cs.registerOutParameter(8,Types.VARCHAR);//輸出參數    
                cs.execute();    
                Map map = new HashMap();    
                map.put("RESULT", cs.getString(6));       // 訂單數量    
                map.put("F_PRICE", cs.getString(7));      // 訂單價格    
                map.put("F_CPUT_MOD_ID", cs.getString(8));// 產品型號ID    
                return map;    
            }    
        });  

/**代碼片段*/  //5個輸入參數,3個輸出參數  String sql = "{call GENERATEORDERS_P(?,?,?,?,?,?,?,?)}";           final String company_id = result.get("F_COMPANY_ID").toString();           // 公司ID  final String competition_id = result.get("F_COMPETITION_ID").toString();   // 比賽ID  final String current_phase = result.get("F_CURRENT_PHASE").toString();     // 當前周期  final String market_scope_id = result.get("F_MARKET_SCOPE_ID").toString(); // 市場ID  final String market_loca_id = result.get("F_MARKET_LOCA_ID").toString();   // 產品類型ID    Map mapR = (Map) getJdbcTemplate().execute(sql,new CallableStatementCallback() {     public Object doInCallableStatement(CallableStatement cs)throws SQLException,DataAccessException {      cs.setString(1, current_phase);    // 輸入參數      cs.setString(2, competition_id);   // 輸入參數      cs.setString(3, market_scope_id);  // 輸入參數      cs.setString(4, market_loca_id);   // 輸入參數      cs.setString(5, company_id);       // 輸入參數      cs.registerOutParameter(6,Types.VARCHAR);//輸出參數      cs.registerOutParameter(7,Types.VARCHAR);//輸出參數      cs.registerOutParameter(8,Types.VARCHAR);//輸出參數      cs.execute();      Map map = new HashMap();      map.put("RESULT", cs.getString(6));       // 訂單數量      map.put("F_PRICE", cs.getString(7));      // 訂單價格      map.put("F_CPUT_MOD_ID", cs.getString(8));// 產品型號ID      return map;     }    });

 

 

 

 

 

 execute方法返回的是一個Object對象,在這里我封裝了一個Map對象返回。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM