前面简单介绍一下 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,只供学习和参考,到这里你应该明白了回函数的用法和意义了。