- 浏览: 35328 次
- 性别:
- 来自: 合肥
博客专栏
-
我和Java数据库操作的那...
浏览量:9513
最新评论
-
ivanlw:
楼主用的这个snapito好神奇啊……是直接把图片链接设置成他 ...
ibookmark.me上线了! -
succinite:
使用TortoiseGit, 出现以下错误。fatal: ht ...
一个简单的JAVA后台程序框架 -
mazhiyuan:
引用很显然,之前所说的梦想,并非是真正心中所想,而只不过想“找 ...
也谈梦想 -
cevin15:
说到我心里去了。现在处于离职状态。也是对前途一片迷茫~
也谈梦想 -
lwjlaser:
lettoo 写道lwjlaser 写道这篇博客第一个示例代码 ...
我和JAVA数据库操作的那些事儿(3)
引用
半自动化武器来了:Spring JdbcTemplate
经过前面几篇的介绍,对纯JDBC的编程应用应该已经介绍的差不多了,那个感觉就是小米加步枪,虽然实用,但总感觉不爽,现在对现代化的要求越来越高,我们也应该与时俱进了,别急别急,一口吃不了胖子,我们也不要一下子完全自动化了,像Spring提供的JdbcTemplate是个不错的选择。
先来看看Spring对JdbcTemplate的介绍吧:
引用
The JdbcTemplate class is the central class in the JDBC core package. It simplifies the use of JDBC since it
handles the creation and release of resources. This helps to avoid common errors such as forgetting to always
close the connection. It executes the core JDBC workflow like statement creation and execution, leaving
application code to provide SQL and extract results. This class executes SQL queries, update statements or
stored procedure calls, imitating iteration over ResultSets and extraction of returned parameter values. It also
catches JDBC exceptions and translates them to the generic, more informative, exception hierarchy defined in
the org.springframework.dao package.
闲话不多说了,直接上代码吧:
1. 先定义相应的bean
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="org.sqlite.JDBC" /> <property name="url" value="jdbc:sqlite:test.db" /> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource" /> </bean> <bean id="employeeDao" class="cn.lettoo.spring.jdbc.EmployeeDao"> <property name="jdbcTemplate" ref="jdbcTemplate" /> </bean>
2. 写一个IDao的接口,这个接口定义了5个方法:
insert:增加一条记录
delete:删除一条记录,通过记录的id来删除
update:更新一条记录,通过记录的id来更新
select:根据id返回一条记录
selectList:根据condition字符串来返回一批记录
package cn.lettoo.spring.jdbc; import java.util.List; public interface IDao<T> { int insert(T object); int delete(T object); int update(T object); T select(Object id); List<T> selectList(String condition); }
3. 定义一个AbstractDao类,把一些通用的方法,比如set/get JdbcTemplate放进去,这样不需要每个dao子类都去写这些重复的代码了:
package cn.lettoo.spring.jdbc; import org.springframework.jdbc.core.JdbcTemplate; public abstract class AbstractDao<T> implements IDao<T> { protected JdbcTemplate jdbcTemplate; public JdbcTemplate getJdbcTemplate() { return jdbcTemplate; } public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } }
4. 来看看EmployeeDao的实现吧:
package cn.lettoo.spring.jdbc; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import org.springframework.jdbc.core.RowMapper; import cn.lettoo.jdbc.Employee; import cn.lettoo.jdbc.Department; import cn.lettoo.jdbc.SqlParser; public class EmployeeDao extends AbstractDao<Employee> implements IDao<Employee> { public int insert(Employee employee) { String sql = SqlParser.getInstance().getSql("Employee.insert"); Object[] args; if (employee.getDepartment() != null) { args = new Object[] { employee.getId(), employee.getName(), employee.getDepartment().getId(), employee.getDescription() }; } else { args = new Object[] { employee.getId(), employee.getName(), java.sql.Types.NULL, employee.getDescription() }; } return jdbcTemplate.update(sql, args); } public int delete(Employee employee) { String sql = SqlParser.getInstance().getSql("Employee.delete"); return jdbcTemplate.update(sql, new Object[] { employee.getId() }); } public int update(Employee employee) { String sql = SqlParser.getInstance().getSql("Employee.update"); Object[] args; if (employee.getDepartment() != null) { args = new Object[] { employee.getName(), employee.getDepartment().getId(), employee.getDescription(), employee.getId() }; } else { args = new Object[] { employee.getName(), java.sql.Types.NULL, employee.getDescription(), employee.getId() }; } return jdbcTemplate.update(sql, args); } public Employee select(Object id) { String sql = SqlParser.getInstance().getSql("Employee.select.id"); return jdbcTemplate.queryForObject(sql, new Object[]{id}, new EmployeeRowMapper()); } public List<Employee> selectList(String condition) { String sql = SqlParser.getInstance().getSql("Employee.select.condition") + condition; return jdbcTemplate.query(sql, new EmployeeRowMapper()); } private static final class EmployeeRowMapper implements RowMapper { public Employee mapRow(ResultSet rs, int rowNum) throws SQLException { Employee employee = new Employee(); employee.setId(rs.getInt("ID")); employee.setName(rs.getString("NAME")); employee.setDescription(rs.getString("DESCRIPTION")); if (rs.getString("DEPARTMENTID") != null) { Department department = new Department(); department.setId(rs.getInt("DEPARTMENTID")); employee.setDepartment(department); } return employee; } } }
使用JdbcTemplate.query方法来查询,使用JdbcTemplate.update来做增删改,使用JdbcTemplate.execute的方法来执行sql,这些方法的具体的应用,可以参考Spring的官方文档。
使用查询的时候,有一个RowMapper接口的实现,这个接口的mapRow()方法负责将ResultSet查询的数据转到Object上去,毕竟我们还是半自化嘛。对于不同的查询sql和对应的Object,我们只要实现一个RowMapper就可以了。
这里我还是使用老的方法,将sql放在一个文件中,由SqlParser来读取,关于Employee的sql定义如下:
<sql name="Employee.insert"> <content><![CDATA[ INSERT INTO EMPLOYEE(ID, NAME, DEPARTMENTID, DESCRIPTION) VALUES (?, ?, ?, ?) ]]></content> </sql> <sql name="Employee.delete"> <content><![CDATA[ DELETE FROM EMPLOYEE WHERE ID = ? ]]></content> </sql> <sql name="Employee.update"> <content><![CDATA[ UPDATE EMPLOYEE SET NAME=?, DEPARTMENTID=?, DESCRIPTION=? WHERE ID=? ]]></content> </sql> <sql name="Employee.select.id"> <content><![CDATA[ SELECT ID, NAME, DEPARTMENTID, DESCRIPTION FROM EMPLOYEE WHERE ID=? ]]></content> </sql> <sql name="Employee.select.condition"> <content><![CDATA[ SELECT ID, NAME, DEPARTMENTID, DESCRIPTION FROM EMPLOYEE WHERE 1=1 ]]></content> </sql>
发表评论
-
ibookmark.me上线了!
2012-04-10 23:47 1549记得上次是2009年,接触到了python,gae,于是乎动手 ... -
使用virtualenv开发django应用
2012-01-12 11:03 1786Virtualenv是一个非常好的virtual python ... -
在Amazon EC2上试用play framework
2011-11-11 17:00 1421几个月以前,我在 ... -
一个Log生成工具小项目的实现
2011-11-01 17:32 1380这两天的主要工作是用java写一个log生成工具,用于 ... -
自定义log4j生成的log文件名
2011-11-01 13:57 2989很多时候,log4j的RollingFileAppen ... -
我和JAVA数据库操作的那些事儿(4)
2011-10-24 16:21 1500通过前面几篇的介绍,对于JDBC的使用应该基本上够上项目开发的 ... -
我和JAVA数据库操作的那些事儿(3)
2011-10-20 15:35 2536在前面的两篇文章中,第一篇主要是讲了在jdbc编程中容 ... -
我和JAVA数据库操作的那些事儿(2)
2011-10-20 11:15 1580摘要 写道 上一篇提到的几个问题,在本篇有具体的代码。本篇后 ... -
图说事务隔离级别
2011-10-19 21:38 1449我们经常说的事务隔离级别,一般指的是SQL-92 ... -
我和JAVA数据库操作的那些事儿(1)
2011-10-19 15:26 2234摘要 我开始接触jdbc的 ... -
复习:观察者模式
2011-10-17 17:02 1000观察者模式(有时又被称为发布/订阅模式)是软件设计模式 ... -
复习:代理模式
2011-10-17 15:53 747代理模式是常用的Java 设计模式,它的特征是代理类与 ... -
对chainsaw中一个简单Job Scheduler的扩展
2011-10-14 23:36 1073今天在看apache chainsaw这个项目的源代码 ... -
Spring RMI 简单实现
2011-10-14 13:47 1065好久没有写java代码了,最近工作项目上需要做一个 ... -
一道关于树的面试题
2011-10-13 15:31 948记得不久以前有道面试题,要求下面的数据结构 ... -
一个简单的JAVA后台程序框架
2011-10-13 09:31 1786本项目已经通过git进行版本管理,checkout ... -
测试驱动开发:红、绿、重构
2011-10-12 23:01 900在读Ruby on Rails Tutorial: ... -
Spring JMS和ActiveMQ的应用
2011-10-12 22:43 2072笔者近期参与一个分析log的项目。主要流程是:读取Lo ...
相关推荐
在“我和JAVA数据库操作的那些事儿(2)”这篇博文中,作者分享了实际操作的经验和技巧,涵盖了数据库连接、SQL语句执行、结果集处理以及对象模型的构建。 首先,JDBC是Java平台的标准接口,它允许Java应用程序与...
Java程序员在IT行业中占据着重要的地位,他们负责...总的来说,"java程序员的那些事儿"涉及了广泛的知识领域,从编程语言本身到与之相关的框架、工具和最佳实践。不断学习和适应新技术,是Java程序员保持竞争力的关键。
"Java编程那些事儿"无疑是对这个强大语言的深入探讨,旨在帮助开发人员提升技能,拓宽视野。这份资料可能是由一系列章节或主题组成的文档,比如基础语法、面向对象编程、异常处理、集合框架、多线程、IO流、网络编程...
在这个压缩包中,包含的文件名为“java那些事儿.chm”。 Java,作为世界上最流行的编程语言之一,拥有广泛的应用领域,从企业级应用到移动开发,无处不在。这个CHM文档很可能是对Java基础知识、进阶概念、实战技巧...
本篇文章将深入探讨如何使用Java实现一个数据库连接池,并分析其中的关键技术和步骤。 首先,我们需要理解数据库连接池的基本工作原理。数据库连接池在初始化时会创建一定数量的数据库连接,这些连接在空闲时会被池...
在这个压缩包中,我们有两份重要的文件:《Java编程那些事儿》的PDF文档以及两个与软件下载相关的文本和URL。 首先,让我们聚焦于核心的《Java编程那些事儿》PDF文档。这份资料可能包含了Java语言的基础概念,如...
### Java程序员上班那些事儿 #### 一、求职者与企业之间的认知差异 ##### 1.1 应聘者的自我定位问题 - **高大全式的技能列表**:许多求职者在简历上罗列了大量的技能,从传统编程语言如C++、VB,到现代技术如Java...
本压缩包文件“关于Java和Python爬虫那些事儿.zip”可能包含与使用Java和Python这两种语言进行网络爬虫相关的教程、代码示例或资源。尽管描述中只提到了“python”,但标题暗示了内容可能涵盖两种语言。 首先,让...
5. **团队合作**:良好的沟通能力和团队协作精神。 6. **项目经验**:参与过实际项目的开发。 这些要求反映了当前市场上对于高级Java开发人员的需求标准,不仅要求掌握核心编程技能,还强调了跨领域的知识积累以及...
- **操作系统管理**:具备Linux系统操作能力,同时对Solaris等其他操作系统有一定了解。 - **网络通信**:掌握网络基础知识,能够进行基本的网络调试与维护工作。 - **图形处理与多媒体**:了解OpenGL、DirectX等...
- **企业需求特点**:企业的招聘要求相对集中,如Java编程经验、MySQL数据库使用、Linux操作系统熟练等。这反映了企业在招聘时更加注重特定领域的深度而不是广度。 **求职者的自我认知与定位** - **明确职业定位**...
12. **数据库操作**:了解SQL语言,熟悉常用的数据库如MySQL、Oracle,以及JDBC(Java数据库连接)API,能够进行数据的增删改查操作。 13. **网络编程**:理解TCP/IP协议,能够使用Socket进行网络通信,为构建...
根据给定的信息,“Java程序员上班那点事儿”这一标题与描述指向了关于Java程序员日常工作的一些常见情况、挑战或趣事等内容。尽管提供的具体内容部分没有直接给出相关知识点,但结合标题和描述,我们可以围绕Java...
这是一个很好的起点,适合那些希望深入理解Java Swing库和数据库操作的初学者。 首先,让我们详细了解Java GUI。Java Swing库提供了大量的组件,用于构建用户界面,如按钮(JButton)、文本框(JTextField)、表格...
本文将深入探讨如何在Java中读取和操作`properties`配置文件。 1. **什么是Properties文件** `properties`文件是一种文本文件,其内容遵循特定的语法,主要用于存储程序的配置信息,如数据库连接字符串、应用设置...