日期:2014-05-16  浏览次数:20568 次

spring 3 jdbc常用小结
  spring 3的jdbc跟spring mvc搭配起来挺好用的,本文试着小结其主要使用方法,并举出spring 3.3.2中的一些信变化进行解析

1) 在dao中注入jdbctemplate,然后直接execute sql一下,当然配置文件要配置,如
  

@Autowired
	private JdbcTemplate jdbcTemplate;
........
        String sql=".......";
         jdbcTemplate.execute(sql);



  配置文件:
   <bean id="jdbcTemplate"
      class="org.springframework.jdbc.core.JdbcTemplate"
      p:dataSource-ref="dataSource"/>


    具体的crud都可以用update方法去实现(insert,update,delete都可以使用update方法),比如:
  
final String sql = "INSERT INTO t_forum(forum_name,forum_desc) VALUES(?,?)";
		Object[] params = new Object[] { forum.getForumName(),
				forum.getForumDesc() };
		
 jdbcTemplate.update(sql, params);

    就是使用?做占位符了。

2 接下来看如何获得自增主键
   spring使用KeyHolder接口的一个实现类GeneratedKeyHolder返回每次插入后的自增键;

KeyHolder keyHolder = new GeneratedKeyHolder();
		jdbcTemplate.update(new PreparedStatementCreator() {
			public PreparedStatement createPreparedStatement(Connection conn)
					throws SQLException {
				PreparedStatement ps = conn.prepareStatement(sql);
				ps.setString(1, forum.getForumName());
				ps.setString(2, forum.getForumDesc());
				return ps;
			}
		}, keyHolder);
		forum.setForumId(keyHolder.getKey().intValue());

     keyHolder.getKey().intValue()这里就获得了信增加的主键了;


3 接下来看下如何查询数据,这个是很基本的了,spring jdbc使用了
RowCallbackHandler的回调接口
  
  

String sql = "SELECT ......";	
	
		final List<Forum> forums = new ArrayList<Forum>();
		jdbcTemplate.query(sql,new Object[]{fromId,toId},new
		 RowCallbackHandler(){ public void processRow(ResultSet rs) throws
		 SQLException { Forum forum = new Forum();
		  forum.setForumId(rs.getInt("forum_id"));
		  forum.setForumName(rs.getString("forum_name"));
		  forum.setForumDesc(rs.getString("forum_desc"));  
                             forums.add(forum);
		 }}); return forums;
		



  另外一种常用的方法是使用rowmapper处理结果集
  
 @Override
	public Person getPerson(String lastName) {
		
		String query = "select personId, personFirstName, personLastName from personTbl where personLastName = ?";
		
		return this.getJdbcTemplate().queryForObject(query, new PersonMapper(), lastName);
		
	}

    

     注意的是,这里用rowmapper方法的话,会自动把查出来的每个行记录集自动添加到List中去的,如果数量太多,比如100万个,则list很大,容易内存溢出;而采用
rowbcallbackhandler的话,则在processrow中获得数据后马上进行处理(比如群发邮件时,马上发送邮件)。
   
4 查询单值数据,典型的有如queryForObject,queryForInt;
  

public int getNumberOfPeople() {
		
		int rowCount = this.getJdbcTemplate().queryForInt("select count(0) from personTbl");
		
		return rowCount;
	}

    

		String firstName = this.getJdbcTemplate().queryForObject(
				"select personFirstName from personTbl where personLastName = ?",
				String.class,
				lastName ) ;



5 NamedParameterJDBCTemplate,这是一个很好用的JDBC模板类,解决的是?号占位符号的麻烦(容易对错位置等)
   例子如下:
  
	String sql = "select count(0) from personTbl where personFirstName = :first_name";

	    SqlParameterSource namedParameters = new MapSqlParameterSource("first_name", firstName);

	    return this.getNamedParameterJdbcTemplate().queryForInt(sql, namedParameters);



     这里可以看到,SQL中的使用:first_name了,并且用MapSqlParameterSource来进行绑定;还有种方法是使用BeanPropertySqlParameterSource;比如:
  
public List<Person> getPerson(Person pe