`

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 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
  
    
  
  
8
2
分享到:
评论
4 楼 mike4166955 2013-04-24  
请问如何使用Spring 3.2.2中的:“在NamedParameterJdbcTemplate中添加了不带参数的查询变式,在DAO中更加便捷”?
3 楼 macrotea 2013-03-31  
spring jdbc 将会越来越人性化
2 楼 jackyrong 2013-03-27  
yes,是的
1 楼 suyulin6688 2013-03-27  
spring 3.3.2?
到这个版本号了?

相关推荐

    Spring攻略(第二版 中文高清版).part1

    13.8 使用Spring的常用测试注解 540 13.8.1 问题 540 13.8.2 解决方案 540 13.8.3 工作原理 541 13.9 小结 542 第14章 Spring Portlet MVC框架 544 14.1 用Spring Portlet MVC开发一个简单的Portlet ...

    Spring攻略(第二版 中文高清版).part2

    13.8 使用Spring的常用测试注解 540 13.8.1 问题 540 13.8.2 解决方案 540 13.8.3 工作原理 541 13.9 小结 542 第14章 Spring Portlet MVC框架 544 14.1 用Spring Portlet MVC开发一个简单的Portlet ...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    一共四个,其中pdf 三个包,源码一个包 第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 ...15.13 小结

    Spring中文帮助文档

    14.5.2. 小结 14.6. 文档视图(PDF/Excel) 14.6.1. 简介 14.6.2. 配置和安装 14.7. JasperReports 14.7.1. 依赖的资源 14.7.2. 配置 14.7.3. 构造ModelAndView 14.7.4. 使用子报表 14.7.5. 配置Exporter的...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    一共四个,其中pdf 三个包,源码一个包 第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 ...15.13 小结

    Spring API

    14.5.2. 小结 14.6. 文档视图(PDF/Excel) 14.6.1. 简介 14.6.2. 配置和安装 14.7. JasperReports 14.7.1. 依赖的资源 14.7.2. 配置 14.7.3. 构造ModelAndView 14.7.4. 使用子报表 14.7.5. 配置Exporter的...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    一共四个,其中pdf 三个包,源码一个包 第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 ...15.13 小结

    Spring Security 2.0.x完全中文参考文档

    小结** 对上述组件的功能进行了简要总结。 - **5.3. 验证** - **5.3.1. ExceptionTranslationFilter** 用于处理认证过程中发生的异常。 - **5.3.2. AuthenticationEntryPoint** 定义了当用户尝试访问受...

    JAVA 模块知识小结

    JAVA模块知识小结涵盖的内容非常广泛,包含了Java技术栈中的多个重要知识点,从基础的开发工具到框架、数据库以及编程语言本身,以下是对给定文件中提到的各项技术的详细知识点梳理: 1. Hibernate和Ibatis ...

    Java Web程序设计教程

    程序设计教程.pdf&gt;&gt;人民邮电出版社的教程哦,所以,好书,你懂的!! 第1章web应用开发简介 1 1.1何为web应用 1 1.1.1web的概念及发展 1 1.1.2web应用程序 2 1.2使用java开发web应用 3 ...本章小结 342

    Spring-data-jpa 学习笔记.docx

    #### 六、本文小结 Spring Data JPA 大大简化了 JPA 的使用方式,使得开发者能够更高效地进行数据访问层的开发。通过遵循约定优于配置的原则,减少了大量模板代码的编写,提高了开发效率。 #### 第二篇 在第二篇...

    JAVA WEB典型模块与项目实战大全

    1.5 小结  第2章 myedipse开发工具对各种框架的支持  2.1 使用jsp的两种模式  2.2 struts框架的实现  2.3 hibernate框架的实现  2.4 jpa框架的实现  2.5 spring框架的实现  2.6 jsf框架的实现  2.7...

    Hbase+Spring boot实战分布式文件存储

    6-2 Phoenix安装 6-3 Phoenix实战:shell命令操作Phoenix 6-4 Phoenix实战:java jdbc操作Phoenix 6-5 通过mybatis操作Phoenix 6-6 通过mybatis操作Phoenix 6-7 Sqoop简介 6-8 Sqoop数据导入实战 6-9 课程小结 ...

    J2EE应用开发详解

    17 2.1 构建开发环境 17 2.1.1 安装JDK 17 2.1.2 安装Tomcat 21 2.1.3 安装Eclipse 23 2.2 配置开发环境 23 2.3 小结 26 第3章 Java的反射机制 27 3.1 Java反射API 27 3.2 加载类的实例 29 3.2.1 加载class对象的两...

    Java SE实践教程 pdf格式电子书 下载(一) 更新

    感谢大家的支持,我终于升级了,上传限制得到提升,所以把资源整合下!希望大家一如既往 Java SE实践教程 pdf格式电子书 下载(一) 更新 ...Java SE实践教程 pdf格式电子书 下载(二) 更新 ...13.4 小结 387

    ANT 基础学习小结

    ### ANT基础学习小结 #### 一、Ant简介与应用场景 Apache Ant 是一个Java环境下的构建工具,主要用于软件编译、测试、部署等自动化任务。它通过XML来定义构建过程,使得开发者能够轻松地管理项目的构建流程。在很...

    JAVA程序开发大全---上半部分

    1.4 本章小结 5 第2章 MyEclipse集成开发环境的使用 6 2.1 MyEclipse集成开发工具界面 6 2.1.1 MyEclipse的菜单栏 7 2.1.2 MyEclipse的工具栏 13 2.1.3 MyEclipse的透视图 14 2.1.4 MyEclipse的视图 17 2.1.5 ...

    《程序天下:J2EE整合详解与典型案例》光盘源码

    第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 1.2.3 业务逻辑组件 1.3 J2EE容器 1.3.1 容器服务 ...15.13 小结

    MyEclipse10使用教程.docx

    本文档主要介绍了 MyEclipse 10 的使用教程,涵盖了 MyEclipse 的基本使用、内存管理、快捷键、编译与调试、JDBC 小结、Hibernate 示例代码、jadclipse 插件安装等内容。 一、MyEclipse 基本使用 MyEclipse 支持 ...

Global site tag (gtag.js) - Google Analytics