• 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对象返回。

  • 相关阅读:
    浙大数据结构课后习题 练习二 7-2 Reversing Linked List (25 分)
    浙大数据结构课后习题 练习二 7-2 一元多项式的乘法与加法运算 (20 分)
    浙大数据结构课后习题 练习一 7-1 Maximum Subsequence Sum (25 分)
    浙大数据结构课后习题 练习一 7-1 最大子列和问题 (20 分)
    PAT Basic 1019 数字黑洞 (20 分)
    PAT Basic 1017 A除以B (20 分)
    PAT Basic 1013 数素数 (20 分)
    PAT Basic 1007 素数对猜想 (20 分)
    PAT Basic 1003 我要通过! (20 分)
    自动化运维——HelloWorld(一)
  • 原文地址:https://www.cnblogs.com/ConfidentLiu/p/7117859.html
Copyright © 2020-2023  润新知