package org.nutz.dao.sql;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.nutz.dao.entity.Entity;
import org.nutz.dao.jdbc.ValueAdaptor;
import org.nutz.dao.pager.Pager;
/**
* 抽象 Dao 语句
* <p>
* 向调用者隔离了 Pojo 和 自定义 Sql 两种方式的差异
*
* @author zozoh(zozohtnt@gmail.com)
*/
public interface DaoStatement {
/**
* @return 当前语句是否是一个 SELECT 语句
*/
boolean isSelect();
/**
* @return 当前语句是否是一个 UPDATE 语句
*/
boolean isUpdate();
/**
* @return 当前语句是否是一个 DELETE 语句
*/
boolean isDelete();
/**
* @return 当前语句是否是一个 INSERT 语句
*/
boolean isInsert();
/**
* @return 当前语句是否是一个 CREATE 语句
*/
boolean isCreate();
/**
* @return 当前语句是否是一个 DROP 语句
*/
boolean isDrop();
/**
* @return 当前语句是否是一个 RUN 语句
*/
boolean isRun();
/**
* @return 当前语句是否是一个 ALTER 语句
*/
boolean isAlter();
/**
* @return 当前语句是否是一个 OTHER 语句
*/
boolean isOther();
boolean isExec();
boolean isCall();
/**
* @return 当前语句所关联的实体
*/
Entity<?> getEntity();
/**
* 设置 当前语句对应的实体
*
* @param entity
* 实体
* @return 自身
*/
DaoStatement setEntity(Entity<?> entity);
/**
* @return 返回执行的语句的类型
*/
SqlType getSqlType();
/**
* 为本语句每一个参数提供一个适配器
*
* @return JDBC 缓冲语句的参数适配器
*/
ValueAdaptor[] getAdaptors();
/**
* 用一个矩阵描述语句的参数表。<br>
* 这个参数矩阵将同 getAdaptors() 的返回组合使用
* <p>
* 矩阵的每一行相当于执行一条语句
* <p>
* 参数表的下标意义为: Object[行][列]
*
* @return 语句参数表
*/
Object[][] getParamMatrix();
/**
* 将 Dao 语句转换为 JDBC SQL 缓冲语句
*
* @return JDBC SQL 缓冲语句
*/
String toPreparedStatement();
/**
* 输出打印字符串
*
* @return 日志打印字符串
*/
String toString();
/**
* 你可以通过 setCallback 函数为本语句设置一个回调。
* <p>
* 在回调中,你可以返回一个对象。这个对象会存储在本语句中。 <br>
* 当本语句 执行完毕,你可以通过这个函数获得回调函数生成的返回。
* <p>
* 一般的情况,回调函数是用来从 ResultSet 生成对象的。<br>
* 即,如果 本语句不是 SELECT XXXX, 一般不会被设置回调
*
* @return 执行结果。
*
* @see org.nutz.dao.sql.SqlCallback
*/
Object getResult();
/**
* <b>无结果的话,会抛NPE</b>
*
* @return 将结果对象作为 int 返回
*/
int getInt();
Number getNumber();
/**
* @return 将结果对象作为 String 返回
*/
String getString();
/**
* <b>无结果的话,会抛NPE</b>
*
* @return 将结果对象作为 boolean 返回
*/
boolean getBoolean();
/**
* 一个 getResult() 函数的变种,将当前对象的 Result 转换成 List<T> 返回。<br>
* 如果 Result 本身就是一个列表,如果第一个元素的类型和参数相符,则直接返回,<br>
* 否则会被用 Castors 智能转换 如果不是列表,则会强制用 ArrayList 包裹
*
* @param <T>
* 列表容器內的元素类型
* @param classOfT
* 列表容器內的元素类型
* @return 列表
*/
<T> List<T> getList(Class<T> classOfT);
/**
* 转换结果对象到你想要的类型
*
* @param <T>
* 对象类型
* @param classOfT
* 对象类型
* @return 对象
*/
<T> T getObject(Class<T> classOfT);
/**
* @return 如果当前语句为 DELETE | UPDATE | INSERT,返回执行后所影响的记录数。否则返回 -1
*
* @see org.nutz.dao.sql.SqlType
*/
int getUpdateCount();
/**
* 获取 SQL 执行的上下文对象,以便做更多的操作
*
* @return SQL 上下文对象
*/
SqlContext getContext();
/**
* 语句执行之前的操作
* <p>
* 这个接口函数你基本不会直接使用的
*
* @param conn
* 当前执行语句的连接
*
* @throws SQLException
*/
void onBefore(Connection conn) throws SQLException;
/**
* 语句执行完毕的后续操作
* <p>
* 这个接口函数你基本不会直接使用的
*
* @param conn
* 当前执行语句的连接
* @param rs
* 当前语句执行的结果集
* @throws SQLException
* 回调函数抛出的异常
*/
void onAfter(Connection conn, ResultSet rs) throws SQLException;
DaoStatement setPager(Pager pager);
}