使用JDBC Template处理数据

7 篇文章 0 订阅
3 篇文章 0 订阅

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取代,后面的第二个参数填写返回值类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值