zoukankan      html  css  js  c++  java
  • cassandra 数据到Java对象的映射绑定

    类似Hibernate和MyBatis的关系映射,自动帮你将查询数据或是修改的参数进行数据映射和绑定。

    支持查询后返回数据ResultSet到Java对象的映射,支持修改、删除、查询之前参数的绑定。

    在JavaEntity的命名方式不合规范情况下,可以用Map进行绑定映射。

    这种做法可以适用于JDBC的sql result到Java Entity的映射绑定,但需要修改少量的代码。

    代码如下:

      1 package com.cnblogs.hoojo.cassar.utils;
      2 
      3 import java.beans.PropertyDescriptor;
      4 import java.lang.reflect.InvocationTargetException;
      5 import java.math.BigDecimal;
      6 import java.math.BigInteger;
      7 import java.net.InetAddress;
      8 import java.sql.Timestamp;
      9 import java.util.Date;
     10 import java.util.HashMap;
     11 import java.util.Iterator;
     12 import java.util.List;
     13 import java.util.Map;
     14 import java.util.Set;
     15 import java.util.UUID;
     16 
     17 import org.apache.commons.beanutils.PropertyUtils;
     18 import org.apache.commons.collections.MapUtils;
     19 import org.apache.commons.lang3.StringUtils;
     20 import org.slf4j.Logger;
     21 import org.slf4j.LoggerFactory;
     22 import org.springframework.beans.BeanUtils;
     23 
     24 import com.datastax.driver.core.BoundStatement;
     25 import com.datastax.driver.core.ColumnDefinitions;
     26 import com.datastax.driver.core.ColumnDefinitions.Definition;
     27 import com.datastax.driver.core.DataType;
     28 import com.datastax.driver.core.PreparedStatement;
     29 import com.datastax.driver.core.Row;
     30 import com.google.common.collect.Maps;
     31 
     32 /**
     33  * <b>function:</b> cassandra 到 JavaEntity 映射转换
     34  * @author hoojo
     35  * @createDate 2017-1-19 下午6:20:47
     36  * @file RowMapperUtils.java
     37  * @package com.cnblogs.hoojo.cassar.utils
     38  * @blog http://blog.csdn.net/IBM_hoojo
     39  * @email hoojo_@126.com
     40  * @version 1.0
     41  */
     42 public class RowMapperUtils {
     43 
     44     private static final Logger logger = LoggerFactory.getLogger(RowMapperUtils.class);
     45     
     46     public static boolean DEBUG = false;
     47     public static String LOG_LEVEL = "TRACE"; 
     48     
     49     /**
     50      * <b>function:</b> 将查询的Row转换到target 对象中返回
     51      * @author hoojo
     52      * @createDate 2017-1-20 下午5:36:20
     53      * @param target 返回Java对象
     54      * @param row {@link Row}
     55      * @return 返回Java对象
     56      */
     57     public static <T> T conversion(T target, Row row) {
     58         return conversion(target, row, null);
     59     }
     60     
     61     /**
     62      * <b>function:</b> 将查询的Row转换到target 对象中返回,row对象存在List、Set集合类型情况
     63      * @author hoojo
     64      * @createDate 2017-1-20 下午5:36:20
     65      * @param target 返回Java对象
     66      * @param row {@link Row}
     67      * @param genericClass List中存储值 的class类型
     68      * @return 返回Java对象
     69      */
     70     public static <T> T conversion(T target, Row row, Map<String, Class<?>> genericClass) {
     71         return conversion(target, row, genericClass, null);
     72     }
     73     
     74     /**
     75      * <b>function:</b> 将查询的Row转换到target 对象中返回,row对象存在List、Set、Map集合类型情况
     76      * @author hoojo
     77      * @createDate 2017-1-20 下午5:36:20
     78      * @param target 返回Java对象
     79      * @param row {@link Row}
     80      * @param valClass List中存储值 的class类型
     81      * @param keyClass List中存储Key 的class类型
     82      * @return 返回Java对象
     83      */
     84     @SuppressWarnings("unchecked")
     85     public static <T> T conversion(T target, Row row, Map<String, Class<?>> valClass, Map<String, Class<?>> keyClass) {
     86         Class<T> clazz = (Class<T>) target.getClass();
     87         return conversion(clazz, row, valClass, keyClass);
     88     }
     89     
     90     /**
     91      * <b>function:</b> 将查询的Row转换到clazz实例对象返回,row对象存在List、Set集合类型情况
     92      * @author hoojo
     93      * @createDate 2017-1-20 下午5:36:20
     94      * @param target 返回Java对象
     95      * @param row {@link Row}
     96      * @return 返回Java对象
     97      */
     98     public static <T> T conversion(Class<T> clazz, Row row) {
     99         return conversion(clazz, row, null);
    100     }
    101     
    102     /**
    103      * <b>function:</b> 将查询的Row转换到clazz实例对象返回,row对象存在List、Set集合类型情况
    104      * @author hoojo
    105      * @createDate 2017-1-20 下午5:36:20
    106      * @param target 返回Java对象
    107      * @param row {@link Row}
    108      * @param genericClass List中存储值 的class类型
    109      * @return 返回Java对象
    110      */
    111     public static <T> T conversion(Class<T> clazz, Row row, Map<String, Class<?>> genericClass) {
    112         return conversion(clazz, row, genericClass, null);
    113     }
    114     
    115     public static <T> T transform(T target, Row row, Map<String, Class<?>> valClass, Map<String, Class<?>> keyClass) {
    116 
    117         ColumnDefinitions cols = row.getColumnDefinitions();
    118         Iterator<Definition> definitionIter = null;
    119 
    120         definitionIter = cols.iterator();
    121         while (definitionIter.hasNext()) {
    122             Definition definition = definitionIter.next();
    123 
    124             DataType type = definition.getType();
    125             String columnName = definition.getName();
    126             debug(String.format("列名:%s,列类型:%s", columnName, type));
    127 
    128             Object value = getData(row, type, columnName, valClass, keyClass);
    129             debug(String.format("列名:%s,取值:%s", columnName, value));
    130 
    131             String camelName = camelName(columnName);
    132             try {
    133                 PropertyUtils.setProperty(target, camelName, value);
    134             } catch (IllegalAccessException | InvocationTargetException e) {
    135                 log("设置{}值发生异常:", camelName, e);
    136             } catch (NoSuchMethodException ex) {
    137                 
    138                 if (camelName.equals(camelName.toLowerCase())) {
    139                     log("This Class '{}' set '{}' method notfound.", new Object[] { target.getClass().getSimpleName(), camelName } );
    140                 } else {
    141                     
    142                     try {
    143                         PropertyUtils.setProperty(target, camelName.toLowerCase(), value);
    144                     } catch (IllegalAccessException | InvocationTargetException | IllegalArgumentException e) {
    145                         log("设置{}值发生异常:", camelName, e);
    146                     } catch (NoSuchMethodException e) {
    147                         log("This Class '{}' set '{}' or set '{}' method notfound.", new Object[] { target.getClass().getSimpleName(), camelName, camelName.toLowerCase() } );
    148                     }
    149                 }
    150             }
    151         }
    152         debug("target: " + target);
    153         
    154         return target;
    155     }
    156     
    157     /**
    158      * <b>function:</b> 将查询的Row转换到clazz实例对象返回,row对象存在List、Set、Map集合类型情况
    159      * @author hoojo
    160      * @createDate 2017-1-20 下午5:36:20
    161      * @param target 返回Java对象
    162      * @param row {@link Row}
    163      * @param valClass List中存储值 的class类型
    164      * @param keyClass List中存储Key 的class类型
    165      * @return 返回Java对象
    166      */
    167     public static <T> T conversion(Class<T> clazz, Row row, Map<String, Class<?>> valClass, Map<String, Class<?>> keyClass) {
    168 
    169         T target = BeanUtils.instantiate(clazz);
    170         Map<String, PropertyDescriptor> mappedFields = getMappedFields(target.getClass());
    171 
    172         ColumnDefinitions cols = row.getColumnDefinitions();
    173         Iterator<Definition> definitionIter = cols.iterator();
    174         while (definitionIter.hasNext()) {
    175             Definition definition = definitionIter.next();
    176 
    177             DataType type = definition.getType();
    178             String columnName = definition.getName().toLowerCase();
    179             debug(String.format("列名:%s,列类型:%s", columnName, type));
    180 
    181             Object value = getData(row, type, columnName, valClass, keyClass);
    182             debug(String.format("列名:%s,取值:%s", columnName, value));
    183 
    184             if (mappedFields.containsKey(columnName)) {
    185                 try {
    186                     mappedFields.get(columnName).getWriteMethod().invoke(target, value); 
    187                 } catch (IllegalAccessException | InvocationTargetException e) {
    188                     log("设置{}值发生异常:{}", columnName, e);
    189                 } catch (Exception e) {
    190                     log("设置{}值发生异常:{}", columnName, e.getMessage());
    191                 } 
    192             } else {
    193                 log("The target Class '{}' in Column '{}' setter method notFound", clazz.getSimpleName(), columnName);
    194             }
    195         }
    196         debug("target: " + target);
    197         
    198         return target;
    199     }
    200     
    201     /**
    202      * <b>function:</b> 将查询的Row转换到target Map对象中返回
    203      * @author hoojo
    204      * @createDate 2017-1-20 下午5:36:20
    205      * @param target 返回Map对象
    206      * @param row {@link Row}
    207      * @return 返回Map对象
    208      */
    209     public static <T> Map<String, T> conversion(Map<String, T> target, Row row) {
    210         return conversion(target, row, null);
    211     }
    212     
    213     /**
    214      * <b>function:</b> 将查询的Row转换到target Map对象中返回,row对象存在List、Set集合类型情况
    215      * @author hoojo
    216      * @createDate 2017-1-20 下午5:36:20
    217      * @param target 返回Map对象
    218      * @param row {@link Row}
    219      * @param genericClass List中存储值 的class类型
    220      * @return 返回Map对象
    221      */
    222     public static <T> Map<String, T> conversion(Map<String, T> target, Row row, Map<String, Class<?>> genericClass) {
    223         return conversion(target, row, genericClass, null);
    224     }
    225     
    226     /**
    227      * <b>function:</b> 将查询的Row转换到target Map对象中返回,row对象存在Map集合类型情况
    228      * @author hoojo
    229      * @createDate 2017-1-20 下午5:36:20
    230      * @param target 返回Map对象
    231      * @param row {@link Row}
    232      * @param valClass MAP、List中存储值 的class类型
    233      * @param keyClass MAP Key 的class类型
    234      * @return 返回Map对象
    235      */
    236     @SuppressWarnings("unchecked")
    237     public static <T> Map<String, T> conversion(Map<String, T> target, Row row, Map<String, Class<?>> valClass, Map<String, Class<?>> keyClass) {
    238 
    239         if (target == null) {
    240             target = Maps.newHashMap();
    241         }
    242         
    243         ColumnDefinitions cols = row.getColumnDefinitions();
    244         Iterator<Definition> definitionIter = cols.iterator();
    245         while (definitionIter.hasNext()) {
    246             Definition definition = definitionIter.next();
    247 
    248             DataType type = definition.getType();
    249             String columnName = definition.getName().toLowerCase();
    250             debug(String.format("列名:%s,列类型:%s", columnName, type));
    251 
    252             Object value = getData(row, type, columnName, valClass, keyClass);
    253             debug(String.format("列名:%s,取值:%s", columnName, value));
    254 
    255             String camelName = camelName(columnName);
    256             if (value != null) {
    257                 target.put(camelName, (T) value);
    258             } else {
    259                 target.put(camelName, null);
    260             }
    261         }
    262         debug("target: " + target);
    263         
    264         return target;
    265     }
    266     
    267     /**
    268      * <b>function:</b> 为cql PreparedStatement对象自动绑定参数值
    269      * @author hoojo
    270      * @createDate 2017-1-20 下午5:33:18
    271      * @param statement PreparedStatement
    272      * @param params 参数实体
    273      * @return BoundStatement 已绑定值
    274      */
    275     public static <T> BoundStatement bind(PreparedStatement statement, Map<String, T> bindParam) {
    276         
    277         BoundStatement boundStatement = null;
    278         
    279         Map<String, T> params = Maps.newHashMap(bindParam);
    280         
    281         Set<String> keys = bindParam.keySet();
    282         Iterator<String> iter = keys.iterator();
    283         while (iter.hasNext()) {
    284             String key = iter.next();
    285             T val = bindParam.get(key);
    286             params.put(key, val);
    287             
    288             if (!bindParam.containsKey(key.toLowerCase())) {
    289                 params.put(key.toLowerCase(), val);
    290             }
    291             
    292             key = underscoreName(key).toLowerCase();
    293             if (!bindParam.containsKey(key)) {
    294                 params.put(key, val);
    295             }
    296         }
    297         
    298         Map<String, Object> bindParams = Maps.newLinkedHashMap();
    299         
    300         ColumnDefinitions cols = statement.getVariables();
    301         Iterator<Definition> definitionIter = cols.iterator();
    302         while (definitionIter.hasNext()) {
    303             Definition definition = definitionIter.next();
    304 
    305             DataType type = definition.getType();
    306             String columnName = definition.getName().toLowerCase();
    307             debug(String.format("参数列名:%s,参数列类型:%s", columnName, type));
    308             
    309             Object param = null;
    310             if (params.containsKey(columnName)) {
    311                 param = params.get(columnName); 
    312             } else {
    313                 log("The target Map does not exist param '{}' value.", columnName);
    314             }
    315             debug(String.format("参数列名:%s,参数取值:%s", columnName, param));
    316             
    317             bindParams.put(columnName, param);
    318         }
    319          
    320         debugCQL(statement.getQueryString(), bindParams);
    321         
    322         boundStatement = statement.bind(bindParams.values().toArray());
    323         return boundStatement;
    324     }
    325     
    326     /**
    327      * <b>function:</b> 为cql PreparedStatement对象自动绑定参数值
    328      * @author hoojo
    329      * @createDate 2017-1-20 下午5:33:18
    330      * @param statement PreparedStatement
    331      * @param bindEntity 参数实体
    332      * @return BoundStatement 已绑定值
    333      */
    334     public static <T> BoundStatement bind(PreparedStatement statement, T bindEntity) {
    335         
    336         BoundStatement boundStatement = null;
    337             
    338         Map<String, Object> params = Maps.newLinkedHashMap();
    339         Map<String, PropertyDescriptor> mappedFields = getMappedFields(bindEntity.getClass());
    340         
    341         ColumnDefinitions cols = statement.getVariables();
    342         Iterator<Definition> definitionIter = cols.iterator();
    343         while (definitionIter.hasNext()) {
    344             Definition definition = definitionIter.next();
    345 
    346             DataType type = definition.getType();
    347             String columnName = definition.getName().toLowerCase();
    348             debug(String.format("参数列名:%s,参数列类型:%s", columnName, type));
    349             
    350             Object param = null;
    351             if (mappedFields.containsKey(columnName)) {
    352                 try {
    353                     param = mappedFields.get(columnName).getReadMethod().invoke(bindEntity); 
    354                 } catch (IllegalAccessException | InvocationTargetException e) {
    355                     log("设置{}值发生异常:", columnName, e);
    356                 } 
    357             } else {
    358                 log("The target Class '{}' in Column '{}' getter method notFound", bindEntity.getClass().getSimpleName(), columnName);
    359             }
    360             debug(String.format("参数列名:%s,参数取值:%s", columnName, param));
    361             
    362             params.put(columnName, param);
    363         }
    364          
    365         debugCQL(statement.getQueryString(), params);
    366         
    367         boundStatement = statement.bind(params.values().toArray());
    368         return boundStatement;
    369     }
    370     
    371     /**
    372      * <b>function:</b> 调试cql语句,将占位符替换参数值
    373      * @author hoojo
    374      * @createDate 2017-1-20 下午5:30:48
    375      * @param queryString cql语句
    376      * @param params 参数
    377      */
    378     private static void debugCQL(String queryString, Map<String, Object> params) {
    379         
    380         if (DEBUG) {
    381             Set<String> keys = params.keySet();
    382             
    383             Object[] keyArrays = keys.toArray();
    384             for (int i = 0; i < keys.size(); i++) {
    385                 
    386                 queryString = StringUtils.replaceOnce(queryString, "?", MapUtils.getString(params, keyArrays[i], "NULL"));
    387             }
    388             logger.info("debug cql: {}", queryString);
    389         }
    390     }
    391     
    392     private static void debug(String log) {
    393         
    394         if (DEBUG) {
    395             logger.info(log);
    396         }
    397     }
    398     
    399     private static void log(String msg, Object... args) {
    400         
    401         if ("INFO".equalsIgnoreCase(LOG_LEVEL)) {
    402             logger.info(msg, args);
    403         } else if ("WARN".equalsIgnoreCase(LOG_LEVEL)) {
    404             logger.warn(msg, args);
    405         } else if ("DEBUG".equalsIgnoreCase(LOG_LEVEL)) {
    406             logger.debug(msg, args);
    407         } else if ("TRACE".equalsIgnoreCase(LOG_LEVEL)) {
    408             logger.trace(msg, args);
    409         } else if ("ERROR".equalsIgnoreCase(LOG_LEVEL)) {
    410             logger.error(msg, args);
    411         }
    412     }
    413     
    414     /**
    415      * <b>function:</b> 获取对象的setter方法,并返回下划线命名和全小写命名的Map集合
    416      * @author hoojo
    417      * @createDate 2017-1-20 下午5:31:21
    418      * @param clazz 目标对象class
    419      * @return Map
    420      */
    421     private static Map<String, PropertyDescriptor> getMappedFields(Class<?> clazz) {
    422         Map<String, PropertyDescriptor> mappedFields = new HashMap<String, PropertyDescriptor>();
    423         
    424         PropertyDescriptor[] pds = BeanUtils.getPropertyDescriptors(clazz);
    425         for (PropertyDescriptor pd : pds) {
    426             if (pd.getWriteMethod() != null) {
    427                 
    428                 //setUserId->userid,user_id;
    429                 mappedFields.put(pd.getName().toLowerCase(), pd);
    430                 
    431                 String underscoreName = underscoreName(pd.getName());
    432                 if (!pd.getName().toUpperCase().equals(underscoreName)) {
    433                     mappedFields.put(underscoreName.toLowerCase(), pd);
    434                 }
    435             }
    436         }
    437         
    438         return mappedFields;
    439     }
    440     
    441     /**
    442      * <b>function:</b> 获取cql 的值
    443      * @author hoojo
    444      * @createDate 2017-1-20 下午5:26:24
    445      * @param row {@link Row}
    446      * @param type 列类型
    447      * @param columnName 列名
    448      * @param valClass MAP、List中存储值 的class类型
    449      * @param keyClass MAP Key 的class类型
    450      * @return
    451      */
    452     private static Object getData(Row row, DataType type, String columnName, Map<String, Class<?>> valClass, Map<String, Class<?>> keyClass) {
    453         
    454         Object value = null;
    455         
    456         try {
    457 
    458             if (type == DataType.bigint()) {
    459                 value = row.getLong(columnName);
    460             } else if (type == DataType.cboolean()) {
    461                 value = row.getBool(columnName);
    462             } else if (type == DataType.blob()) {
    463                 value = row.getBytes(columnName);
    464             } else if (type == DataType.timestamp()) {
    465                 value = row.getDate(columnName);
    466             } else if (type == DataType.decimal()) {
    467                 value = row.getDecimal(columnName);
    468             } else if (type == DataType.cfloat()) {
    469                 value = row.getFloat(columnName);
    470             } else if (type == DataType.inet()) {
    471                 value = row.getInet(columnName);
    472             } else if (type == DataType.cint()) {
    473                 value = row.getInt(columnName);
    474             } else if (type.isCollection() && type.asJavaClass() == List.class) {
    475                 value = getCollectionData(row, type, columnName, valClass);
    476             } else if (type.isCollection() && type.asJavaClass() == Set.class) {
    477                 value = getCollectionData(row, type, columnName, valClass);
    478             } else if (type.isCollection() && type.asJavaClass() == Map.class) {
    479                 value = getCollectionData(row, type, columnName, valClass, keyClass);
    480             } else if (type == DataType.varchar()) {
    481                 value = row.getString(columnName);
    482             } else if (type == DataType.uuid() || type == DataType.timeuuid()) {
    483                 value = row.getUUID(columnName);
    484             } else if (type == DataType.varint()) {
    485                 value = row.getVarint(columnName);
    486             } else if (type == DataType.cdouble()) {
    487                 value = row.getDouble(columnName);
    488             } else if (type == DataType.text()) {
    489                 value = row.getString(columnName);
    490             }
    491             
    492         } catch (Exception e) {
    493             log("获取{}值发生异常:", columnName, e);
    494         }
    495         
    496         if (value == null) {
    497             log("Column '{}' Type({}) get cassandra data is NULL.", columnName, type);
    498         }
    499         
    500         return value;
    501     }
    502     
    503     /**
    504      * <b>function:</b> 获取cql List集合泛型的值
    505      * @author hoojo
    506      * @createDate 2017-1-20 下午5:26:24
    507      * @param row {@link Row}
    508      * @param type 列类型
    509      * @param columnName 列名
    510      * @param valClass List Value 的class类型
    511      * @return
    512      */
    513     private static Object getCollectionData(Row row, DataType type, String columnName, Map<String, Class<?>> valClass) {
    514         
    515         Object value = null;
    516         
    517         Class<?> ofValueType = valClass != null ? valClass.get(columnName) : null;
    518         List<DataType> typeArguments = type.getTypeArguments();
    519         if (ofValueType == null) {
    520             log("Column TypeArguments convter Error, CQL Type: '{} {}' --> '{} {}(NULL)'", new Object[] { columnName, type, columnName, type.getName() });
    521         } else if (ofValueType != typeArguments.get(0).asJavaClass()) {
    522             log("Column TypeArguments convter Error, CQL Type: '{} {}({})' --> '{} {}({})'", new Object[] { columnName, type, typeArguments.get(0).asJavaClass(), columnName, valueOf(type.asJavaClass(), ofValueType), ofValueType });
    523         } else if (type.asJavaClass() == List.class) {
    524             value = row.getList(columnName, ofValueType);
    525         } else if (type.asJavaClass() == Set.class) {
    526             value = row.getSet(columnName, ofValueType);
    527         }
    528         
    529         return value;
    530     }
    531     
    532     /**
    533      * <b>function:</b> 获取cql MAP集合泛型的值
    534      * @author hoojo
    535      * @createDate 2017-1-20 下午5:26:24
    536      * @param row {@link Row}
    537      * @param type 列类型
    538      * @param columnName 列名
    539      * @param valClass MAP Value 的class类型
    540      * @param keyClass MAP Key 的class类型
    541      * @return
    542      */
    543     private static Object getCollectionData(Row row, DataType type, String columnName, Map<String, Class<?>> valClass, Map<String, Class<?>> keyClass) {
    544         
    545         Object value = null;
    546         
    547         Class<?> ofKeyType = keyClass != null ? keyClass.get(columnName) : null;
    548         Class<?> ofValueType = valClass != null ? valClass.get(columnName) : null;
    549         
    550         List<DataType> typeArguments = type.getTypeArguments();
    551         if (ofValueType == null && ofKeyType == null) {
    552             log("Column TypeArguments convter Error, CQL Type: '{} {}' --> '{} {}<NULL, NULL>'", new Object[] { columnName, type, columnName, type.getName() });
    553         } else if (ofValueType == null) {
    554             log("Column TypeArguments convter Error, CQL Type: '{} {}' --> '{} {}<{}, NULL>'", new Object[] { columnName, type, columnName, type.getName(), valueOf(ofKeyType) });
    555         } else if (ofKeyType == null) {
    556             log("Column TypeArguments convter Error, CQL Type: '{} {}' --> '{} {}<NULL, {}>'", new Object[] { columnName, type, columnName, type.getName(), valueOf(ofValueType) });
    557         } else if (ofKeyType != typeArguments.get(0).asJavaClass() || ofValueType != typeArguments.get(1).asJavaClass()) {
    558             log("Column TypeArguments convter Error, CQL Type: '{} {} (<{}, {}>)' --> '{} {}(<{}, {}>)'", new Object[] { columnName, type, typeArguments.get(0).asJavaClass(), typeArguments.get(1).asJavaClass(), columnName, valueOf(Map.class, ofValueType, ofKeyType), ofKeyType, ofValueType });
    559         } else {
    560             value = row.getMap(columnName, ofKeyType, ofValueType);
    561         }
    562         
    563         return value;
    564     }
    565     
    566     /**
    567      * <b>function:</b> 转换为下划线命名方式
    568      * @author hoojo
    569      * @createDate 2017-1-20 下午5:24:50
    570      */
    571     public static String underscoreName(String name) {
    572         StringBuilder result = new StringBuilder();
    573         if (name != null && name.length() > 0) {
    574             // 将第一个字符处理成大写
    575             result.append(name.substring(0, 1).toUpperCase());
    576             // 循环处理其余字符
    577             for (int i = 1; i < name.length(); i++) {
    578                 String s = name.substring(i, i + 1);
    579                 // 在大写字母前添加下划线
    580                 if (s.equals(s.toUpperCase()) && !Character.isDigit(s.charAt(0))) {
    581                     result.append("_");
    582                 }
    583                 // 其他字符直接转成大写
    584                 result.append(s.toUpperCase());
    585             }
    586         }
    587         return result.toString();
    588     }
    589     
    590     /**
    591      * <b>function:</b> 驼峰式命名方式
    592      * @author hoojo
    593      * @createDate 2017-1-20 下午5:25:09
    594      */
    595     public static String camelName(String name) {
    596         StringBuilder sb = new StringBuilder();
    597         if (!name.contains("_")) {
    598             // 不含下划线,仅将首字母小写
    599             return name.substring(0, 1).toLowerCase() + name.substring(1);
    600         }
    601         // 用下划线将原始字符串分割
    602         String camels[] = name.split("_");
    603         for (String camel :  camels) {
    604             // 跳过原始字符串中开头、结尾的下换线或双重下划线
    605             if (camel.isEmpty()) {
    606                 continue;
    607             }
    608             // 处理真正的驼峰片段
    609             if (sb.length() == 0) {
    610                 // 第一个驼峰片段,全部字母都小写
    611                 sb.append(camel.toLowerCase());
    612             } else {
    613                 // 其他的驼峰片段,首字母大写
    614                 sb.append(camel.substring(0, 1).toUpperCase());
    615                 sb.append(camel.substring(1).toLowerCase());
    616             }
    617         }
    618         return sb.toString();
    619     }
    620 
    621     /**
    622      * <b>function:</b> java class转换到cql类型
    623      * @author hoojo
    624      * @createDate 2017-1-20 下午5:24:09
    625      * @param clazz Class
    626      * @return {@link DataType}
    627      */
    628     private static DataType valueOf(Class<?> clazz) {
    629         
    630         if (clazz == null) {
    631             return DataType.custom("NULL");
    632         }
    633         if (clazz == long.class || clazz == Long.class) {
    634             return DataType.bigint();
    635         }
    636         if (clazz == boolean.class || clazz == Boolean.class) {
    637             return DataType.cboolean();
    638         }
    639         if (clazz == Byte.class || clazz == byte.class) {
    640             return DataType.blob();
    641         }
    642         if (clazz == Date.class || clazz == Timestamp.class) {
    643             return DataType.timestamp();
    644         }
    645         if (clazz == BigDecimal.class) {
    646             return DataType.decimal();
    647         }
    648         if (clazz == float.class || clazz == Float.class) {
    649             return DataType.cfloat();
    650         }
    651         if (clazz == InetAddress.class) {
    652             return DataType.inet();
    653         }
    654         if (clazz == int.class || clazz == Integer.class) {
    655             return DataType.cint();
    656         }
    657         if (clazz == String.class) {
    658             return DataType.varchar();// text();
    659         }
    660         if (clazz == UUID.class) {
    661             return DataType.uuid(); // timeuuid();
    662         }
    663         if (clazz == BigInteger.class) {
    664             return DataType.varint();
    665         }
    666         
    667         log("Class '{}' unknow DataType in cassandra.", clazz);
    668         
    669         return DataType.custom("unknow");
    670     }
    671     
    672     /**
    673      * <b>function:</b> 转换集合list、set到cql类型
    674      * @author hoojo
    675      * @createDate 2017-1-20 下午5:22:43
    676      * @param clazz java class
    677      * @param valueClass 集合值存储类型class
    678      * @param keyClass 集合键存储类型class
    679      * @return DataType
    680      */
    681     public static DataType valueOf(Class<?> clazz, Class<?> valueClass, Class<?> keyClass) {
    682         
    683         if (clazz == List.class) {
    684             return DataType.list(valueOf(valueClass));
    685         }
    686         if (clazz == Set.class) {
    687             return DataType.set(valueOf(valueClass));
    688         }
    689         if (clazz == Map.class) {
    690             return DataType.map(valueOf(keyClass), valueOf(valueClass));
    691         }
    692         
    693         log("Class '{}' unknow DataType in cassandra.", clazz);
    694         return DataType.custom("unknow");
    695     }
    696     
    697     /**
    698      * <b>function:</b> 转换集合list、set到cql类型
    699      * @author hoojo
    700      * @createDate 2017-1-20 下午5:22:43
    701      * @param clazz java class
    702      * @param valueClass 集合存储类型class
    703      * @return DataType
    704      */
    705     private static DataType valueOf(Class<?> clazz, Class<?> valueClass) {
    706         
    707         return valueOf(clazz, valueClass, null);
    708     }
    709 }
  • 相关阅读:
    韩式英语
    Daily dictation 听课笔记
    words with same pronunciation
    you will need to restart eclipse for the changes to take effect. would you like to restart now?
    glottal stop(britain fountain mountain)
    education 的发音
    第一次用Matlab 的lamada语句
    SVN的switch命令
    String的split
    SVN模型仓库中的资源从一个地方移动到另一个地方的办法(很久才解决)
  • 原文地址:https://www.cnblogs.com/hoojo/p/cassandra_JavaEntity_Rowmapper_bind_resultset_jdbc_ColumnDefinitions.html
Copyright © 2011-2022 走看看