package org.nutz.dao.sql;
import java.util.List;
import org.nutz.dao.pager.Pager;
/**
* 封装通过 POJO 生成的 SQL 语句
* <p>
* 各个数据库的处理类通过这个类能获得足够的信息来生产 SQL 语句
*
* @author zozoh(zozohtnt@gmail.com)
*/
public interface Pojo extends DaoStatement {
/**
* 设置语句执行前的操作
*
* @param callback
* 针对 POJO 语句的回调
* @return 自身
*/
Pojo setBefore(PojoCallback callback);
/**
* 设置语句执行后的操作
*
* @param callback
* 针对 POJO 语句的回调
* @return 自身
*/
Pojo setAfter(PojoCallback callback);
/**
* 为 POJO 语句设置分页对象
*
* @param pager
* 分页对象
* @return 自身
*/
Pojo setPager(Pager pager);
/**
* 通过普通Java对象为这个 POJO 语句的 SQL 参数赋值 <br>
* 一个 POJO 实际上是一个 SQL 的语句模板,增加一个 Java 对象,实际上就是增加了一组参数 <br>
* 因此如果你想为 POJO 里附加一个集合或者数组对象,对象必须是同样类型的,否则会出现不可预知的错误
* <p>
* 接口的实现类会根据你给出的对象类型不同,对你的对象做不同的解释,它考虑的方式为:
* <ul>
* <li>集合|数组 : 你打算增加一组对象作为本语句的参数,会为递归调用本函数
* <li>迭带器(Iterator) : 你打算增加一组对象作为本语句的参数,会为递归调用本函数
* <li>Map : 你打算增加一条记录(将键作为字段名)
* <li>Chain : 你打算增加一条记录
* <li>其他 : 你打算增加一条记录(将对象字段作为字段名)
* </ul>
* <p>
* <b style="color:red">注意:</b><br>
* 某些 SQL 语句(比如 CREATE|DROP)即使有参数,也是没有意义的,所以 Pojo 执行器会忽略它们
*
* @param obj
* 普通 Java 对象
*
* @return 自身
*
* @see org.nutz.dao.sql.Pojo#addParamsBy(Object)
*/
Pojo addParamsBy(Object obj);
/**
* @return 语句最后一个参数行的参数对象
*/
Object getLastParams();
/**
* 返回语句的参数表。
*
* @return 语句的参数表
*/
List<Object> params();
/**
* 一个 Pojo 语句正在操作的对象,就是你通过 Dao 接口传入的对象本身。
*
* @return Pojo 正在操作的对象
*/
Object getOperatingObject();
/**
* 设置一个 POJO 正在操作的对象
*
* @param obj
* 正在操作的对象
*/
Pojo setOperatingObject(Object obj);
/**
* 清除已经存储的对象
*
* @return 自身
*/
Pojo clear();
/**
* 为POJO语句增加一个或多个语句元素
*
* @param itemAry
* 语句元素
* @return 自身
*/
Pojo append(PItem... itemAry);
/**
* 在 POJO 所有的语句前插入一组语句元素
*
* @param itemAry
* 语句元素
* @return 自身
*/
Pojo insertFirst(PItem... itemAry);
/**
* 置换 POJO 的一个语句元素
*
* @param index
* 位置下标
* @param pi
* 语句元素
* @return 自身
*/
Pojo setItem(int index, PItem pi);
/**
* 获取 POJO 的一个语句元素
*
* @param index
* 位置下标
* @return 语句元素
*/
PItem getItem(int index);
/**
* 删除 POJO 的一个语句元素
*
* @param index
* 位置下标
* @return 自身
*/
Pojo removeItem(int index);
/**
* 复制一份自己的实例
*
* @return 一份新的自己
*/
Pojo duplicate();
}