Spring Jdbc
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Jdbc相关的知识,希望对你有一定的参考价值。
Spring Jdbc用法:
使用jdbcTemplate查询数据的时候可以使用queryForXXX等方法。下面我们就一一解析一下: 1、jdbcTemplate.queryForInt()和jdbcTemplate.queryForLong() --使用queryForInt返回user表中的记录数量,queryForInt搭配这样的sql可以在分页的时候计算总记录数 jdbcTemplate.queryForInt("select count(*) from user"); 2、jdbcTemplate.queryForObject() --本质上和queryForInt相同,只是可以返回不同的对象,例如返回一个String对象 String name = (String) jdbcTemplate.queryForObject( --3个参数,1、sql 2、要传递的参数数组 3、返回来的对象class "SELECT name FROM USER WHERE id = ?", new Object[] {id}, java.lang.String.class); 3、jdbcTemplate.queryForList(???) --返回一个装有map的list,每一个map是一条记录,map里面的key是字段名 List rows = jdbcTemplate.queryForList("SELECT * FROM user"); --得到装有map的list for(int i=0;i<rows.size();i++){ --遍历 Map userMap=rows.get(i); System.out.println(userMap.get("id")); System.out.println(userMap.get("name")); System.out.println(userMap.get("age")); } 4、jdbcTemplate.queryForMap(SQL) --这个查询只能是查询一条记录的查询,返回一个map,key的值是column的值 Map map = jdbcTemplate.queryForMap("select count(*) as keyval from user"); map.get("keyval") 5、jdbcTemplate.queryForRowSet(???) --返回一个RowSet 然后调用.getString或者getInt等去取值 6、jdbc1.query(sql, new RowCallbackHandler() --返回一个ResultSet对象, processRow有自动循环的机制,它会自动执行processRow中的语句直到 --rs的size执行完了为止。我们可以在这其中用list完成对象的转移,只不过list要用final来修饰 jdbc1.query(sql, new RowCallbackHandler() { //editing public void processRow(ResultSet rs) throws SQLException { VideoSearch vs = new VideoSearch(); vs.setRECORDINGFILENAME(rs.getString("RECORDINGFILENAME")); vs.setCALLID(rs.getString("CALLID")); list.add(vs); } } 说明: JDBCTemplate的使用方法: 在ApplicationContext.xml中定义一个jdbcTemplate的节点,使用POJO注入,获得注入后可以执行操作 不需要继承什么基类 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean> SqlRowSet rs = jdbcTemplate.queryForRowSet(sql, params); jdbcTemplate有很多的ORM化回调操作将返回结果转为对象列表, 但很多时候还是需要返回ResultSet,Spring有提供一个类似ResultSet的,实现JDBC3.0 RowSet接口的Spring SqlRowSet 注意
jdbcTemplate没有queryForString方法。
org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0 的异常,解决办法就是捕捉这个异常然后返回null即可。
- try{
- return getJdbcTemplate().queryForMap("select s.fb,s.pb,s.tu,s.qt,s.fbc,s.pbc,s.tt,s.ft,s.lt from gbc$view_user s where s.ud = ? and ad= ?", new Object[]{ud,ad});
- }catch (EmptyResultDataAccessException e) {
- return null;
- }
解决方案 在queryForMap的地方 try catch 一下 即可。
// hack
@Override
public Map<String, Object> queryForMap(String sql, Object... args) {
List<Map<String, Object>> result = queryForList(sql, args);
if (result != null && result.size() > 0)
return result.get(0);
else
return null; // or new HashMap<String, Object>();
}
public List<List<Object>> queryForArrays(String sql, Object... args) {
f inal List<List<Object>> arrays = new ArrayList<List<Object>>();
jdbcTemplate.query(sql, args, new RowCallbackHandler() {
// 不需要手动调用rs.next
public void processRow(ResultSet rs) throws SQLException {
List<Object> row = new ArrayList<Object>();
int count = rs.getMetaData().getColumnCount();
for (int col = 1; col <= count; col++) {
row.add(rs.getObject(col));
}
arrays.add(row);
}
});
return arrays;
}
以上是关于Spring Jdbc的主要内容,如果未能解决你的问题,请参考以下文章
Spring对JDBC的模板支持——JdbcTemplate
mysql jdbc源码分析片段 和 Tomcat's JDBC Pool
初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段