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