简介
访问数据库的方式有很多种,最简单原始的方式无非是通过java jdbc库去直接访问。这种方式实现的代码很冗长,而且要考虑的东西比较多,比如建立数据库连接、执行sql语句、获取结果并解析、关闭连接。这种传统方式带来的一个问题就是,我们也许仅仅为了执行一个简单的sql语句却需要一大堆冗长的代码,而且每执行一条语句都要重复这些代码。于是一种当然的想法就是如何将这些冗余的部分给提取出来使得我们的代码里只关注具体业务的方面。正是基于这个想法,spring提供了jdbc数据访问的模板。在本文中针对这两种数据访问的方式进行比较和总结。
数据库访问的传统方式
先来看看一个典型的传统jdbc数据库访问示例:
private static final String SQL_INSERT_SPITTER = "insert into spitter (username, password, fullname) values (?, ?, ?)"; private DataSource dataSource; public void addSpitter(Spitter spitter) { Connection conn = null; PreparedStatement stmt = null; try { //获取connection conn = dataSource.getConnection(); //创建执行语句 stmt = conn.prepareStatement(SQL_INSERT_SPITTER); //绑定执行参数 stmt.setString(1, spitter.getUsername()); stmt.setString(2, spitter.getPassword()); stmt.setString(3, spitter.getFullName()); //执行sql语句 stmt.execute(); } catch (SQLException e) { //处理异常情况 } finally { try { //关闭连接资源 if (stmt != null) { stmt.close(); } if (conn != null) { conn.close(); } } catch (SQLException e) { } } }
上面代码是一个执行插入数据到数据库表中的操作,其实其中最核心的部分仅仅是这么一个insert语句。而要实现真正执行这个语句的效果,这里却需要做一大堆的事情,比如建立连接、创建执行语句、执行sql语句、处理异常情况以及关闭连接资源等。在每个需要执行的语句里都要穿插这么多冗余代码的话,肯定不合理,需要一种方法将它们精简。
除了这些,在上述的代码里,其实还存在着一些其他的问题。比如说出现异常的地方我们该怎么处理呢?因为可能出现异常的情况比较多,是连接不上数据库了,还是sql语句执行错误呢?这些在传统的这种做法里没法区分。
改进
上面给出的那个示例并没有完整的代码。仅仅是这一部分我们就已经看到传统方式的不足了。 既然要改进的话,看到那些代码就已经有一个初步的思路了。上面的思路用一种伪码来描述的话如下:
Connection connection = createConnection(); Statement statement = createStatement(); statement = bindParameters(); execute(statement); closeconnection();
其中最核心的部分其实就是绑定参数和执行sql语句,其他部分对于其他的语句来说也是通用的。我们完全可以将它们作为一个公共父类的一部分提取出来。这种方式有点像下图的思路:
这样,在父类里我们定义好了createConnection, closeConnection以及handleException的大致框架。而在具体实现类比如SplitterDAO里实现具体的createStatement, bindParameters就可以了。如果我们对设计模式的一些套路比较熟悉的话已经知道这种思路无非就是template method。
正式因为有这么一个思路,spring里面已经提供了典型的实现给我们使用。最常见的就是JdbcTemplate。
spring JDBC template
如果使用spring JdbcTemplate实现上面示例的代码,一个简单对应的实现则如下:
public void insertSpitter(Spitter spitter) { jdbcTemplate.update(INSERT_SPITTER, spitter.getUsername(), spitter.getPassword(), spitter.getFullName(), spitter.getEmail(), spitter.isUpdateByEmail()); } private static final String INSERT_SPITTER = "insert into Spitter (username, password, fullname, email, updateByEmail) values (?, ?, ?, ?, ?)";
从上述的代码中可以看到,上述代码中我们只需要首先创建必须的sql语句,然后在代码里将必须的参数绑定,剩下的就交给JdbcTemplate来处理。
既然JdbcTemplate可以解决这么多的问题,我们接着对这部分再深入了解一下。在spring中最常用的两个JdbcTemplate分别是JdbcTemplate和NamedParameterJdbcTemplate。其中JdbcTemplate提供最基础的数据访问和基于参数索引方式的查询。而NamedParameterJdbcTemplate可以将参数名绑定到sql语句中。在典型代码示例里如下:
private static final String CREATE_SQL = "insert into contact (last_name, first_name, mi, email) values (:lastName, :firstName, :mi, :email)"; public void createContact(Contact contact) { SqlParameterSource params = new MapSqlParameterSource() .addValue("lastName", contact.getLastName()) .addValue("firstName", contact.getFirstName()) .addValue("mi", contact.getMiddleInitial()) .addValue("email", contact.getEmail()); KeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTemplate.update(CREATE_SQL, params, keyHolder); contact.setId(keyHolder.getKey().longValue()); }
在上述的示例代码里定义的sql语句有点不一样,前面的对应参数位置是用?来代替,这样如果我们需要映射到对应参数实现的时候还需要去查表格。而这边的语句里直接映射了一个名字,并在后面用MapSqlParameterSource()来将名字和对应的实体成员关联起来。这种方式显得更加直观一些。该示例的详细实现可以参看后面的附件。
总结
使用传统jdbc的方式过于冗长而且容易出错,而spring jdbcTemplate提供的这种模板方法的方式其实就是基于template method的模式将那些恼人的细节隐藏了起来,使得使用者只需要关心具体业务逻辑。关于它们具体实现的细节会在后续的文章中深入讨论。
参考材料
相关推荐
标题“Spring基础:数据访问(1)”涉及到的是Spring框架中关于数据访问的初步知识,这通常涵盖Spring如何管理和集成各种数据存储技术,如...通过学习这些内容,开发者能够更好地理解和运用Spring框架进行数据访问操作。
Spring Data JDBC与JDBC是两种不同的数据库访问方式,它们在Java开发中有着广泛的应用。JDBC(Java Database Connectivity)是Java平台的标准API,用于与各种数据库进行交互。它提供了低级别的数据库操作,如建立...
在实际使用中,Spring JDBC通常与Spring的其他模块结合,如Spring ORM(Object-Relational Mapping)和Spring AOP(Aspect-Oriented Programming),以提供更完整的数据访问解决方案。例如,Hibernate或MyBatis可以...
《Spring JDBC:构建高效数据访问层》 Spring JDBC是Spring框架的一个重要组成部分,它提供了一种简化传统JDBC编程的抽象层,使得开发者能够更轻松、更安全地处理数据库交互。"spring-jdbc jar包"包含了Spring框架...
在本篇“Spring基础:数据访问(2)”中,我们将深入探讨Spring框架如何支持和管理数据访问,特别是在Java应用程序中的数据库交互。Spring以其强大的依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-...
首先,Spring提供了多种数据访问接口,包括JdbcTemplate、SimpleJdbcInsert、NamedParameterJdbcTemplate等,它们是对JDBC的封装,简化了数据库操作。JdbcTemplate是Spring提供的最基础的数据访问工具,通过模板方法...
同时,还可以参考网络资源,如“史上最全最强SpringMVC详细示例实战教程”和“SpringMVC + Spring + SpringJDBC整合”的文档,学习如何创建基于Maven的Web项目,以及如何在IDEA中添加和管理jar包。 总之,SpringMVC...
在实际应用中,结合Spring的其他模块,如MyBatis-Spring或Hibernate-Spring,可以构建出强大的数据访问层。通过使用`JdbcTemplate`,开发人员可以从繁琐的JDBC代码中解脱出来,专注于业务逻辑,提高开发效率,同时...
Spring对Java数据库连接(JDBC)的支持是通过其Spring JDBC模块来实现的,该模块提供了一组JDBC相关的抽象以及数据访问模板,使得开发者可以更加便捷地使用JDBC进行数据库操作。 JdbcTemplate是Spring JDBC模块中...
- 在数据访问层中,使用Spring JDBC的JdbcTemplate或NamedParameterJdbcTemplate来执行SQL语句。 - 在Service层,通过AOP实现事务管理,确保数据一致性。 - 编写Controller,接收并处理HTTP请求,调用Service层...
Spring JDBC是Spring提供的数据访问层,它简化了JDBC操作,消除了手动管理连接、准备语句和结果集等繁琐任务。通过使用Spring JDBC,开发者可以专注于SQL语句的编写,而无需关注底层的数据库交互细节。它支持事务...
总结起来,JDBC数据访问对象学习资料将引导你理解如何在MVC架构中使用JDBC进行数据访问层的封装,包括DAO设计模式的应用,JDBC的基本操作流程,以及如何在实际项目中优化和提升数据访问的效率。通过学习,你将能够更...
1. MyBatis集成:Spring JDBC与MyBatis结合,可以利用MyBatis的动态SQL和映射文件,进一步简化数据访问。 2. Hibernate集成:Spring也可以与ORM框架如Hibernate配合,提供更高级别的对象关系映射。 六、实战案例 在...
这使得开发者能够更专注于业务逻辑,而不是繁琐的数据访问层实现。Spring JDBC不仅包含了JDBC的基本功能,如数据源配置、事务管理,还引入了模板模式,即JdbcTemplate,进一步降低了数据库操作的复杂性。 ...
这个“SpringJDBC.rar”压缩包文件可能包含了关于如何在Spring框架中集成和使用JDBC的相关示例和教程。下面将详细解释Spring JDBC的核心概念、功能以及使用方法。 首先,Spring JDBC的核心目标是简化传统的JDBC编程...
Spring Data是Spring生态系统的一部分,它极大地简化了数据访问层的开发。Spring Data支持多种数据存储,包括JPA、MongoDB等。通过`@RepositoryDefinition`或`@EnableJpaRepositories`,Spring Data可以自动生成...
通过这个SpringJDBC.rar的案例,初学者可以学习到如何配置DataSource,如何创建JdbcTemplate实例,以及如何编写和执行SQL语句。同时,实践中还可以了解到如何将Spring JDBC整合到Spring Boot项目中,以及如何处理...
启动 Spring Boot 应用程序,访问 `/test` 端点,如果一切正常,应该可以看到 "Database connection successful! Result: 1" 的响应结果。 小结 通过以上步骤,我们成功地使用 Spring Boot 连接了 Oracle 数据库,...
当我们谈论"Spring+JDBC实例"时,通常是指在Spring框架中使用JDBC进行数据访问的方式,这种方式可以利用Spring提供的便利性,同时保留对数据库的直接控制。 在Spring框架中,JDBC操作被封装在`org.springframework....