`
lettoo
  • 浏览: 35328 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
博客专栏
58ccff5b-5ca6-387a-9c99-a277f31a9e51
我和Java数据库操作的那...
浏览量:9513
社区版块
存档分类
最新评论

我和java操作数据库那些事儿(5)

阅读更多
引用

半自动化武器来了: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>
分享到:
评论

相关推荐

    我和JAVA数据库操作的那些事儿(2)

    在“我和JAVA数据库操作的那些事儿(2)”这篇博文中,作者分享了实际操作的经验和技巧,涵盖了数据库连接、SQL语句执行、结果集处理以及对象模型的构建。 首先,JDBC是Java平台的标准接口,它允许Java应用程序与...

    java程序员的那些事儿

    Java程序员在IT行业中占据着重要的地位,他们负责...总的来说,"java程序员的那些事儿"涉及了广泛的知识领域,从编程语言本身到与之相关的框架、工具和最佳实践。不断学习和适应新技术,是Java程序员保持竞争力的关键。

    Java编程那些事儿

    "Java编程那些事儿"无疑是对这个强大语言的深入探讨,旨在帮助开发人员提升技能,拓宽视野。这份资料可能是由一系列章节或主题组成的文档,比如基础语法、面向对象编程、异常处理、集合框架、多线程、IO流、网络编程...

    java那些事儿chm

    在这个压缩包中,包含的文件名为“java那些事儿.chm”。 Java,作为世界上最流行的编程语言之一,拥有广泛的应用领域,从企业级应用到移动开发,无处不在。这个CHM文档很可能是对Java基础知识、进阶概念、实战技巧...

    数据库连接池的实现java

    本篇文章将深入探讨如何使用Java实现一个数据库连接池,并分析其中的关键技术和步骤。 首先,我们需要理解数据库连接池的基本工作原理。数据库连接池在初始化时会创建一定数量的数据库连接,这些连接在空闲时会被池...

    java那些事儿

    在这个压缩包中,我们有两份重要的文件:《Java编程那些事儿》的PDF文档以及两个与软件下载相关的文本和URL。 首先,让我们聚焦于核心的《Java编程那些事儿》PDF文档。这份资料可能包含了Java语言的基础概念,如...

    java程序员上班那些事儿.pdf

    ### Java程序员上班那些事儿 #### 一、求职者与企业之间的认知差异 ##### 1.1 应聘者的自我定位问题 - **高大全式的技能列表**:许多求职者在简历上罗列了大量的技能,从传统编程语言如C++、VB,到现代技术如Java...

    关于Java和Python爬虫那些事儿.zip

    本压缩包文件“关于Java和Python爬虫那些事儿.zip”可能包含与使用Java和Python这两种语言进行网络爬虫相关的教程、代码示例或资源。尽管描述中只提到了“python”,但标题暗示了内容可能涵盖两种语言。 首先,让...

    Java程序员上班那点事儿txt版本

    5. **团队合作**:良好的沟通能力和团队协作精神。 6. **项目经验**:参与过实际项目的开发。 这些要求反映了当前市场上对于高级Java开发人员的需求标准,不仅要求掌握核心编程技能,还强调了跨领域的知识积累以及...

    Java程序员上班那点事儿.txt

    - **操作系统管理**:具备Linux系统操作能力,同时对Solaris等其他操作系统有一定了解。 - **网络通信**:掌握网络基础知识,能够进行基本的网络调试与维护工作。 - **图形处理与多媒体**:了解OpenGL、DirectX等...

    Java程序员 上班那点事儿.pdf

    - **企业需求特点**:企业的招聘要求相对集中,如Java编程经验、MySQL数据库使用、Linux操作系统熟练等。这反映了企业在招聘时更加注重特定领域的深度而不是广度。 **求职者的自我认知与定位** - **明确职业定位**...

    Java程序员上班那点事儿

    12. **数据库操作**:了解SQL语言,熟悉常用的数据库如MySQL、Oracle,以及JDBC(Java数据库连接)API,能够进行数据的增删改查操作。 13. **网络编程**:理解TCP/IP协议,能够使用Socket进行网络通信,为构建...

    java程序员上班那点事儿

    根据给定的信息,“Java程序员上班那点事儿”这一标题与描述指向了关于Java程序员日常工作的一些常见情况、挑战或趣事等内容。尽管提供的具体内容部分没有直接给出相关知识点,但结合标题和描述,我们可以围绕Java...

    Java gui简单程序

    这是一个很好的起点,适合那些希望深入理解Java Swing库和数据库操作的初学者。 首先,让我们详细了解Java GUI。Java Swing库提供了大量的组件,用于构建用户界面,如按钮(JButton)、文本框(JTextField)、表格...

    Java那些事儿之(一)读取property配置文件

    本文将深入探讨如何在Java中读取和操作`properties`配置文件。 1. **什么是Properties文件** `properties`文件是一种文本文件,其内容遵循特定的语法,主要用于存储程序的配置信息,如数据库连接字符串、应用设置...

Global site tag (gtag.js) - Google Analytics