code: @Override
  	public <T> int deleteByKey(T t) throws NullKeyValueException {
  		Field softDelete = DOInfoReader.getSoftDeleteColumn(t.getClass());
  		
  		List<Object> values = new ArrayList<Object>();
  
  		List<Object> tList = new ArrayList<Object>();
  		tList.add(t);
  		doInterceptBeforeDelete(tList);
  		
  		String sql = null;
  		
  		if(softDelete == null) { // 物理删除
  			sql = SQLUtils.getDeleteSQL(t, values);
  		} else { // 软删除
  			// 对于软删除，当有拦截器时，可能使用者会修改数据以记录删除时间或删除人信息等，此时要先update该条数据
  			if(interceptors != null && !interceptors.isEmpty()) {
  				updateForDelete(t);
  			}
  			Column softDeleteColumn = softDelete.getAnnotation(Column.class);
  			sql = SQLUtils.getSoftDeleteSQL(t, softDeleteColumn, values);
  		}
  		
  		int rows = jdbcExecuteUpdate(sql, values.toArray()); // 不会有in(?)表达式
  
  		doInterceptAfterDelete(tList, rows);
  		
  		return rows;
  	}
docs: /////////