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