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

  • 相关阅读:
    电子书《数字化转型领导者的技术修养》免费下载
    数字签名
    C:条件编译
    轻量级日志收集方案Loki
    安装Kubernetes(k8s)保姆级教程---无坑版
    设计模式七大原则-迪米特法则
    设计模式七大原则-开闭原则
    设计模式七大原则-里氏替换原则
    deepin-terminal改造风云再起
    deepin-terminal再改造
  • 原文地址:https://www.cnblogs.com/ConfidentLiu/p/7117859.html
Copyright © 2020-2023  润新知