简介
访问数据库的方式有很多种,最简单原始的方式无非是通过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的模式将那些恼人的细节隐藏了起来,使得使用者只需要关心具体业务逻辑。关于它们具体实现的细节会在后续的文章中深入讨论。
参考材料
相关推荐
这个jar 文件包含对Spring 对JDBC 数据访问进行封装的所有类
这个jar文件包含对Spring对JDBC数据访问进行封装的所有类。
Spring JdbcTemplate的解析 针对数据库的操作,Spring框架提供了JdbcTemplate类,该类是Spring框架数据抽象层的基础。可以说,JdbcTemplate类是Spring JDBC的核心类。 接口JdbcOperations 抽象类JdbcAccessor 核心...
spring 数据连接范例 (jdbc)
* Spring DAO:对JDBC的抽象,简化了数据访问异常的处理; * Spring ORM:对现有的ORM框架的支持; * Spring Web:提供了基本的面向Web的综合特性,例如多方文件上传; * Spring MVC:提供面向Web应用的Model-View-...
spring-jdbc-4.0.0.RELEASE.jar这个jar文件包含对Spring对JDBC数据访问进行封装的所有类。
SingleJDBCBase 是基于Spring Framework基础上搭建的一个Java基础开发套件,以Spring MVC为模型视图控制器,JDBC为数据访问层。 * 核心框架:Spring Framework 4.2.7 * 安全框架: * 视图框架:Spring MVC 4.2.7 * ...
spring jdbc Templatetest 访问mysql数据库,批量插入数据
NULL 博文链接:https://kingxss.iteye.com/blog/1479451
使用JDBC进行数据访问【springframwork】定义.pdf
MiniDAO是一个基于SpringJDBC和FreeMarker技术的轻量级Java持久层框架。它以简洁的设计理念实现了SQL的分离和逻辑标签功能,与Mybatis的操作体验相媲美,同时能够无缝集成至Spring Boot项目。 技术构成: - 主要...
数据访问:介绍了Spring框架对数据库访问的支持,包括JDBC、ORM框架、事务管理等。 测试和调试:介绍了如何使用Spring进行单元测试和集成测试,以及调试技巧和工具的使用。 这本资源适合已经具备一定Spring基础知识...
基于Java 通用数据访问组件,基于mybatis、spring jdbc、hibernate
│ 07 数据访问:如何使用 JdbcTemplate 访问关系型数据库?.mp4 │ 13 服务调用:如何正确理解 RetTemplate 远程调用实现原理?.mp4 │ 20 服务监控:如何使用 Actuator 组件实现系统监控?.mp4 │ 22 运行管理...
开发一个基本的spring Application所需要用到的最小包: spring-beans.jar,spring-core....使用基本数据访问,持久化工具等数据功能所用到得包: spring-aop.jar,spring-jdbc.jar, spring-orm.jar, spring-tx.jar
创建一个java工程,名为springJDBC,包和类组织如下图所示。 测试资源文件夹放配置文件业务层具体业务逻辑(登录、注册、选课等等)领域对象放实体类持久层负责数据的访问和操作 测试 资源文件夹 放配置文件 业务层 ...
Uncode-DAL是 Java 通用数据访问组件,基于mybatis、spring jdbc、hibernate等ORM框架开发,同时支持基于多数据源的读写分离、主备切换、故障转移,自动恢复、负载均衡、缓存等。可以大大提高开发速度
4.数据访问及集成(1)spring-JDBC:JDBC的支持,主要是提供JDBC模板方式、关系数据库对象化方式、Simple JDBC方式、事务管理来简化JD
spring-jdbc.jar(必须) :这个jar 文件包含对Spring 对JDBC 数据访问进行封装的所有类。 外部依赖spring-beans,spring-dao。 spring-web.jar(必须) :这个jar 文件包含Web 应用开发时,用到Spring 框架时所需...