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 }
  • 相关阅读:
    [洛谷P4774] [NOI2018]屠龙勇士
    [洛谷P3338] [ZJOI2014]力
    [洛谷P1707] 刷题比赛
    svn查看指定版本提交信息的命令
    ajax无刷新上传文件
    给docker里的php安装gd扩展
    PHP基于openssl实现的非对称加密操作
    php获取文件扩展名
    javascript格式化日期
    javascript获取url参数
  • 原文地址:https://www.cnblogs.com/hoojo/p/cassandra_JavaEntity_Rowmapper_bind_resultset_jdbc_ColumnDefinitions.html
Copyright © 2011-2022 走看看