package com.baidu.unbiz.common.genericdao.mapper;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import com.baidu.unbiz.common.genericdao.annotation.Table;
import com.github.knightliao.apollo.db.bo.BaseObject;
/**
* 此對象主要是一個存儲結構,存儲的是實體對象和數據庫表的映射關係的數據 該表被QueryGenerater應用作為生成Query的數據基礎 該表被GenericMapper應用作為裝載實體對象的規則
*/
public class ORMapping<ENTITY extends BaseObject<K>, K extends Serializable> {
private String table = null;
private int shardCount = 0;
private Class<K> keyClass = null;
private Class<ENTITY> entityClass = null;
private String sKeyColumn = null;
private Set<String> keyColumn = new HashSet<String>();
private Set<String> allColumns = new HashSet<String>();
private Set<String> modifiableColumns = new HashSet<String>();
private Map<String, MappingItem> columnMethodMap = new HashMap<String, MappingItem>();
public ORMapping(Class<ENTITY> entityClass, Class<K> keyClass) {
this.keyClass = keyClass;
this.entityClass = entityClass;
initMapping();
}
private void initMapping() {
Table table = entityClass.getAnnotation(Table.class);
this.sKeyColumn = table.keyColumn();
this.keyColumn.addAll(Arrays.asList(sKeyColumn.split(",")));
// 此处增加处理以便零注解
this.table =
(table.name().equals("")) ? table.columnStyle().convert(entityClass.getSimpleName()) : table.name();
this.table = (StringUtils.isNotBlank(table.db())) ? table.db() + "." + this.table : this.table;
this.shardCount = table.shardCount();
List<MappingItem> mappingItems = MappingItem.getMappingItems(entityClass);
List<MappingItem> keyMappings = MappingItem.getMappingItems(keyClass);
mappingItems.addAll(keyMappings);
for (MappingItem item : mappingItems) {
if (item.getDbColumn().indexOf(',') >= 0) {
continue;
}
columnMethodMap.put(item.getDbColumn(), item);
if (item.isModifiable()) {
modifiableColumns.add(item.getDbColumn());
}
}
allColumns.addAll(columnMethodMap.keySet());
}
/**
* @return the allColumns
*/
public Set<String> getAllColumns() {
return allColumns;
}
/**
* @return the keyColumn
*/
public Set<String> getKeyColumn() {
return keyColumn;
}
/**
* @return the modifiableColumns
*/
public Set<String> getModifiableColumns() {
return modifiableColumns;
}
/**
* @return the columnMethodMap
*/
public Map<String, MappingItem> getColumnMethodMap() {
return columnMethodMap;
}
/**
*/
public boolean isComplexKey() {
return keyColumn.size() > 1;
}
public MappingItem getMethodPair(String column) {
MappingItem methods = columnMethodMap.get(column);
if (methods == null) {
column = column.toLowerCase();
methods = columnMethodMap.get(column);
}
if (methods == null) {
column = column.replaceAll("_", "");
methods = columnMethodMap.get(column);
}
return methods;
}
/**
* 獲取某字段對應的get方法
*
* @param column
*/
public Method getGetter(String column) {
MappingItem methods = getMethodPair(column);
return methods == null ? null : methods.getGetter();
}
/**
* 獲取某字段對應的get方法
*
* @param column
*/
public Method getSetter(String column) {
MappingItem methods = getMethodPair(column);
return methods == null ? null : methods.getSetter();
}
/**
* @param column
*/
public boolean isKeyColumn(String column) {
return keyColumn.contains(column);
}
/**
* @return the keyClass
*/
public Class<K> getKeyClass() {
return keyClass;
}
/**
* @return the entityClass
*/
public Class<ENTITY> getEntityClass() {
return entityClass;
}
/**
* @return 下午3:01:27 created by Darwin(Tianxin)
*/
public String getSKeyColumn() {
return sKeyColumn;
}
/**
* @return 下午3:07:23 created by Darwin(Tianxin)
*/
public String getTable() {
return this.table;
}
public int getShardCount() {
return this.shardCount;
}
}