Spring对JDBC进行了良好的封装,通过提供相应的模板和辅助类,在相当程度上降低了JDBC操作的复杂性。并且得益于Spring良好的隔离设计,JDBC封装类库可以脱离Spring Context独立使用,也就是说,即使系统并没有采用Spring作为结构性框架,我们也可以单独使用Spring的JDBC部分(spring-dao.jar)来改善我们的代码。
作为对比,首先让我们来看一段传统的JDBC代码:
Connection conn =null;
Statement stmt = null;
try {
conn = dataSource.getConnection();
stmt = con.createStatement();
stmt.executeUpdate("UPDATE user SET age = 18 WHERE id = 'erica'");
} finally {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException ex) {
logger.warn("Exception in closing JDBC Statement", ex);
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException ex) {
logger.warn("Exception in closing JDBC Connection", ex);
}
}
}
类似上面的代码非常常见。为了执行一个SQL语句,我们必须编写22行代码,而其中21行与应用逻辑并无关联,并且,这样的代码还会在系统其他地方(也许是每个需要数据库访问的地方)重复出现。于是,大家开始寻找一些设计模式以改进如此的设计,Template模式的应用是其中一种典型的改进方案。Spring的JDBC封装,很大一部分就是借助Template模式实现,它提供了一个优秀的JDBC模板库,借助这个工具,我们可以简单有效的对传统的JDBC编码方式加以改进。下面是借助Spring JDBC Template修改过的代码,这段代码完成了与上面代码相同的功能。
可以看到,两行代码完成了上面需要19行代码实现的功能。所有冗余的代码都通过合理的抽象汇集到了JdbcTemplate中。无需感叹,借助Template模式,我们大致也能实现这样一个模板,不过,Spring的设计者已经提前完成了这一步骤。org.springframework.jdbc.core.JdbcTemplate中包含了这个模板实现的代码,经过Spring设计小组精心设计,这个实现可以算的上是模板应用的典范。特别是回调(CallBack)的使用,使得整个模板结构清晰高效。值得一读。
Tips:实际开发中,可以将代码中硬编码的SQL语句作为Bean的一个String类型属性,借助DI机制在配置文件中定义,从而实现SQL的参数化配置。
再对上面的例子进行一些改进,通过PrepareStatement执行update操作以避免SQLInjection 漏洞:
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate
.update(
"UPDATE user SET age = ? WHERE id = ?",
new PreparedStatementSetter() {
public void setValues(PreparedStatementSetter ps)
throws SQLException {
ps.setInt(1, 18);
ps.setString(2, "erica");
}
}
);
可以看到,上面引用了update方法的另一个版本,传入的参数有两个,第一个用于创建PreparedStatement的SQL。第二个参数是为PreparedStatement设定参数的PreparedStatementSetter。第二个参数的使用方法比较独到,我们动态新建了一个PreparedStatementSetter类,并实现了这个抽象类的setValues方法。之后将这个类的引用作为参数传递给update。update接受参数之后,即可调用第二个参数提供的方法完成PreparedStatement的初始化。Spring JDBC Template中大量使用了这样的Callback机制,这带来了极强的灵活性和扩展性。
上面演示了update方法的使用(同样的操作适用于update、insert、delete)。下面是一个查询的示例。
final List userList = new ArrayList();
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate
.query(
"SELECT name, sex, address FROM user WHERE age > 18",
new RowCallbackHandler() {
public void processRow(ResultSet rs) throws SQLException {
User user = new User();
user.setId(rs.getString("name"));
user.setSex(rs.getString("sex"));
user.setAddress(rs.getString("address"));
userList.add(product);
}
});
这里传入query方法的有两个参数,第一个是Select查询语句,第二个是一个RowCallbackHandler实例,我们通过RowCallbackHandler对Select语句得到的每行记录进行解析,并为其创建一个User数据对象。实现了手动的OR映射。
此外,我们还可以通过JdbcTemplate.call方法调用存储过程。
分享到:
相关推荐
Java中的JdbcTemplate...通过以上内容,我们可以了解到JdbcTemplate如何简化了Java与MySQL数据库的交互,并在实际项目中实现高效的数据持久层操作封装。正确理解和使用JdbcTemplate能显著提高开发效率,降低出错概率。
JdbcTemplate作为Spring框架提供的一种轻量级的数据库访问工具,是实现持久层操作的重要手段。本文将深入探讨JdbcTemplate的基本概念、核心功能以及如何在实际项目中使用。 **一、JdbcTemplate简介** JdbcTemplate...
JdbcTemplate是Spring中常用的持久层技术之一,它支持Spring的声明式事务管理,能够与Spring的其他框架组件无缝整合。 描述中提到的"一图详解(脑图)"意味着文档中可能包含了一个清晰的图示,这个图示将详细展示...
在实际项目中,我们还可以结合Spring Data JPA或者MyBatis等更高级的持久层框架,进一步提升开发效率和代码质量。但无论选择哪种方式,理解并掌握JdbcTemplate的基本用法都是Spring MVC开发中的必备技能。
事务管理是Spring持久层的关键特性之一,它提供了两种事务管理方式: 1. **编程式事务管理**:开发者需在代码中显式地管理事务的开启、提交和回滚,适用于需要精细控制事务边界的情况。 2. **声明式事务管理**:...
在实际开发中,我们通常会将JdbcTemplate与DAO(Data Access Object)层结合使用,创建特定业务的DAO接口和实现。接口定义了业务操作,实现类则通过JdbcTemplate调用对应的方法。例如: ```java public interface ...
@RequestMapping用于映射HTTP请求到特定的方法,@Service和@Repository注解标记服务和数据访问层的类,@Autowired自动注入依赖,而@SqlResultSetMapping和@NamedNativeQuery则用于JdbcTemplate的复杂查询结果映射。...
Spring的JdbcTemplate是轻量级的数据访问抽象层,它是Spring对JDBC的一个封装,简化了数据库操作。它提供了一组模板方法来执行SQL语句,如插入、更新、删除和查询。JdbcTemplate通过异常转换和事务管理,帮助开发者...
3.持久层的技术解决方案 JDBC技术: Connection PreparedStatement ResultSet Spring的JdbcTemplate: Spring中对jdbc的简单封装 Apache的DBUtils: 它和Spring的JdbcTemplate很想,也是对Jdbc的简单...
例如,MyBatis是一个专门针对持久层操作的框架,它简化了Java应用与数据库之间的交互。 二、使用框架的优势 框架的主要好处在于提高了开发效率。它通过封装底层的复杂细节(如数据库连接管理、SQL执行等),使得...
"这是一个可以和spring整合的db封装"这个标题暗示了我们正在处理一个与Spring框架集成的数据库访问层组件。这个组件可能是为了方便开发者在Spring环境中更高效、更简洁地操作数据库。 描述中提到的"db封装"通常指的...
Spring提供了多种持久化模板,如JdbcTemplate和HibernateTemplate,以简化数据库操作并减少代码中的样板代码。这两个模板都是Spring JDBC模块的一部分,用于增强对SQL数据库的访问能力。本文将深入探讨Spring对...
其次,MyBatis是一个轻量级的持久层框架,它将SQL语句与Java代码解耦,通过XML或注解的方式配置映射,使得数据库操作更为直观和灵活。在Spring+MyBatis的集成中,Spring管理MyBatis的SqlSessionFactory和SqlSession...
在IT行业中,Spring、SpringMVC和Hibernate是Java企业级应用开发中的三大核心框架,它们分别专注于依赖注入、Web MVC层以及持久层操作。在这个全注解案例中,我们将探讨如何利用这三大框架进行高效、简洁的开发,...
《Spring Boot中的JdbcTemplate详解与实战》 在Java Web开发领域,Spring Boot以其简洁的配置、强大的...在实际项目中,可以根据需求选择JdbcTemplate或是更高级的JPA、MyBatis等持久层框架,以达到最佳的开发效果。
【描述】描述中提到,dwz_code_generator支持多种常用的持久层框架,包括Hibernate、MyBatis以及Spring JDBC。这意味着它能够根据数据库模型自动生成与这些框架兼容的Java代码。使用FreeMarker模板引擎,开发者还...
NEO框架基于典型的Java Web应用分层架构,即表现层、控制层、业务逻辑层和数据持久层,分别采用了Freemarker、Struts2、Spring Framework和Spring JdbcTemplate等技术。 - **表现层**:由Freemarker负责,这是一种...
Spring 是一个全面的企业级应用框架,提供了依赖注入(DI)、面向切面编程(AOP)、事务管理以及数据持久层的支持。而Struts 是一个MVC框架,主要用于处理Web应用中的请求分发和视图渲染。 **Spring+Struts 模式的 ...
- **依赖注入支持**:Spring框架支持依赖注入,这意味着JdbcTemplate实例可以作为依赖项被注入到服务层的类中,提高了代码的模块化和测试性。 - **异常处理**:JdbcTemplate将数据库访问中可能出现的异常转换为...
例如,在Spring框架中,可以使用JdbcTemplate或者MyBatis等持久层工具,通过传递PageBean对象的当前页和每页大小来定制SQL查询: ```java public PageBean<User> getUserByPage(int currentPage, int pageSize) { ...