`
dyllove98
  • 浏览: 1414754 次
  • 性别: Icon_minigender_1
  • 来自: 济南
博客专栏
73a48ce3-d397-3b94-9f5d-49eb2ab017ab
Eclipse Rcp/R...
浏览量:39311
4322ac12-0ba9-3ac3-a3cf-b2f587fdfd3f
项目管理checkList...
浏览量:80480
4fb6ad91-52a6-307a-9e4f-816b4a7ce416
哲理故事与管理之道
浏览量:133594
社区版块
存档分类
最新评论

持久层封装之JdbcTemplate

阅读更多
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数据持久层操作封装

    Java中的JdbcTemplate...通过以上内容,我们可以了解到JdbcTemplate如何简化了Java与MySQL数据库的交互,并在实际项目中实现高效的数据持久层操作封装。正确理解和使用JdbcTemplate能显著提高开发效率,降低出错概率。

    Spring的MVC Web应用中的持久层技术

    JdbcTemplate作为Spring框架提供的一种轻量级的数据库访问工具,是实现持久层操作的重要手段。本文将深入探讨JdbcTemplate的基本概念、核心功能以及如何在实际项目中使用。 **一、JdbcTemplate简介** JdbcTemplate...

    Spring--JdbcTemplate.pdf

    JdbcTemplate是Spring中常用的持久层技术之一,它支持Spring的声明式事务管理,能够与Spring的其他框架组件无缝整合。 描述中提到的"一图详解(脑图)"意味着文档中可能包含了一个清晰的图示,这个图示将详细展示...

    spring mvc注解jdbctemplate

    在实际项目中,我们还可以结合Spring Data JPA或者MyBatis等更高级的持久层框架,进一步提升开发效率和代码质量。但无论选择哪种方式,理解并掌握JdbcTemplate的基本用法都是Spring MVC开发中的必备技能。

    Spring持久层(PDF)

    事务管理是Spring持久层的关键特性之一,它提供了两种事务管理方式: 1. **编程式事务管理**:开发者需在代码中显式地管理事务的开启、提交和回滚,适用于需要精细控制事务边界的情况。 2. **声明式事务管理**:...

    JdbcTemplate操作总结

    在实际开发中,我们通常会将JdbcTemplate与DAO(Data Access Object)层结合使用,创建特定业务的DAO接口和实现。接口定义了业务操作,实现类则通过JdbcTemplate调用对应的方法。例如: ```java public interface ...

    SpringMvc+jdbcTemplate+mysql(注解)

    @RequestMapping用于映射HTTP请求到特定的方法,@Service和@Repository注解标记服务和数据访问层的类,@Autowired自动注入依赖,而@SqlResultSetMapping和@NamedNativeQuery则用于JdbcTemplate的复杂查询结果映射。...

    Spring + Hibernate + JdbcTemplate

    Spring的JdbcTemplate是轻量级的数据访问抽象层,它是Spring对JDBC的一个封装,简化了数据库操作。它提供了一组模板方法来执行SQL语句,如插入、更新、删除和查询。JdbcTemplate通过异常转换和事务管理,帮助开发者...

    day01_eesy_01mybatis.zip

    3.持久层的技术解决方案 JDBC技术: Connection PreparedStatement ResultSet Spring的JdbcTemplate: Spring中对jdbc的简单封装 Apache的DBUtils: 它和Spring的JdbcTemplate很想,也是对Jdbc的简单...

    mybatis01_入门案例

    例如,MyBatis是一个专门针对持久层操作的框架,它简化了Java应用与数据库之间的交互。 二、使用框架的优势 框架的主要好处在于提高了开发效率。它通过封装底层的复杂细节(如数据库连接管理、SQL执行等),使得...

    这是一个可以和spring 整合的db 封装

    "这是一个可以和spring整合的db封装"这个标题暗示了我们正在处理一个与Spring框架集成的数据库访问层组件。这个组件可能是为了方便开发者在Spring环境中更高效、更简洁地操作数据库。 描述中提到的"db封装"通常指的...

    Spring持久化模板总结

    Spring提供了多种持久化模板,如JdbcTemplate和HibernateTemplate,以简化数据库操作并减少代码中的样板代码。这两个模板都是Spring JDBC模块的一部分,用于增强对SQL数据库的访问能力。本文将深入探讨Spring对...

    基于spring+mybatis+redis 封装的高易用性的框架.zip

    其次,MyBatis是一个轻量级的持久层框架,它将SQL语句与Java代码解耦,通过XML或注解的方式配置映射,使得数据库操作更为直观和灵活。在Spring+MyBatis的集成中,Spring管理MyBatis的SqlSessionFactory和SqlSession...

    spring,springMVC,Hibernate全注解案例加dao的封装

    在IT行业中,Spring、SpringMVC和Hibernate是Java企业级应用开发中的三大核心框架,它们分别专注于依赖注入、Web MVC层以及持久层操作。在这个全注解案例中,我们将探讨如何利用这三大框架进行高效、简洁的开发,...

    springboot-jdbctemplete.rar

    《Spring Boot中的JdbcTemplate详解与实战》 在Java Web开发领域,Spring Boot以其简洁的配置、强大的...在实际项目中,可以根据需求选择JdbcTemplate或是更高级的JPA、MyBatis等持久层框架,以达到最佳的开发效果。

    dwzteam-dwz_code_generator-master_java_

    【描述】描述中提到,dwz_code_generator支持多种常用的持久层框架,包括Hibernate、MyBatis以及Spring JDBC。这意味着它能够根据数据库模型自动生成与这些框架兼容的Java代码。使用FreeMarker模板引擎,开发者还...

    neo开发框架

    NEO框架基于典型的Java Web应用分层架构,即表现层、控制层、业务逻辑层和数据持久层,分别采用了Freemarker、Struts2、Spring Framework和Spring JdbcTemplate等技术。 - **表现层**:由Freemarker负责,这是一种...

    Spring和Struts教程

    Spring 是一个全面的企业级应用框架,提供了依赖注入(DI)、面向切面编程(AOP)、事务管理以及数据持久层的支持。而Struts 是一个MVC框架,主要用于处理Web应用中的请求分发和视图渲染。 **Spring+Struts 模式的 ...

    4.Spring-Tx銆丼pring5.pdf

    - **依赖注入支持**:Spring框架支持依赖注入,这意味着JdbcTemplate实例可以作为依赖项被注入到服务层的类中,提高了代码的模块化和测试性。 - **异常处理**:JdbcTemplate将数据库访问中可能出现的异常转换为...

    PageBean分页查询

    例如,在Spring框架中,可以使用JdbcTemplate或者MyBatis等持久层工具,通过传递PageBean对象的当前页和每页大小来定制SQL查询: ```java public PageBean<User> getUserByPage(int currentPage, int pageSize) { ...

Global site tag (gtag.js) - Google Analytics