使用JDBC Template处理数据

1. JDBCTemplate模板的update

update一般用于insert等有参数同时传入的且无需返回结果的SQL语句。

三个方法:

public int update(String sql,Object[] args)
public int update(String sql,Object[] args,int[] argTypes)
public int update(String sql,PreparedStatementSetter pss)

 

还有一个方法不过太诡异了,不用之……这里比较搞笑的是第1和第2个,第一个方法中:这里Object []args,居然是由Spring猜测各个类型(反射),而不是顺序按照参数填入……囧。。。

第三个需要匿名类,写一下:

 

String sql = "insert into t_forum(forum_name,forum_desc) values(?,?)";
   getJdbcTemplate().update(sql, new PreparedStatementSetter(){
    public void setValues(PreparedStatement ps) throws SQLException 
    {
     // TODO Auto-generated method stub
     ps.setString(1, forum.getForumName());
     ps.setString(2, forum.getForumDesc());
    }
   });

 2. 更新并获得“新的主键ID”(前提是id是整数)

 

public void addFourm(final Forum forum)
{
   final String sql = "insert into t_forum(forum_name,forum_desc) values(?,?)";
   KeyHolder holder = new GeneratedKeyHolder();
   getJdbcTemplate().update(new PreparedStatementCreator(){

    @Override
    public PreparedStatement createPreparedStatement(Connection conn)
      throws SQLException {
     PreparedStatement ps = conn.prepareStatement(sql);
     ps.setString(1, forum.getForumName());
     ps.setString(2, forum.getForumDesc());
     return ps;
    }

   },holder);
   forum.setForumId(holder.getKey().intValue());
}

 3. JdbcTemplate批量执行SQL语句

两种方法:

 

public int[] batchUpdate(String[] sql)
public int[] batchUpdate(String sql,BatchPreparedStatementSetter pss)

 很显然了,第一个是给一个多个SQL语句的数组,第二个则是根据基础的SQL语句,辅助以BathPreparedStatement,这样在每个pss中,只需要构造逐次的一条SQL语句即可(批量生成SQL语句)。

主要写下面方法的实现:

 

public void addForums(final LinkedList<Forum> forums)
{
   String sql = "insert into t_forum(forum_name,forum_desc) values(?,?)";
   this.getJdbcTemplate().batchUpdate(sql, new BatchPreparedStatementSetter()
   {

    @Override
    public int getBatchSize() {
     return forums.size();
    }

    @Override
    public void setValues(PreparedStatement ps, int i)
      throws SQLException {
     // TODO Auto-generated method stub
     Forum f = forums.get(i);
     ps.setString(1,f.getForumName());
     ps.setString(2, f.getForumDesc());
    }
   });
}

 4. 查询数据:RowCallbackHandler

当需要查询数据的时候,可以使用众多回调器,RowCallbackHandler。

 

public void query(String sql, RowCallbackHandler rch)
public void query(String sql,Object[] args,RowCallbackHandler rch)

 

public Forum getForum(final int forumID)
{
   String sql = "select * from t_forum where forum_id=?";
   final Forum f = new Forum();
   this.getJdbcTemplate().query(sql,
     new PreparedStatementSetter()
   {

    @Override
    public void setValues(PreparedStatement ps) throws SQLException {
     // TODO Auto-generated method stub
     ps.setInt(1, forumID);
    }
   
   },
     new RowCallbackHandler()
   {

    @Override
    public void processRow(ResultSet rs) throws SQLException {
     // TODO Auto-generated method stub
     f.setForumId(rs.getInt("forum_id"));
     f.setForumName(rs.getString("forum_name"));
     f.setForumDesc(rs.getString("forum_desc"));    
    }
   
   });
  
   return f;
}

 5. 查询数据:使用RowMapper

RowMapper的好处是,自动封装了List,并自动返回,无需自己添加List和把元素添加到List中。

 

public List query(String sql,Object[] args,int[] argTypes,RowMapper rowMapper)

public List<Forum> getForums(final int forumID)
{
   String sql = "select * from t_forum where forum_id>?";
   return (List<Forum>)this.getJdbcTemplate().query(
     sql,
     new Object[]{forumID},
     new int[]{java.sql.Types.INTEGER},
     new RowMapper()
     {
      @Override
      public Object mapRow(ResultSet rs, int i)
        throws SQLException {
       Forum f = new Forum();
       f.setForumName(rs.getString("forum_name"));
       f.setForumId(rs.getInt("forum_id"));
       f.setForumDesc(rs.getString("forum_desc"));   
      
       return f;
      }
     }
     );
}

 6. RowCallbackHandler的子类: RowCountCallbackHandler计算行数

 

public int getForumCounts()
{
   String sql = "select * from t_forum";
   RowCountCallbackHandler countCallback = new RowCountCallbackHandler(); // not reusable
   getJdbcTemplate().query(sql, countCallback);
   int rowCount = countCallback.getRowCount();
   return rowCount;
}

 当然,可以覆盖本类的下述方法,来实现对每条结果的处理,继承自RowCallbackHandler

7.查询单值数据

public int getForumCounts()
{
   String sql = "select count(*) from t_forum";
   return this.getJdbcTemplate().queryForObject(sql, Integer.class);
}

 这里之前存在的那些queryForInt等等现在统统被queryForObject取代,后面的第二个参数填写返回值类型。

你可能感兴趣的:(template)