- 浏览: 17366 次
- 性别:
- 来自: 南京
文章分类
最新评论
Spring JDBC通过模板和回调机制大大降低了使用JDBC的难度,以一种更直接,更间接的方式使API用户不用去关心资源获取,Statement创建,异常处理,资源释放等繁杂而乏味的工作,只需要去做那些必不可少的事。
以下例子都是基于Derby数据库的,这个数据库是JDK自带的,无需另外安装。
1.Spring-Jdbc初步
在Maven Project中使用JdbcTemplate的话,除了在POM的依赖中加上JDBC Driver,还要使用DataSource,有很多开源的数据库连接池,比如Commons-Pool,C3P0,我们在第一步中使用了Spring自带的DriverManagerDataSource。
****需要特别注意的是,在Derby中以编程的方式建立的数据库,默认是在APP这个Schema下面的
2.Spring风格的JDBC
我们来配置一个Spring风格的Dao类
首先我们来写一个Respository类
注意,需要使用@Repository自动注入
然后我们在xml中进行配置
这里我们使用类${}的占位符,所以还需要额外配置一个属性文件
我们来写一段代码测试一下吧
然后打开derby控制台,发现已经这张t_user表已经被成功创建了。
3.基本的数据库操作
3.1 更改数据
更新或者新增都是用update方法,这个时候PreparedStatement会根据参数类型猜测对应的数据库字段类型,当然我们也可以指定数据库字段类型。
我们还可以使用PreparedStatementSetter回调方法
注意,这里的参数是final修饰符
还有一种PreparedStatementCreator回调方法,可以手工创建PreparedStatement对象
当然,我们在写入操作的时候,如果需要取得子增长主键的值,该怎么做呢?
注意,一定要在创建PreparedStatement的时候加上Statement.RETURN_GENERATED_KEYS,否则即使加上KeyHolder也是不会获得子增长列的
复合主键的情况,可以使用getKeys,如果是新增多条记录,返回了多个主键,则需要使用getKeyList方法。
3.2 批量更新数据
批量更新数据更加效率,也更加的节省数据库资源
注意:getBatchSize方法是整个集合的元素个数,而不是每一批次的元素个数
3.3 查询
查询单条元素
查询多条数据,使用List集合保存
另外,查询多条数据还可以使用RowMapper<T>来进行
RowMapper<T>和RowCallbackHandler相比,RowMapper是将集合整个返回,所以如果查询结果很大的话会很占内存。RowCallbackHandler可以一条条结果处理。
查询单值
还有queryForXXX等一整套函数,主要是用来返回单值结果。
以下例子都是基于Derby数据库的,这个数据库是JDK自带的,无需另外安装。
1.Spring-Jdbc初步
在Maven Project中使用JdbcTemplate的话,除了在POM的依赖中加上JDBC Driver,还要使用DataSource,有很多开源的数据库连接池,比如Commons-Pool,C3P0,我们在第一步中使用了Spring自带的DriverManagerDataSource。
DriverManagerDataSource ds = new DriverManagerDataSource(); ds.setDriverClassName("org.apache.derby.jdbc.ClientDriver"); ds.setUrl("jdbc:derby://localhost:1527/sampledb_jdbc;create=true"); JdbcTemplate jdbcTemplate = new JdbcTemplate(); jdbcTemplate.setDataSource(ds); String sql = "create table t_user(" + "user_id int generated by default as identity" + ",user_name varchar(60)" + ",constraint PK_T_USER primary key(user_id))"; jdbcTemplate.execute(sql);
****需要特别注意的是,在Derby中以编程的方式建立的数据库,默认是在APP这个Schema下面的
2.Spring风格的JDBC
我们来配置一个Spring风格的Dao类
首先我们来写一个Respository类
@Repository public class ForumDao { @Autowired private JdbcTemplate jdbcTemplate; public void initDb() { String sql = "create table t_user(" + "user_id int generated by default as identity" + ",user_name varchar(60)" + ",constraint PK_T_USER primary key(user_id))"; jdbcTemplate.execute(sql); } }
注意,需要使用@Repository自动注入
然后我们在xml中进行配置
<context:property-placeholder location="classpath:jdbc.properties"/> <context:component-scan base-package="com.firethewhole.maventest09.dao"/> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}"/> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" p:dataSource-ref="dataSource"/>
这里我们使用类${}的占位符,所以还需要额外配置一个属性文件
jdbc.driverClassName=org.apache.derby.jdbc.ClientDriver jdbc.url=jdbc:derby://localhost:1527/sampledb_jdbc;create=true
我们来写一段代码测试一下吧
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:applicationContext.xml" }) public class ForumDaoTest { @Autowired private ForumDao forumDao; @Test public void testInitDb() { forumDao.initDb(); } }
然后打开derby控制台,发现已经这张t_user表已经被成功创建了。
3.基本的数据库操作
3.1 更改数据
public void addForum(Forum forum) { String sql = "INSERT INTO t_forum(forum_name,forum_desc) VALUES(?,?)"; jdbcTemplate.update(sql, forum.getForumName(), forum.getForumDesc()); }
更新或者新增都是用update方法,这个时候PreparedStatement会根据参数类型猜测对应的数据库字段类型,当然我们也可以指定数据库字段类型。
public void addForum(Forum forum) { final String sql = "INSERT INTO t_forum(forum_name,forum_desc) VALUES(?,?)"; Object[] params = new Object[] { forum.getForumName(), forum.getForumDesc() }; jdbcTemplate.update(sql, params, new int[] { Types.VARCHAR, Types.VARCHAR }); }
我们还可以使用PreparedStatementSetter回调方法
public void addForum(final Forum forum) { String sql = "INSERT INTO t_forum(forum_name,forum_desc) VALUES(?,?)"; jdbcTemplate.update(sql, new PreparedStatementSetter() { public void setValues(PreparedStatement ps) throws SQLException { // 这里需要forum为final ps.setString(1, forum.getForumName()); ps.setString(2, forum.getForumDesc()); } }); }
注意,这里的参数是final修饰符
还有一种PreparedStatementCreator回调方法,可以手工创建PreparedStatement对象
public void addForum(final Forum forum) { final String sql = "INSERT INTO t_forum(forum_name,forum_desc) VALUES(?,?)"; jdbcTemplate.update(new PreparedStatementCreator() { public PreparedStatement createPreparedStatement(Connection con) throws SQLException { // 这里需要sql为final PreparedStatement ps = con.prepareStatement(sql); ps.setString(1, forum.getForumName()); ps.setString(2, forum.getForumDesc()); return ps; } }); }
当然,我们在写入操作的时候,如果需要取得子增长主键的值,该怎么做呢?
DriverManagerDataSource ds = new DriverManagerDataSource(); ds.setDriverClassName("org.apache.derby.jdbc.ClientDriver"); ds.setUrl("jdbc:derby://localhost:1527/sampledb_jdbc"); final String sql = "insert into t_user1(user_name) values(?)"; JdbcTemplate jdbcTemplate = new JdbcTemplate(); jdbcTemplate.setDataSource(ds); KeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTemplate.update(new PreparedStatementCreator() { public PreparedStatement createPreparedStatement(Connection con) throws SQLException { PreparedStatement ps = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); ps.setString(1, "admin"); return ps; } }, keyHolder); if (keyHolder.getKey() != null) System.out.println(keyHolder.getKey().intValue());
注意,一定要在创建PreparedStatement的时候加上Statement.RETURN_GENERATED_KEYS,否则即使加上KeyHolder也是不会获得子增长列的
复合主键的情况,可以使用getKeys,如果是新增多条记录,返回了多个主键,则需要使用getKeyList方法。
3.2 批量更新数据
批量更新数据更加效率,也更加的节省数据库资源
public void addForums(final List<Forum> forums) { final String sql = "INSERT INTO t_forum(forum_name,forum_desc) VALUES(?,?)"; jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() { public void setValues(PreparedStatement ps, int i) throws SQLException { Forum forum = forums.get(i); ps.setString(1, forum.getForumName()); ps.setString(2, forum.getForumDesc()); } public int getBatchSize() { return forums.size(); } }); }
注意:getBatchSize方法是整个集合的元素个数,而不是每一批次的元素个数
3.3 查询
查询单条元素
public Forum getForum(final int forumId) { String sql = "SELECT forum_name,forum_desc FROM t_forum WHERE forum_id=?"; final Forum forum = new Forum(); jdbcTemplate.query(sql, new Object[] { forumId }, new RowCallbackHandler() { public void processRow(ResultSet rs) throws SQLException { forum.setForumName(rs.getString("forum_name")); forum.setForumDesc(rs.getString("forum_desc")); forum.setForumId(forumId); } }); return forum; }
查询多条数据,使用List集合保存
public List<Forum> getForums(final int forumId, final int told) { String sql = "SELECT forum_id,forum_name,forum_desc FROM t_forum WHERE forum_id BETWEEN ? AND ?"; final List<Forum> forums = new ArrayList<Forum>(); jdbcTemplate.query(sql, new Object[] { forumId, told }, 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<T>来进行
public List<Forum> getForumsRowMapper(final int forumId, final int told) { String sql = "SELECT forum_id,forum_name,forum_desc FROM t_forum WHERE forum_id BETWEEN ? AND ?"; return jdbcTemplate.query(sql, new Object[] { forumId, told }, new RowMapper<Forum>() { public Forum mapRow(ResultSet rs, int rowNum) throws SQLException { Forum forum = new Forum(); forum.setForumId(rs.getInt("forum_id")); forum.setForumName(rs.getString("forum_name")); forum.setForumDesc(rs.getString("forum_desc")); return forum; } }); }
RowMapper<T>和RowCallbackHandler相比,RowMapper是将集合整个返回,所以如果查询结果很大的话会很占内存。RowCallbackHandler可以一条条结果处理。
查询单值
public int getForumNum() { String sql = "SELECT COUNT(*) FROM t_forum"; return jdbcTemplate.queryForInt(sql); }
还有queryForXXX等一整套函数,主要是用来返回单值结果。
- maventest09.zip (25.3 KB)
- 下载次数: 0
发表评论
-
Spring基础:数据访问(3)
2017-01-15 09:29 440在开源世界里,有很多ORM框架使用,比如Hibernate,还 ... -
Spring基础:数据访问(2)
2016-12-31 10:55 532上一篇主要将了Spring JDB ... -
Spring基础:AOP编程(5)
2016-11-30 07:35 380基于Schema的AOP编程 基于AspectJ的AOP编程已 ... -
Spring基础:AOP编程(4)
2016-11-27 12:17 413基于AspectJ的AOP编程 AspectJ的切点函数非常 ... -
Spring基础:AOP编程(3)
2016-11-19 10:44 381基于切面的AOP编程 通过Advice,可以创建方法前,后, ... -
Spring基础:AOP编程(2)
2016-11-15 23:40 411基于ProxyFactory的AOP编程 Spring只支持 ... -
Spring基础:AOP编程(1)
2016-11-14 01:08 416Java编程中的代理 Spring以IoC为基础,发展了另外 ... -
Spring基础:IoC容器(2)
2016-11-12 10:00 448容器注入类型 最常见的注入类型是字面值注入,像String和 ... -
Spring基础:IoC容器(1)
2016-11-10 08:15 405在IoC容器中装配Bean 4.1.2.RELEASE版本的 ... -
Spring基础:稍显复杂的Spring Hello World
2016-11-01 00:59 387本文参考《Spring 3.x企业应用开发》这本书完成,作为自 ... -
使用Eclipse创建基于Maven Web工程
2016-06-06 19:19 449第一步:创建一个maven-webapp类型的工程 完 ...
相关推荐
在本篇“Spring基础:数据访问(2)”中,我们将深入探讨Spring框架如何支持和管理数据访问,特别是在Java应用程序中的数据库交互。Spring以其强大的依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-...
这篇博文“Spring基础:数据访问(3)”很可能是系列教程的一部分,主要探讨了Spring在数据访问层的一些关键概念和技术。由于具体的内容没有直接提供,我会基于常规的Spring数据访问实践来详细讲解这一主题。 首先,...
综上所述,Spring框架提供了丰富的数据访问工具和策略,无论是在传统的JDBC基础上,还是通过ORM或JPA,都能有效地进行数据库操作。理解和掌握这些知识点,将有助于提升你在开发中的效率和代码质量。
* Bean:Spring中的Bean是指一个 Java对象,Bean可以是任何类型的对象,例如数据访问对象、业务逻辑对象等。 * 依赖关系:Spring中的依赖关系是指Bean之间的关系,依赖关系可以是单向的或双向的。 * Context:Spring...
Spring基础:学习Spring框架的核心概念,如IoC容器、Bean的生命周期、依赖注入等。 2. 深入学习Spring框架 Spring Boot:学习Spring Boot,它简化了Spring应用的初始搭建以及开发过程。 Spring MVC:掌握Spring MVC...
Spring Framework 是一个功能强大且...Spring DAO: 提供对数据访问的支持。 Spring ORM: 支持与 ORM 工具集成,如 Hibernate。 Spring Web: 提供基础 Web 应用支持。 Spring MVC: 提供 Model-View-Controller 实现。
3. **数据访问抽象层**:Spring提供了对各种持久化技术的支持,如JDBC、Hibernate等,并提供了一套统一的数据访问异常层次结构。 4. **事务管理**:Spring提供了声明式事务管理功能,使得事务管理变得更加简单易用。...
《Spring数据访问策略详解》 在Java开发领域,Spring框架以其强大的功能和灵活性深受开发者喜爱。其中,数据访问策略是Spring的重要组成部分,它为开发者提供了多种处理数据存储和检索的方法。本文将深入探讨Spring...
Spring的核心特性包括:DI、AOP、数据访问/集成、Web框架、交易管理、模型-视图-控制器(MVC)等。 二、4.3.9.RELEASE版本亮点 1. **依赖注入**:Spring 4.3.9.RELEASE在DI方面进一步优化,支持构造器注入、setter...
数据访问:介绍了Spring框架对数据库访问的支持,包括JDBC、ORM框架、事务管理等。 测试和调试:介绍了如何使用Spring进行单元测试和集成测试,以及调试技巧和工具的使用。 这本资源适合已经具备一定Spring基础知识...
标题“spring2跨数据源访问”涉及到的是Spring框架在处理多数据源情况下的技术要点,主要涵盖如何在Spring应用中实现对多个数据库的灵活访问。在这个主题中,我们通常会讨论以下几个关键知识点: 1. **多数据源配置...
* Spring DAO:对JDBC的抽象,简化了数据访问异常的处理; * Spring ORM:对现有的ORM框架的支持; * Spring Web:提供了基本的面向Web的综合特性,例如多方文件上传; * Spring MVC:提供面向Web应用的Model-View-...
3. **数据访问**:Spring提供了对各种数据访问技术的支持,如JDBC、ORM(Object-Relational Mapping)框架如Hibernate和MyBatis。`spring-jdbc.jar`是Spring对JDBC的抽象层,简化了数据库操作。`spring-orm.jar`则为...
通过阅读《Spring基础教程.pdf》,你可以了解到Spring框架的详细用法,包括基本配置、Bean的声明和管理、AOP的实现、数据访问等。而《99java.com.txt》可能是某个网站的链接或教程索引,可以作为进一步学习Spring和...
4. **数据访问**:Spring支持多种数据访问技术,如JDBC、Hibernate、MyBatis等。它提供了事务管理,使得在不同数据访问技术之间进行切换变得简单。 5. **MVC框架**:Spring MVC是Spring提供的用于构建Web应用程序的...
SingleJDBCBase 是基于Spring Framework基础上搭建的一个Java基础开发套件,以Spring MVC为模型视图控制器,JDBC为数据访问层。 * 核心框架:Spring Framework 4.2.7 * 安全框架: * 视图框架:Spring MVC 4.2.7 * ...
- `org.springframework:spring-dao:jar:2.0.8:compile`:数据访问抽象层支持。 - `org.springframework:spring-web:jar:2.0.8:compile`:Web支持。 - `org.springframework:spring-beans:jar:2.0.8:compile`:...
Spring Data Access Object(DAO)框架是Spring生态体系中用于数据库交互的重要部分,它简化了数据访问层的实现,使得开发者可以更专注于业务逻辑,而不是底层数据库操作。本文将深入探讨Spring DAO框架的入门知识,...