package jef.database.dialect.type; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import jef.database.Field; import jef.database.IQueryableEntity; import jef.database.MetadataContainer; import jef.database.dialect.ColumnType; import jef.database.dialect.DatabaseDialect; import jef.database.meta.ITableMetadata; import jef.database.wrapper.clause.InsertSqlClause; import jef.tools.reflect.Property; /** * 描述一个数据库列 映射到java字段上的模型信息 * * @author Jiyi * * @param <T> * 该列在java中映射的数据类型 * * * @Modify * 2014-10-31 为了实现在重构中,内部对于Field对象的表示逐渐过渡为 ColumnMapping对象,暂时先让ColumnMapping实现Field接口。 */ public interface ColumnMapping extends ResultSetAccessor,MetadataContainer { /** * 得到数据库中的列定义 * @return ColumnType */ ColumnType get(); /** * 得到默认未设置或修饰过的值 * @return */ boolean isUnsavedValue(Object value); /** * 是否显式的使用@UnsavedValue注解 * @return */ boolean isUnsavedValueDeclared(); /** * 该字段是否为LOB字段 * * @return true if the column is lob. */ boolean isLob(); /** * 是否为自动生成数值 * @return */ boolean isGenerated(); /** * 该字段不参与插入 * @return */ boolean isNotInsert(); /** * 该字段不参与更新 * @return */ boolean isNotUpdate(); /** * 设置绑定变量 * * @param st * JDBC PreparedStatement * @param value * 绑定变量的值(有可能为null) * @param index * 绑定变量序号 * @param dialect * 数据库方言 * @return 实际被设置到Statement中的值。<br> * 许多数据类型在设置到JDBC * Statement中时需要转换类型,例如java.util.Date需要转换为java.sql.Date。 * @throws SQLException */ Object jdbcSet(PreparedStatement st, Object value, int index, DatabaseDialect dialect) throws SQLException; /** * 为了支持悲观锁中的数据类型转换 * @param rs * @param value * @param dialect * @return * @throws SQLException */ void jdbcUpdate(ResultSet rs, String columnIndex,Object value, DatabaseDialect dialect) throws SQLException; /** * 得到java类型 * * @return java字段类型 */ Class<?> getFieldType(); /** * java字段名 * * @return java字段名 */ String fieldName(); /** * 原生的列名 * @return */ String rawColumnName(); /** * 数据库列名,小写,不转义 * * @return 数据库列名 */ String lowerColumnName(); /** * 数据库列名,大写,不转义 * @return */ String upperColumnName(); /** * 返回在指定数据库环境下使用的列名(大小写,转义) * * @param dialect * 数据库方言 * @param escape * 是否转义 * @return */ String getColumnName(DatabaseDialect dialect, boolean escape); /** * field对象 * * @return FIeld对象 */ Field field(); /** * get tableMetadata * * @return 该列所属的表的的模型 */ ITableMetadata getMeta(); /** * 返回该列在JDBC的数据库类型常量中定义的值。该值参见类{@link java.sql.Types} * * @return JDBC数据类型 * @see java.sql.types */ int getSqlType(); /** * Is the column a promary key of table. * * @return true is is promary key. */ boolean isPk(); /** * 返回在非绑定语句下的SQL表达式字符串<br> * 将在后续版本中取消非绑定变量的操作方式,以后此方法可能无需实现。 * @param value * 值 * @param profile * 方言 * @return 在SQL语句中该值的写法。 * */ String getSqlStr(Object value, DatabaseDialect profile); /** * (框架使用)当执行插入时(绑定变量),该字段的处理拼到InsertSqlResult对象上去,形成SQL语句的逻辑 * * @param obj * 被插入数据库的对象 * @param cStr * column的SQL部分 * @param vStr * value的SQL部分 * @param result * InsertSqlResult,拼凑中的SQL语句描述 * @param dynamic * dynamic * 是否dynamic模式插入,dynamic模式下没有设置过的字段不出现在SQL语句中,从而可以使用数据库中的默认值 * @throws SQLException */ void processPreparedInsert(IQueryableEntity obj, List<String> cStr, List<String> vStr, InsertSqlClause result, boolean dynamic) throws SQLException; /** * (框架使用)构造后的初始化 * * @param field * field元模型 * @param columnName * 列名 * @param type * 字段类型 * @param meta * 所属的表模型 */ void init(Field field, String columnName, ColumnType type, ITableMetadata meta); /** * 设置,是否为主键 * @param b */ void setPk(boolean b); /** * 获得字段访问器 * @return */ public Property getFieldAccessor(); }