当前位置:编程学习 > JAVA >>

Java回调机制,利用回调写的JDBC访问例子

 

首先说说为什么要用到回调这个方式,

    我们在日常生活和工作中,有一种情况是这样的,做一件事,但是这件事中有些步骤是不确定如何做的,但是可以先约定好怎么做.对于程序来说,就是有一段业务,其中有几段小逻辑不确定如何做,但是我们可以先定义好一些方法(统一的参数和返回值)对应这些逻辑, 具体这些逻辑的实现交给具体执行的代码去实现.

    下面举个例子,JDBC 访问,假设我们都用PreparedStatement来处理SQL, 我们都要初始化连接,初始化PreparedStatement,封装PreparedStatement插入SQL参数,执行SQL,获得ResultSet,封装ResultSet成我们要的对象,关闭连接,其中封装PreparedStatement插入SQL参数和封装ResultSet成我们要的对象是不确定的,我们就可以把这2步定义成回调函数,教给具体执行代码去做.

    根据上面说的,我们可以定一个JdbcCallback接口来定义这个回调函数,

 

Java代码 

package com.balance.easycalendar.dao.template; 

 

import java.sql.PreparedStatement; 

import java.sql.ResultSet; 

import java.sql.SQLException; 

import java.util.List; 

 

import com.balance.easycalendar.to.BaseTO; 

 

public inte易做图ce JdbcCallback { 

     

    public List<BaseTO> packResult(ResultSet rs) throws SQLException; 

    public void packParams(PreparedStatement stmt) throws SQLException; 

 

再定义一个JdbcCallbackTemplate来执行具体的方法,其中引用一个JdbcCallback来完成不确定的步骤,

Java代码 

package com.balance.easycalendar.dao.template; 

 

import java.sql.Connection; 

import java.sql.DriverManager; 

import java.sql.PreparedStatement; 

import java.sql.ResultSet; 

import java.util.List; 

 

import com.balance.easycalendar.dao.exception.DAOException; 

import com.balance.easycalendar.to.BaseTO; 

import com.balance.easycalendar.util.MessageProperties; 

 

public class JdbcCallbackTemplate { 

 

    private JdbcCallback temp; 

     

    public void setTemp(JdbcCallback temp) { 

        this.temp = temp; 

    } 

 

    protected String url; 

    protected String username; 

    protected String password; 

    protected String driver; 

     

    private PreparedStatement stmt = null; 

    private Connection con = null; 

     

    public JdbcCallbackTemplate(){ 

        MessageProperties pro = MessageProperties.getInstance("jdbc.properties"); 

         

        url = pro.getValue("db.url"); 

        driver = pro.getValue("db.driver"); 

        username = pro.getValue("db.username"); 

        password = pro.getValue("db.password");  

    } 

     

    public List<BaseTO> query(String sql) throws DAOException{ 

        try{ 

            Class.forName(driver); 

            con = DriverManager.getConnection(url, username, password); 

     

            stmt = con.prepareStatement(sql); 

            temp.packParams(stmt); 

             

            ResultSet rs = stmt.executeQuery(); 

              

            return temp.packResult(rs); 

             

        }catch(Exception e){ 

            throw new DAOException(e); 

        }finally{ 

            try{ 

                stmt.close(); 

                con.close(); 

            }catch(Exception e){ 

                e.printStackTrace(); 

            } 

        } 

    } 

     

    public boolean excute(String sql) throws DAOException{ 

        try{ 

            Class.forName(driver); 

            con = DriverManager.getConnection(url, username, password); 

     

            stmt = con.prepareStatement(sql); 

            temp.packParams(stmt); 

             

            return stmt.execute(); 

             

        }catch(Exception e){ 

            throw new DAOException(e); 

        }finally{ 

            try{ 

                stmt.close(); 

                con.close(); 

            }catch(Exception e){ 

                e.printStackTrace(); 

            } 

        } 

    } 

     

    这个Template定

补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,