1. JDBCTemplate模板的update
update一般用于insert等有参数同时传入的且无需返回结果的SQL语句。
三个方法:
1 2 3 |
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猜测各个类型(反射),而不是顺序按照参数填入……囧。。。
第三个需要匿名类,写一下:
1 2 3 4 5 6 7 8 9 |
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是整数)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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语句
两种方法:
1 2 |
public int[] batchUpdate(String[] sql) public int[] batchUpdate(String sql,BatchPreparedStatementSetter pss) |
很显然了,第一个是给一个多个SQL语句的数组,第二个则是根据基础的SQL语句,辅助以BathPreparedStatement,这样在每个pss中,只需要构造逐次的一条SQL语句即可(批量生成SQL语句)。
主要写下面方法的实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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。
1 2 |
public void query(String sql, RowCallbackHandler rch) public void query(String sql,Object[] args,RowCallbackHandler rch) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
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中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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计算行数
1 2 3 4 5 6 7 8 |
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.查询单值数据
1 2 3 4 5 |
public int getForumCounts() { String sql = "select count(*) from t_forum"; return this.getJdbcTemplate().queryForObject(sql, Integer.class); } |
©原创文章,转载请注明来源: 赵伊凡's Blog
©本文链接地址: 使用JDBC Template处理数据
“使用JDBC Template处理数据”的38个回复