本文共 9438 字,大约阅读时间需要 31 分钟。
spring的javadoc上讲getObject(String, Object[], Class) will return NULL if the result of the query is NUL
这里有0行和nullresult的区别0行: select salary from user where 1 = 2null result: select max(salary) from user where 1 = 2 返回就是null0行一定抛出IncorrectResultSizeDataAccessException异常原因如下ResultSetMetaData rsmd = rs.getMetaData();int nrOfColumns = rsmd.getColumnCount();这里返回ResultSet的列数 if (nrOfColumns != 1) { throw new IncorrectResultSizeDataAccessException( "Expected single column but found " + nrOfColumns, 1, nrOfColumns); }0行,多于1行,就抛异常了 最好还是用QueryForList,返回的list的size为0,就是0行 还有oracle 10g的问题,jdbc驱动版本10.1.0.20getObject返回一个日期类型为java.util.Date但是这个日期只有年-月-日,没有时-分-秒,因为10g对于DATE类型的列,getObject().getClass().getName()得到 java.sql.DateSystem.out.println(rs.getObject("date_created") + " " + rs.getObject("date_created").getClass());得到 2005-10-06 class java.sql.Date要得到全部日期,必须使用oracle.sql.TIMESTAMP但是使用queryForObject("sql", Timestamp.class) 得到org.springframework.dao.TypeMismatchDataAccessException异常java.sql.Timestamp] and could not be converted to required type [java.sql.Timestamp] 很是莫名其妙只好使用java -Doracle.jdbc.V8Compatibility="true" MyApp解决
以下是对JdbcTemplate 常规用法总结:
jdbcTemplate.execute("CREATE TABLE USER (user_id integer, name varchar(100))");2、如果是UPDATE或INSERT,可以用update()方法。
jdbcTemplate.update("INSERT INTO USER VALUES('" + user.getId() + "', '" + user.getName() + "', '" + user.getSex() + "', '" + user.getAge() + "')");3、带参数的更新
jdbcTemplate.update("UPDATE USER SET name = ? WHERE user_id = ?", new Object[] {name, id});
jdbcTemplate.update("INSERT INTO USER VALUES(?, ?, ?, ?)", new Object[] {user.getId(), user.getName(), user.getSex(), user.getAge()});4、使用JdbcTemplate进行查询时,使用queryForXXX()等方法
int count = jdbcTemplate.queryForInt("SELECT COUNT(*) FROM USER");
String name = (String) jdbcTemplate.queryForObject("SELECT name FROM USER WHERE user_id = ?", new Object[] {id}, java.lang.String.class);
List rows = jdbcTemplate.queryForList("SELECT * FROM USER");
List rows = jdbcTemplate.queryForList("SELECT * FROM USER");Iterator it = rows.iterator();while(it.hasNext()) { Map userMap = (Map) it.next(); System.out.print(userMap.get("user_id") + "/t"); System.out.print(userMap.get("name") + "/t"); System.out.print(userMap.get("sex") + "/t"); System.out.println(userMap.get("age") + "/t");}JdbcTemplate将我们使用的JDBC的流程封装起来,包括了异常的捕捉、SQL的执行、查询结果的转换等等。spring大量使用Template Method模式来封装固定流程的动作,XXXTemplate等类别都是基于这种方式的实现。 除了大量使用Template Method来封装一些底层的操作细节,spring也大量使用callback方式类回调相关类别的方法以提供JDBC相关类别的功能,使传统的JDBC的使用者也能清楚了解spring所提供的相关封装类别方法的使用。 JDBC的PreparedStatement
final String id = user.getId();final String name = user.getName();final String sex = user.getSex() + "";final int age = user.getAge();jdbcTemplate.update("INSERT INTO USER VALUES(?, ?, ?, ?)", new PreparedStatementSetter() { public void setValues(PreparedStatement ps) throws SQLException { ps.setString(1, id); ps.setString(2, name); ps.setString(3, sex); ps.setInt(4, age); } });
final User user = new User();jdbcTemplate.query("SELECT * FROM USER WHERE user_id = ?", new Object[] {id}, new RowCallbackHandler() { public void processRow(ResultSet rs) throws SQLException { user.setId(rs.getString("user_id")); user.setName(rs.getString("name")); user.setSex(rs.getString("sex").charAt(0)); user.setAge(rs.getInt("age")); } });
class UserRowMapper implements RowMapper { public Object mapRow(ResultSet rs, int index) throws SQLException { User user = new User(); user.setId(rs.getString("user_id")); user.setName(rs.getString("name")); user.setSex(rs.getString("sex").charAt(0)); user.setAge(rs.getInt("age")); return user; }}public List findAllByRowMapperResultReader() { String sql = "SELECT * FROM USER"; return jdbcTemplate.query(sql, new RowMapperResultReader(new UserRowMapper()));}在getUser(id)里面使用UserRowMapper
public User getUser(final String id) throws DataAccessException { String sql = "SELECT * FROM USER WHERE user_id=?"; final Object[] params = new Object[] { id }; List list = jdbcTemplate.query(sql, params, new RowMapperResultReader(new UserRowMapper())); return (User) list.get(0);}网上收集 org.springframework.jdbc.core.PreparedStatementCreator 返回预编译SQL 不能于Object[]一起用
public PreparedStatement createPreparedStatement(Connection con) throws SQLException { return con.prepareStatement(sql); }1.增删改 org.springframework.jdbc.core.JdbcTemplate 类(必须指定数据源dataSource)
template.update("insert into web_person values(?,?,?)",Object[]);或
template.update("insert into web_person values(?,?,?)",new PreparedStatementSetter(){ 匿名内部类 只能访问外部最终局部变量 public void setValues(PreparedStatement ps) throws SQLException { ps.setInt(index++,3); });org.springframework.jdbc.core.PreparedStatementSetter 接口 处理预编译SQL
public void setValues(PreparedStatement ps) throws SQLException { ps.setInt(index++,3); }2.查询JdbcTemplate.query(String,[Object[]/PreparedStatementSetter],RowMapper/RowCallbackHandler) org.springframework.jdbc.core.RowMapper 记录映射接口 处理结果集
public Object mapRow(ResultSet rs, int arg1) throws SQLException { int表当前行数 person.setId(rs.getInt("id")); } List template.query("select * from web_person where id=?",Object[],RowMapper);org.springframework.jdbc.core.RowCallbackHandler 记录回调管理器接口 处理结果集
template.query("select * from web_person where id=?",Object[],new RowCallbackHandler(){ public void processRow(ResultSet rs) throws SQLException { person.setId(rs.getInt("id")); });
转载请标明出处
技术交流群:361579846