38 JdbcTemplate+JdbcDaoSupport实

作者: 笑Skr人啊 | 来源:发表于2017-08-25 16:50 被阅读19次

在Spring JDBC开发中,可以使用 JdbcTemplate 和 JdbcDaoSupport 类来简化整个数据库的操作过程。
在本教程中,我们将重复上一篇文章 Spring+JDBC例子,看之前(无JdbcTemplate支持)和之后(含JdbcTemplate的支持)之间不同的例子。

学习此章前,请先引入将下面jar包引入到项目中

Paste_Image.png

1. 不使用JdbcTemplate示例

如果不用JdbcTemplate,必须创建大量的冗余代码(创建连接,关闭连接,处理异常)中的所有DAO数据库的操作方法 - 插入,更新和删除。它的效率并不是很高,容易出错和乏味。

private DataSource dataSource;
        
    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }
        
    public void insert(Customer customer){
            
        String sql = "INSERT INTO CUSTOMER " +
                "(CUST_ID, NAME, AGE) VALUES (?, ?, ?)";
        Connection conn = null;
            
        try {
            conn = dataSource.getConnection();
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setInt(1, customer.getCustId());
            ps.setString(2, customer.getName());
            ps.setInt(3, customer.getAge());
            ps.executeUpdate();
            ps.close();
                
        } catch (SQLException e) {
            throw new RuntimeException(e);
                
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {}
            }
        }
    }

2. 使用JdbcTemplate示例

使用JdbcTemplate可节省大量的冗余代码,因为JdbcTemplate类会自动处理它。


package com.gp6.jdbc.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.springframework.jdbc.core.JdbcTemplate;


import com.gp6.jdbc.bean.Customer;
import com.gp6.jdbc.dao.CustomerDAO;

public class CustomerDAOImpl implements CustomerDAO {
    private DataSource dataSource;
    private JdbcTemplate jdbcTemplate;
    
    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }
    
    public void insert(Customer customer){
        
        String sql = "INSERT INTO CUSTOMER " +
            "(CUST_ID, NAME, AGE) VALUES (?, ?, ?)";
                 
        jdbcTemplate = new JdbcTemplate(dataSource);
                
        jdbcTemplate.update(sql, new Object[] { customer.getCustId(),
            customer.getName(),customer.getAge()  
        });
                
    }
} 

看看有什么不同?

3. 使用JdbcDaoSupport示例

通过扩展 JdbcDaoSupport,设置数据源,并且 JdbcTemplate 在你的类中不再是必需的,只需要正确的数据源注入JdbcCustomerDAO。可以使用 getJdbcTemplate()方法得到 JdbcTemplate。

package com.gp6.jdbc.daoSource.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.support.JdbcDaoSupport;


import com.gp6.jdbc.noTemplate.bean.Customer;
import com.gp6.jdbc.noTemplate.dao.CustomerDAO;

public class CustomerDAOImpl extends JdbcDaoSupport implements CustomerDAO {
    private DataSource dataSource;
    
    //no need to set datasource here
    public void insert(Customer customer){
        String sql = "INSERT INTO CUSTOMER " +
            "(CUST_ID, NAME, AGE) VALUES (?, ?, ?)";
        
        //使用DataSource不需要下面这行代码,使用Template需要
        //jdbcTemplate = new JdbcTemplate(dataSource);
                    
        getJdbcTemplate().update(sql, new Object[] { customer.getCustId(),
                customer.getName(),customer.getAge()  
        });
    }
        
    public Customer findByCustomerId(int custId){
        
        String sql = "SELECT * FROM CUSTOMER WHERE CUST_ID = ?";
        
        Connection conn = null;
        
        try {
            conn = dataSource.getConnection();
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setInt(1, custId);
            Customer customer = null;
            ResultSet rs = ps.executeQuery();
            if (rs.next()) {
                customer = new Customer(rs.getInt("CUST_ID"),rs.getString("NAME"), rs.getInt("Age"));
            }
            rs.close();
            ps.close();
            return customer;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            if (conn != null) {
                try {
                conn.close();
                } catch (SQLException e) {}
            }
        }
    }
}


注: 在Spring JDBC开发,它总是建议使用,总是建议使用 JdbcTemplate和JdbcDaoSupport,而不使用自己的JDBC编程代码。

相关文章

网友评论

    本文标题:38 JdbcTemplate+JdbcDaoSupport实

    本文链接:https://www.haomeiwen.com/subject/mstpdxtx.html