java之回调函数-机制示例2


前面简单介绍一下 java之回调函数-机制示例1 ,现在再写一个简单的例子,以便熟悉它。这个例子以Spring中的HibernateTemplate和JpaTemplate中的回调函数为模板的。


第一步:先预定义的协议接口:

package com.callBack.test;

import java.sql.SQLException;

public interface  SQLCallBack {
	 public Object execute(Query query) throws SQLException;
}


第二步:实现行为

package com.callBack.test;

import java.sql.SQLException;

public class QueryStringSQLCallBack implements SQLCallBack {

	private String sql ;
	
	public QueryStringSQLCallBack(String sql){
		this.sql = sql;
	}
	public Object execute(Query query) throws SQLException {
		// do something...
		return query.executeSQL(query.createQuery(this.sql));
	}
}

第三步:多加一个 Query 类


package com.callBack.test;

public class Query {
	// Query 类 
	public Query(){
	}
	
	private StringBuffer sql = new StringBuffer();
	
	public Query createQuery(String sql){
		// do something... 应该从容器中获得 Manager类,这里是样例
		this.sql.append(sql);
		return this;
	}
	
	public String getQuerySQL(){
		return this.sql.toString();
	}
	
	public void close(){
		// do something...如清理工作
		sql = new StringBuffer();
	}
	
	public Object executeSQL(Query query){
		// do something...
		System.out.println("****  1执行SQL: "+this.sql.toString());
		return "1执行SQL返回结果";
	}
	
	public Object executeSQL(){
		// do something...
		System.out.println("****  2执行SQL: "+this.sql.toString());
		return "2执行SQL返回结果";
	}
	
	public void setParams(String name,String valeu){
		sql = new StringBuffer(sql.toString().replaceAll(":"+name, "'"+valeu+"'"));
	}
	
	public void setParams(String name,int value){
		sql = new StringBuffer(sql.toString().replaceAll(":"+name, String.valueOf(value)));
	}
}

第四步:还加了一个DAO类

package com.callBack.test;

import java.sql.SQLException;
import java.util.Map;

public class DaoTemplate {
	
	private Query query ;
	
	public void setQuery(Query query){
		this.query = query;
	}
	
	public Query getQuery(){
		return this.query;
	}
	
	public Object queryList(final String sql) throws SQLException{
		return execute(new QueryStringSQLCallBack(sql));
	}
	
	public Object find(final String sql, final Map<String,?> params) throws SQLException {
		return execute(new SQLCallBack(){
			public Object execute(Query query) throws SQLException {
				System.out.println("*** 执行回调函数 *** ");
				query.createQuery(sql);
				for(Object key:params.keySet()){
					query.setParams((String)key, params.get(key).toString());
				}
				return query.executeSQL();
			}
		});
	}
	
	public Object execute(SQLCallBack action) throws SQLException{
		System.out.println("*** begin *** ");
		// 这里可以做一些准备...
		// get**ManagerFactory().getQuery();
		Query q = getQuery(); // 如上面行所示,这里是样例
		if(null == q ){
			q = new Query();
		}
		Object obj = action.execute(q);
		// 这里可以做后续的清理..
		q.close();
		System.out.println("*** end *** ");
		return obj;
	}
}

第五步:测试类

package com.callBack.test;

import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

public class Client {
	public static void main(String[] args) throws SQLException {
		test1();
		test2();
	}
	public static void test1() throws SQLException{
		DaoTemplate dao = new DaoTemplate();
		Map map = new HashMap();
		map.put("username", "yoyo");
		Object result = dao.find("select u.username from user u where u.username = :username ", map );
		System.out.println(result);
	}
	
	public static void test2() throws SQLException{
		DaoTemplate dao = new DaoTemplate();
		Map map = new HashMap();
		Object result = dao.queryList("select u.age from user u where u.age = 18 " );
		System.out.println(result);
	}
}

完整代码全在此了,运行Client 类,结果:

*** begin *** 
*** 执行回调函数 *** 
****  2执行SQL: select u.username from user u where u.username = 'yoyo' 
*** end *** 
2执行SQL返回结果
*** begin *** 
****  1执行SQL: select u.age from user u where u.age = 18 
*** end *** 
1执行SQL返回结果


以上便是以回调函数写的查询SQL,只供学习和参考,到这里你应该明白了回函数的用法和意义了。








  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值