ResultSetExtractor RowMapper 返回list RowCallbackHandler 自己处理返回结果,这是一个接口,实现这个接口自己处理我需要的东西,有状态的.P329 最基本的调用方法 query(PreparedStatementCreator psc, RowCallbackHandler rch) query(String sql, PreparedStatementSetter pss, RowCallbackHandler rch) ,利用pss设置传入SQL的参数 query(String sql, Object[] args, int[] argTypes, RowCallbackHandler rch) ,利用args,argTypes设置传入的参数.Cool update(String sql, Object[] args, int[] argTypes) Cool update(PreparedStatementCreator psc, PreparedStatementSetter pss) 查询语句回调是因为,返回多个值 update语句没有回调,一般都是返回影响了多少个值 =========== 两个类的最后的方法 Spring 2.5中JdbcTemplate类query方法的三种回调接口 使用三种Callback接口作为参数的query方法的返回值不同: 以ResultSetExtractor作为方法参数的query方法返回Object型结果,要使用查询结果,我们需要对其进行强制转型; 以RowMapper接口作为方法参数的query方法直接返回List型的结果; 以RowCallbackHandler作为方法参数的query方法,返回值为void; RowCallbackHandler和RowMapper才是我们最常用的选择 import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.sql.DataSource; import org.springframework.context.ApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowCallbackHandler; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.RowMapperResultSetExtractor; public class YJ { /** * * 返回结果是List里装Map,使用参数,使用回调 RowMapperResultSetExtractor用于处理单行记录, * * 它内部持有一个RowMapper实例的引用,当处理结果集的时候, 会将单行数据的处理委派给其所持有的RowMapper实例,而其余工作它负责 * */ public void getListRowMapperResultSetExtractor() { ApplicationContext context = new FileSystemXmlApplicationContext( "src/database_config.xml"); // E:\demoworkspace\spring 为工程主目录 JdbcTemplate jt = new JdbcTemplate((DataSource) context .getBean("oracleDataSourceTest")); // 测试用的方法 Object[] arg = new Object[] { 10 }; List list = (ArrayList) jt.query("select * from region where rownum<?", arg, new RowMapperResultSetExtractor(new RowMapper() { public Object mapRow(ResultSet rs, int index) throws SQLException { Map u = new HashMap(); // 可以是自己的JavaBean值对象(简单Java对象POJO) u.put("region_id", rs.getString("region_id")); u.put("region_name", rs.getString("region_name")); return u; } })); Iterator it = list.iterator(); while (it.hasNext()) { Map map = (Map) it.next(); System.out.println(map.toString()); } } /** * 返回结果是List里装Map,不使用参数,使用回调 * * 使用RowMapper比直接使用ResultSetExtractor要方便的多,只负责处理单行结果就行,现在,我们只需要将单行的结果组装后返回就行, * * 剩下的工作,全部都是JdbcTemplate内部的事情了。 * 实际上,JdbcTemplae内部会使用一个ResultSetExtractor实现类来做其余的工作, * * 毕竟,该做的工作还得有人做不是?! * */ public void getListRowMapper() { ApplicationContext context = new FileSystemXmlApplicationContext( "src/database_config.xml"); JdbcTemplate jt = new JdbcTemplate((DataSource) context .getBean("oracleDataSourceTest")); List list = jt.query( "select * from region where rownum<10", new RowMapper() { public Object mapRow(ResultSet rs, int index) throws SQLException { Map u = new HashMap(); u.put("region_id", rs.getString("region_id")); u.put("region_name", rs.getString("region_name")); return u; } }); Iterator it = list.iterator(); while (it.hasNext()) { Map map = (Map) it.next(); System.out.println(map.toString()); } } // 返回记录集 /** * * RowCallbackHandler虽然与RowMapper同是处理单行数据,不过,除了要处理单行结果,它还得负责最终结果的组装和获取工作, * * 在这里我们是使用当前上下文声明的List取得最终查询结果, 不过,我们也可以单独声明一个RowCallbackHandler实现类, * * 在其中声明相应的集合类,这样,我们可以通过该RowCallbackHandler实现类取得最终查询结果 * */ public void getListRowCallbackHandler() { ApplicationContext context = new FileSystemXmlApplicationContext( "src/database_config.xml"); JdbcTemplate jt = new JdbcTemplate((DataSource) context .getBean("oracleDataSourceTest")); String sql = "select * from region where region_id>?"; final List<Map> list = new ArrayList<Map>(); // 一定要用final定义 Object[] params = new Object[] { 0 }; jt.query(sql, params, new RowCallbackHandler() { public void processRow(ResultSet rs) throws SQLException { Map u = new HashMap(); u.put("region_id", rs.getString("region_id")); u.put("region_name", rs.getString("region_name")); list.add(u); } }); Iterator it = list.iterator(); while (it.hasNext()) { Map map = (Map) it.next(); System.out.println(map.toString()); } } } =========================== public List<ProjectModel> getProjectListByPMID (String pm_id) throws DataAccessException, DocumentException, IOException{ List<ProjectModel> lProjects = new ArrayList<ProjectModel>(); this.getJdbcTemplate().query(SQLManager.getSQL("getProjectListByPMID"),new Object[]{pm_id},new int[]{Types.VARCHAR}, new GetProjectListByPMIDRowCallbackHandler(lProjects)); return lProjects; } private class GetProjectListByPMIDRowCallbackHandler implements RowCallbackHandler { List<ProjectModel> lProjects = new ArrayList<ProjectModel>(); private GetProjectListByPMIDRowCallbackHandler(List<ProjectModel> l){ this.lProjects = l; } public void processRow(ResultSet rs) throws SQLException{ ProjectModel project = new ProjectModel(); project.setProjectID(String .valueOf(rs.getInt("id"))); project.setProjectName(Utils.convertNull(rs .getString("project_name"))); project.setProjectWON(Utils.convertNull(rs .getString("project_won"))); lProjects.add(project); } } ================ public int addSkill(String skillName) throws DataAccessException, DocumentException, IOException{ return this.getJdbcTemplate().update(SQLManager.getSQL("addSkill"),new Object[]{skillName},new int[]{Types.VARCHAR}); } ====================== CallableStatementCallback callBack = new CallableStatementCallback(){ public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException{ cs.setString(1, empID); cs.registerOutParameter2, java.sql.Types.NUMERIC);// out_success cs.execute(); return (CallableStatement) cs; } }; cs = (CallableStatement)this.getJdbcTemplate().execute(sql, callBack); int totalRecords = cs.getInt(7);