有了前面的基础,这里看看这这个框架下怎么开发程序。
这是一个简单的查询,通过构建Query对象,并增加查询条件,最后调用Business实现查询,结果存储在RetInfo中。
SynchroLogQryAction属于业务层,负责完成查询,如果需要,还可以实现其它功能。
SynchroLogQryBusiness负责查询,其实可以不要,后来实现了一个通用的SimpleQueryBusiness,作为示例程序,现在这样更清晰。
SynchroLogAccess是数据结构定义,由于id是自增id,所以多了一个insert方法,当然也可以不要,那样开发人员自己设置好id。后来这个类也改进了,Access类都不要了,通过配置文件或者数据库自动生成,而配置文件或数据库的来源是直接从数据库导出。
这是AccessManager的自动生成方法。
/**
* 构建一个Access
* @param request Request,用于权限认证
* @param name 表名
* @return Access
* @throws java.lang.Exception
*/
public BaseAccess getAccess(Request request,String name) throws Exception
下面是3个类的源程序
/**
* <p>同步监控信息查询</p>
* @author lws
*/
public class SynchroLogQryAction extends BaseAction
{
/**
* <p>Business 实现基础类的抽象方法,完成查询的组织</p>
* @param request 封装的请求
* @return BaseForward
* @throws java.lang.Exception
*/
public BaseForward operate(Request request) throws Exception{
//由于还没有做查询条件,所以进入页面时reqfrompage为空,若为空,则设其等于qryItem。
if(request.getParameter("reqfrompage") == null)
{
return new BaseForward("SUCCESS");
}
if(request.getParameter("reqfrompage").equals("qryItem"))
{
String OrderClause = request.getString("OrderClause");
if(OrderClause == null)
{
OrderClause = "order by SHL_EndTime desc";
request.setOrderBy(OrderClause);
}
String Date_start = request.getString("Date_start");
String Date_end = request.getString("Date_end");
String SendReceive = request.getString("SendReceive");
Query query = new Query(request);
query.clearWhere();
if(Date_start != null)
{
query.addStringOperate("SHL_BeginTime",">=",Date_start);
}
if(Date_end != null)
{
query.addStringOperate("SHL_EndTime","<=",Date_end);
}
if(SendReceive != null)
{
query.addEqualInt("SHL_SendReceive",SendReceive);
}
request.setWhere(query.getSetPageWhere());
request.setQuery(query);
RetInfo retInfo = new SynchroLogQryBusiness().business(request);
request.setReturnObject(retInfo);
return new BaseForward("SUCCESS");
}
if(request.getParameter("reqfrompage").equals("orderby"))
{
operateOrderBy(request,new SynchroLogQryBusiness());
return new BaseForward("SUCCESS");
}
// 不应该发生
return new BaseForward("SUCCESS");
}
}
/**
* <p>同步监控信息查询</p>
* @author lws
*/
public class SynchroLogQryBusiness extends QueryBusiness
{
/**
* <p>实现基本的查询方法
* @param ds 数据库连接
* @param request Request,包含需要的全部参数
* @return 查询结果
* @throws java.lang.Exception
*/
public RetInfo business(DataSource ds,Request request) throws Exception{
Query query = (Query) request.getQuery(getName());
SynchroLogAccess qryAccess = new SynchroLogAccess();
query.setAccess(qryAccess);
RetInfo retInfo = query.query(ds);
return retInfo;
}
}
/**
* 同步日志的Access
* @author lws
*/
public class SynchroLogAccess extends BaseAccess0 {
/**
* 定义对应的数据库表
* @return 对应的数据库表名
*/
public String getTable() {
return "CRT_SynchroLog";
}
/**
* 定义对应的数据库表的结构
* @return 对应的数据库表的结构
*/
public FieldGroup getFieldGroup() {
FieldGroup fieldGroup = new FieldGroup();
fieldGroup.addField(new Field("SHL_ID", Type.INT_TYPE)); // id 长度16
fieldGroup.addField(new Field("SHL_SendReceive", Type.INT_TYPE)); // 长度1
//fieldGroup.addField(new Field("SHL_Type", Value.INT_TYPE)); // 统计类型 长度8
fieldGroup.addField(new Field("SHL_BeginTime", Type.STRING_TYPE)); // 统计开始时间 长度24
fieldGroup.addField(new Field("SHL_EndTime", Type.STRING_TYPE)); // 统计结束时间 长度24
fieldGroup.addField(new Field("SHL_Delay", Type.INT_TYPE)); // 延迟时间 长度16
fieldGroup.addField(new Field("SHL_SetMaxNum", Type.INT_TYPE)); // 设置的最大数 长度16
fieldGroup.addField(new Field("SHL_Times", Type.INT_TYPE)); // 同步次数 长度16
fieldGroup.addField(new Field("SHL_Time", Type.INT_TYPE)); // 同步时间 长度16
fieldGroup.addField(new Field("SHL_SQLNumbers", Type.INT_TYPE)); // 同步sql命令数 长度16
fieldGroup.addField(new Field("SHL_MaxTimes", Type.INT_TYPE)); // 满负同步次数 长度16
fieldGroup.addField(new Field("SHL_MaxTime", Type.INT_TYPE)); // 满负同步时间 长度16
fieldGroup.addField(new Field("SHL_MaxSQLNumbers", Type.INT_TYPE)); // 满负同步sql命令数 长度16
fieldGroup.addField(new Field("SHL_MinTimes", Type.INT_TYPE)); // 0同步次数 长度16
fieldGroup.addField(new Field("SHL_MinTime", Type.INT_TYPE)); // 0同步时间 长度16
fieldGroup.addField(new Field("SHL_ReceiveSQL", Type.INT_TYPE)); // 接收的sql数 长度16
fieldGroup.addField(new Field("SHL_SkipReceiveSQL", Type.INT_TYPE)); // 无效的sql数 长度16
return fieldGroup;
}
static private int autoIndex = 0;
/**
* 相关字段在记录中的位置
*/
final public static int ID = autoIndex++;
final public static int SHL_SendReceive = autoIndex++;
final public static int SHL_BeginTime = autoIndex++;
//省略了其它的位置定义
/**
* 插入数据,完成id的生成
* @param ds 数据库连接, 调用方法应创建连接,不能为空
* @param record 要插入的记录
* @throws java.lang.Exception
*/
protected void insert(DataSource ds, Record record) throws Exception {
Integer id = IdentityManager.getIdentity(getTable());
record.set(ID, id);
super.insertRecord(ds, record);
}
}
如果你仔细看了这3个类,如果觉得有想法或者疑问,欢迎你和我交流。如果你见多识广,希望你继续关注其它内容,同时真心希望你能提出建议,搞了这么多年,虽然挺有收获,但总觉得自己了解的面太窄,所以就拿来晒晒,希望这样的交流对双方都能有所帮助。