自定义功能回调:提供给用户一个扩展点,用户可以在指定类型的扩展点执行任何数量需要的操作ConnectionCallback:通过回调获取JdbcTemplate提供的Connection,用户可在该Connection执行任何数量的操作;StatementCallback:通过回调获取JdbcTemplate提供的Statement,用户可以在该Statement执行任何数量的操作;PreparedStatementCallback:通过回调获取JdbcTemplate提供的PreparedStatement,用户可以在该PreparedStatement执行任何数量的操作;CallableStatementCallback:通过回调获取JdbcTemplate提供的CallableStatement,用户可以在该CallableStatement执行任何数量的操作;
结果集处理回调:通过回调处理ResultSet或将ResultSet转换为需要的形式RowMapper:用于将结果集每行数据转换为需要的类型,用户需实现方法mapRow(ResultSet rs, int rowNum)来完成将每行数据转换为相应的类型 。RowCallbackHandler:用于处理ResultSet的每一行结果,用户需实现方法processRow(ResultSet rs)来完成处理,在该回调方法中无需执行rs.next(),该操作由JdbcTemplate来执行,用户只需按行获取数据然后处理即可 。ResultSetExtractor:用于结果集数据提取,用户需实现方法extractData(ResultSet rs)来处理结果集,用户必须处理整个结果集;
@Testpublic void testResultSet1() {jdbcTemplate.update("insert into user(user_name) values('name7')");String listSql = "select * from user where user_name=?";List result = jdbcTemplate.query(listSql,new Object[]{"name7"}, new RowMapper<Map>() {public Map mapRow(ResultSet rs, int rowNum) throws SQLException {Map row = new HashMap();row.put(rs.getInt("user_id"), rs.getString("user_name"));return row;}});Assert.assertEquals(1, result.size());//查询结果数量为1才向下执行jdbcTemplate.update("delete from user where user_name='name7'");}RowMapper接口提供mapRow(ResultSet rs, int rowNum)方法将结果集的每一行转换为一个Map,当然可以转换为其他类 。
@Testpublic void testResultSet2() {jdbcTemplate.update("insert into user(user_name) values('name5')");String listSql = "select * from user";final List result = new ArrayList();jdbcTemplate.query(listSql, new RowCallbackHandler() {public void processRow(ResultSet rs) throws SQLException {Map row = new HashMap();row.put(rs.getInt("user_id"), rs.getString("user_name"));result.add(row);}});Assert.assertEquals(1, result.size());jdbcTemplate.update("delete from user where user_name='name5'");}RowCallbackHandler接口也提供方法processRow(ResultSet rs),能将结果集的行转换为需要的形式 。
@Testpublic void testResultSet3() {jdbcTemplate.update("insert into test(name) values('name5')");String listSql = "select * from test";List result = jdbcTemplate.query(listSql, new ResultSetExtractor<List>() {public List extractData(ResultSet rs) throws SQLException, DataAccessException {List result = new ArrayList();while (rs.next()) {Map row = new HashMap();row.put(rs.getInt("id"), rs.getString("name"));result.add(row);}return result;}});Assert.assertEquals(0, result.size());jdbcTemplate.update("delete from test where name='name5'");}ResultSetExtractor使用回调方法extractData(ResultSet rs)提供给用户整个结果集,让用户决定如何处理该结果集 。
当然JdbcTemplate提供更简单的queryForXXX方法,来简化开发:
//1.查询一行数据并返回int型结果jdbcTemplate.queryForInt("select count(*) from test");//2. 查询一行数据并将该行数据转换为Map返回jdbcTemplate.queryForMap("select * from test where name='name5'");//3.查询一行任何类型的数据,最后一个参数指定返回结果类型jdbcTemplate.queryForObject("select count(*) from test", Integer.class);//4.查询一批数据,默认将每行数据转换为MapjdbcTemplate.queryForList("select * from test");//5.只查询一列数据列表,列类型是String类型,列名字是namejdbcTemplate.queryForList("select name from test where name=?", new Object[]{"name5"}, String.class);//6.查询一批数据,返回为SqlRowSet,类似于ResultSet,但不再绑定到连接上SqlRowSet rs = jdbcTemplate.queryForRowSet("select * from test");返回新增的自增ID@Testpublic void test(){String sql = "insert into sp_user(name) values (?)";KeyHolder keyHolder = new GeneratedKeyHolder();jdbcTemplate.update(new PreparedStatementCreator() {@Overridepublic PreparedStatement createPreparedStatement(Connection connection) throws SQLException {// 设置返回的主键字段名PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);ps.setString(1, "harvey");return ps;}}, keyHolder);// 获取到插入数据生成的IDint num = keyHolder.getKey().intValue();System.out.println(num);}二、NamedParameterJdbcTemplate什么是具名参数在经典的 JDBC 用法中, SQL 参数是用占位符 ? 表示,并且受到位置的限制 。定位参数的问题在于, 一旦参数的顺序发生变化, 就必须改变参数绑定 。在 Spring JDBC 框架中, 绑定 SQL 参数的另一种选择是使用具名参数(named parameter) 。
以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!
「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助:- 一升是多少斤水
- 解析复选框的checked属性 js如何判断checkbox是否选中
- xo怎么喝才好喝
- 2021年省钱的返利app排名 返利商品怎么入账
- 好用的照相软件排名 什么相机软件好用有实惠
- 一个完整的网上商城的源码 php商城系统技术难点
- 神话中鸟的名字除了精卫还有哪些
- 买来的螃蟹怎么保存
- 这3种人,一定会得到佛菩萨的加持 身上有菩萨跟着的人
- 《长津湖之水门桥》每个人的结局是什么