首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

spring 三 jdbc常用小结

2013-03-28 
spring 3 jdbc常用小结spring 3的jdbc跟spring mvc搭配起来挺好用的,本文试着小结其主要使用方法,并举出sp

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

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

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


  配置文件:
   <bean id="jdbcTemplate"
      name="code">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处理结果集
  
 @Overridepublic 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 personSkeleton) {SqlParameterSource namedParameters = new BeanPropertySqlParameterSource(personSkeleton);List<Person> people = this.getNamedParameterJdbcTemplate().query(    "select personID, personFirstName, personLastName from personTbl " +     " where personLastName = :personLastName and personFirstName = :personFirstName",        namedParameters,        new PersonMapper()        );

    
    这里其实就是参数整个javabean传进来,其中:personLastName,personFirstName都必须是javabean中的属性,这样才能一一匹配;
  还有一个就是simplejdbctemplate,例子如下:

  
   public void addPerson(Person newPerson) {SimpleJdbcInsert insertPerson = new SimpleJdbcInsert(this.getDataSource())     .withTableName("personTbl").usingGeneratedKeyColumns("personID");        Map<String, Object> parameters = new HashMap<String, Object>(3);        parameters.put("personFirstName", newPerson.getPersonFirstName() );        parameters.put("personLastName", newPerson.getPersonLastName() );        insertPerson.execute(parameters);}

   也是很简单容易理解吧。

下面提及下最新的spring jdbc 3.2.2中,
queryForInt("select count(0) from personTbl")

这个写法换了,换成:
  queryForObject("select count(0) from personTbl", Integer.class)
详细的更换和丢弃的方法见:
http://static.springsource.org/spring/docs/3.2.x/javadoc-api/deprecated-list.html
  
    
  
   1 楼 suyulin6688 3 小时前   spring 3.3.2?
到这个版本号了? 2 楼 jackyrong 3 分钟前   yes,是的

热点排行