├── README.md ├── dexcoder-commons ├── pom.xml └── src │ └── main │ └── java │ └── com │ └── dexcoder │ └── commons │ ├── bean │ ├── AbstractTypeConverter.java │ ├── BeanConverter.java │ ├── BeanConverterConfig.java │ ├── ContextClassLoaderLocal.java │ ├── EnumStringConverter.java │ ├── IntrospectionCache.java │ ├── LongIntegerConverter.java │ └── TypeConverter.java │ ├── cache │ ├── AbstractCacheMap.java │ ├── CacheMap.java │ ├── DisableCache.java │ ├── EnableCache.java │ ├── FIFOCache.java │ ├── LFUCache.java │ └── LRUCache.java │ ├── enums │ └── IEnum.java │ ├── exceptions │ ├── AssistantException.java │ ├── CommonsAssistantException.java │ └── DexcoderException.java │ ├── interceptor │ ├── RunBinderInterceptor.java │ ├── RunBinderMvcInterceptor.java │ └── RunBinderTransactionAspectSupport.java │ ├── mvc │ └── IEnumConverterFactory.java │ ├── office │ ├── DefaultExcelStyleCreator.java │ ├── ExcelCell.java │ ├── ExcelRow.java │ ├── ExcelSheet.java │ ├── ExcelStyleCreator.java │ └── ExcelTools.java │ ├── pager │ ├── Pageable.java │ └── Pager.java │ ├── result │ ├── RunBinder.java │ └── RunResult.java │ └── utils │ ├── ArrUtils.java │ ├── AssertUtils.java │ ├── CacheUtils.java │ ├── ClassUtils.java │ ├── EncryptUtils.java │ ├── EnumUtils.java │ ├── ImageUtils.java │ ├── NameUtils.java │ ├── PropertyUtils.java │ ├── RandomUtils.java │ ├── SerializeUtils.java │ ├── StrUtils.java │ ├── TextUtils.java │ ├── ThreadExecutionUtils.java │ ├── TimeUtils.java │ ├── UUIDUtils.java │ └── ZipUtils.java ├── dexcoder-dal-batis ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── dexcoder │ │ └── dal │ │ └── batis │ │ ├── BatisSqlFactory.java │ │ ├── BatisSqlFactoryBean.java │ │ ├── build │ │ ├── BaseBuilder.java │ │ ├── BatisBoundSql.java │ │ ├── Configuration.java │ │ ├── DynamicContext.java │ │ ├── DynamicSqlSource.java │ │ ├── MappedStatement.java │ │ ├── MapperBuilderAssistant.java │ │ ├── ParameterMapping.java │ │ ├── PropertyTokenizer.java │ │ ├── RawSqlSource.java │ │ ├── SqlSource.java │ │ ├── SqlSourceBuilder.java │ │ ├── StaticSqlSource.java │ │ └── SystemMetaObject.java │ │ ├── ognl │ │ ├── ExpressionEvaluator.java │ │ └── OgnlCache.java │ │ ├── parser │ │ ├── ClassFieldHandler.java │ │ └── PropertyParser.java │ │ ├── reflection │ │ ├── MetaClass.java │ │ └── MetaObject.java │ │ ├── wrapper │ │ ├── BaseWrapper.java │ │ ├── BeanWrapper.java │ │ ├── CollectionWrapper.java │ │ ├── MapWrapper.java │ │ └── ObjectWrapper.java │ │ └── xml │ │ ├── ChooseSqlNode.java │ │ ├── ForEachSqlNode.java │ │ ├── IfSqlNode.java │ │ ├── MixedSqlNode.java │ │ ├── SetSqlNode.java │ │ ├── SqlNode.java │ │ ├── StaticTextSqlNode.java │ │ ├── TextSqlNode.java │ │ ├── TrimSqlNode.java │ │ ├── VarDeclSqlNode.java │ │ ├── WhereSqlNode.java │ │ ├── XMLIncludeTransformer.java │ │ ├── XMLMapperBuilder.java │ │ ├── XMLMapperEntityResolver.java │ │ ├── XMLScriptBuilder.java │ │ ├── XMLStatementBuilder.java │ │ ├── XNode.java │ │ └── XPathParser.java │ └── resources │ └── batis-mapper.dtd ├── dexcoder-dal-spring ├── pom.xml └── src │ └── main │ └── java │ └── com │ └── dexcoder │ └── dal │ └── spring │ ├── AbstractJdbcDaoImpl.java │ ├── JdbcDaoImpl.java │ ├── datasource │ ├── DataSourceContext.java │ ├── DynamicDataSource.java │ ├── DynamicDataSourceHolder.java │ ├── DynamicDataSourceUtils.java │ └── DynamicDsInterceptor.java │ ├── mapper │ └── JdbcRowMapper.java │ └── page │ ├── PageControl.java │ ├── PageSqlHandler.java │ ├── SimplePageSqlHandler.java │ ├── SmartPageSqlHandler.java │ └── SqlParser.java ├── dexcoder-dal ├── pom.xml └── src │ └── main │ └── java │ └── com │ └── dexcoder │ └── dal │ ├── BoundSql.java │ ├── JdbcDao.java │ ├── SimpleSqlFactory.java │ ├── SqlFactory.java │ ├── annotation │ ├── Column.java │ ├── Table.java │ └── Transient.java │ ├── build │ ├── AbstractSqlBuilder.java │ ├── AutoField.java │ ├── AutoFieldType.java │ ├── Criteria.java │ ├── CriteriaBoundSql.java │ ├── DeleteBuilder.java │ ├── InsertBuilder.java │ ├── MetaTable.java │ ├── OrderByBuilder.java │ ├── SelectBuilder.java │ ├── SqlBuilder.java │ ├── UpdateBuilder.java │ └── WhereBuilder.java │ ├── exceptions │ ├── ClassAssistantException.java │ └── JdbcAssistantException.java │ └── handler │ ├── DefaultMappingHandler.java │ ├── GenericTokenParser.java │ ├── KeyGenerator.java │ ├── MappingHandler.java │ ├── NativeTokenHandler.java │ ├── OracleKeyGenerator.java │ ├── TokenHandler.java │ └── UUIDKeyGenerator.java ├── dexcoder-test ├── pom.xml └── src │ ├── main │ └── java │ │ └── com │ │ └── dexcoder │ │ └── test │ │ └── ApplicationTest.java │ └── test │ ├── java │ └── com │ │ └── dexcoder │ │ └── test │ │ ├── BaseTest.java │ │ ├── bean │ │ └── BeanConvertTest.java │ │ ├── enums │ │ └── UserType.java │ │ ├── model │ │ ├── AnnotationUser.java │ │ ├── Book.java │ │ ├── Chapter.java │ │ ├── People.java │ │ ├── User.java │ │ ├── UserInfo.java │ │ └── UserVo.java │ │ ├── persistence │ │ ├── CriteriaTest.java │ │ ├── CustomMappingHandler.java │ │ ├── DynamicDsTransactionTest.java │ │ ├── JdbcDaoBatisTest.java │ │ ├── JdbcDaoDsTest.java │ │ ├── JdbcDaoKeyTest.java │ │ ├── JdbcDaoMultiTableTest.java │ │ ├── JdbcDaoTest.java │ │ ├── OracleTest.java │ │ └── ResourceTest.java │ │ ├── tmp │ │ ├── CacheInterceptor.java │ │ ├── SiteMapUtils.java │ │ └── SourceCodeFormatter.java │ │ ├── transaction │ │ ├── JdbcDaoTransactionService.java │ │ └── JdbcDaoTransactionServiceImpl.java │ │ └── utils │ │ ├── SiteMapUtilsTest.java │ │ └── SourceCodeFormatterTest.java │ └── resources │ ├── applicationContext.xml │ ├── batis-applicationContext.xml │ ├── ds-applicationContext.xml │ ├── dynamic-ds.xml │ ├── dynamic-ds2.xml │ ├── init.properties │ ├── key-applicationContext.xml │ ├── log4j.xml │ ├── multiTable-applicationContext.xml │ ├── oracle-applicationContext.xml │ ├── oracle-init.properties │ └── user-sql.xml ├── md ├── dy-datasource.md ├── excel-tools.md ├── multi-table.md ├── other-component.md └── update-log.md └── pom.xml /dexcoder-commons/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | dexcoder-assistant 7 | com.dexcoder 8 | 2.3.5 9 | 10 | 4.0.0 11 | 12 | dexcoder-commons 13 | 14 | dexcoder-commons 15 | 16 | 17 | org.apache.commons 18 | commons-lang3 19 | 20 | 21 | commons-io 22 | commons-io 23 | true 24 | 25 | 26 | commons-collections 27 | commons-collections 28 | true 29 | 30 | 31 | org.apache.poi 32 | poi 33 | true 34 | 35 | 36 | org.apache.poi 37 | poi-ooxml 38 | true 39 | 40 | 41 | org.springframework 42 | spring-tx 43 | true 44 | 45 | 46 | org.aspectj 47 | aspectjweaver 48 | true 49 | 50 | 51 | org.springframework 52 | spring-webmvc 53 | true 54 | 55 | 56 | org.slf4j 57 | slf4j-api 58 | 59 | 60 | javax.servlet 61 | servlet-api 62 | provided 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /dexcoder-commons/src/main/java/com/dexcoder/commons/bean/AbstractTypeConverter.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.commons.bean; 2 | 3 | /** 4 | * Created by liyd on 2015-7-31. 5 | */ 6 | public abstract class AbstractTypeConverter implements TypeConverter { 7 | 8 | /** 源类型 */ 9 | private Class sourceClass; 10 | 11 | /** 目标类型 */ 12 | private Class targetClass; 13 | 14 | public AbstractTypeConverter() { 15 | } 16 | 17 | public AbstractTypeConverter(Class sourceClass, Class targetClass) { 18 | this.sourceClass = sourceClass; 19 | this.targetClass = targetClass; 20 | } 21 | 22 | public Class getSourceTypeClass() { 23 | return this.sourceClass; 24 | } 25 | 26 | public Class getTargetTypeClass() { 27 | return this.targetClass; 28 | } 29 | 30 | public abstract Object convert(Class actualSourceClass, Class actualTargetClass, Object value); 31 | 32 | } 33 | -------------------------------------------------------------------------------- /dexcoder-commons/src/main/java/com/dexcoder/commons/bean/BeanConverterConfig.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.commons.bean; 2 | 3 | import java.lang.ref.SoftReference; 4 | import java.util.HashMap; 5 | import java.util.Map; 6 | 7 | /** 8 | * Java Bean 对象转换器配置 9 | *

10 | * User: liyd 11 | * Date: 13-5-10 下午1:56 12 | * version $Id: BeanConverterConfig.java, v 0.1 Exp $ 13 | */ 14 | public class BeanConverterConfig { 15 | 16 | /** 包含 BeanConverter 的 ContextClassLoader 实例索引 */ 17 | private static final ContextClassLoaderLocal BEANS_BY_CLASSLOADER = new ContextClassLoaderLocal() { 18 | 19 | // 创建默认的实例 20 | protected Object initialValue() { 21 | return new BeanConverterConfig(); 22 | } 23 | }; 24 | 25 | /** 对象的转换器 */ 26 | private SoftReference> converters = new SoftReference>( 27 | new HashMap()); 28 | 29 | /** 30 | * 获取实例,提供的功能应用于 {@link BeanConverter}. 31 | * 这是一个伪单例 - 每一个线程的ContextClassLoader提供一个单例的实例 32 | * 这种机制提供了在同一个web容器中部署的应用程序之间的隔离 33 | * 34 | * @return 该伪单例的实例 BeanConverterConfig 35 | */ 36 | public static BeanConverterConfig getInstance() { 37 | BeanConverterConfig beanConverterConfig = (BeanConverterConfig) BEANS_BY_CLASSLOADER.get(); 38 | return beanConverterConfig; 39 | } 40 | 41 | /** 42 | * 设置实例,提供的功能应用于 {@link BeanConverter}. 43 | * 这是一个伪单例 - 每一个线程的ContextClassLoader提供一个单例的实例 44 | * 这种机制提供了在同一个web容器中部署的应用程序之间的隔离 45 | * 46 | * @param newInstance 该伪单例的实例 BeanConverterConfig 47 | */ 48 | public static void setInstance(BeanConverterConfig newInstance) { 49 | BEANS_BY_CLASSLOADER.set(newInstance); 50 | } 51 | 52 | /** 53 | * 获取转换器key 54 | * 55 | * @param sourceClass 56 | * @param targetClass 57 | * @return 58 | */ 59 | public static String getCovertKey(Class sourceClass, Class targetClass) { 60 | return sourceClass.getName() + "_" + targetClass.getName(); 61 | } 62 | 63 | /** 64 | * 注册转换器 65 | * 66 | * @param converter the converter 67 | */ 68 | public void registerConverter(TypeConverter converter) { 69 | Map map = converters.get(); 70 | if (map == null) { 71 | converters = new SoftReference>(map = new HashMap()); 72 | } 73 | map.put(BeanConverterConfig.getCovertKey(converter.getSourceTypeClass(), converter.getTargetTypeClass()), 74 | converter); 75 | } 76 | 77 | /** 78 | * 移除注册的转换器 79 | * 80 | * @param sourceClass the source class 81 | * @param targetClass the target class 82 | */ 83 | public void unregisterConverter(Class sourceClass, Class targetClass) { 84 | Map map = converters.get(); 85 | if (map == null) { 86 | return; 87 | } 88 | map.remove(BeanConverterConfig.getCovertKey(sourceClass, targetClass)); 89 | } 90 | 91 | /** 92 | * 获取所有转换器 93 | * 94 | * @return 95 | */ 96 | public Map getConverters() { 97 | return converters.get(); 98 | } 99 | 100 | /** 101 | * 清空注册的转换器 102 | */ 103 | public void clearConverter() { 104 | this.converters.clear(); 105 | } 106 | 107 | } 108 | -------------------------------------------------------------------------------- /dexcoder-commons/src/main/java/com/dexcoder/commons/bean/EnumStringConverter.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.commons.bean; 2 | 3 | import com.dexcoder.commons.enums.IEnum; 4 | 5 | /** 6 | * IEnum到String转换器 7 | * 8 | * Created by liyd on 8/10/14. 9 | */ 10 | public class EnumStringConverter extends AbstractTypeConverter { 11 | 12 | public EnumStringConverter(Class sourceClass, Class targetClass) { 13 | super(sourceClass, targetClass); 14 | } 15 | 16 | public Object convert(Class actualSourceClass, Class actualTargetClass, Object value) { 17 | 18 | if (value == null) { 19 | return null; 20 | } 21 | if (IEnum.class.isAssignableFrom(this.getSourceTypeClass()) 22 | && this.getSourceTypeClass().isAssignableFrom(value.getClass()) 23 | && this.getTargetTypeClass().equals(String.class)) { 24 | 25 | return ((IEnum) value).getCode(); 26 | } else if (String.class.equals(this.getSourceTypeClass()) && this.getSourceTypeClass().equals(value.getClass()) 27 | && IEnum.class.isAssignableFrom(this.getTargetTypeClass())) { 28 | 29 | IEnum[] iEnums = (IEnum[]) actualTargetClass.getEnumConstants(); 30 | for (IEnum iEnum : iEnums) { 31 | if (iEnum.getCode().equals(String.valueOf(value))) { 32 | return iEnum; 33 | } 34 | } 35 | } 36 | return value; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /dexcoder-commons/src/main/java/com/dexcoder/commons/bean/LongIntegerConverter.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.commons.bean; 2 | 3 | /** 4 | * Created by liyd on 16/4/27. 5 | */ 6 | public class LongIntegerConverter extends AbstractTypeConverter { 7 | 8 | public LongIntegerConverter(Class sourceClass, Class targetClass) { 9 | super(sourceClass, targetClass); 10 | } 11 | 12 | @Override 13 | public Object convert(Class actualSourceClass, Class actualTargetClass, Object value) { 14 | if (value == null) { 15 | return null; 16 | } 17 | 18 | if (actualTargetClass.equals(Long.class)) { 19 | return Long.valueOf((Integer) value); 20 | } else { 21 | return ((Long) value).intValue(); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /dexcoder-commons/src/main/java/com/dexcoder/commons/bean/TypeConverter.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.commons.bean; 2 | 3 | /** 4 | * 数据类型转换接口 5 | *

6 | * User: liyd 7 | * Date: 13-5-9 下午12:04 8 | * version $Id: TypeConverter.java, v 0.1 Exp $ 9 | */ 10 | public interface TypeConverter { 11 | 12 | /** 13 | * 获取源类型class 14 | * 15 | * @return 源类型class 16 | */ 17 | Class getSourceTypeClass(); 18 | 19 | /** 20 | * 获取目标类型class 21 | * 22 | * @return 目标类型class 23 | */ 24 | Class getTargetTypeClass(); 25 | 26 | /** 27 | * 转换操作 28 | * 会有接口和实现类的关系,所以必须传入实际操作的类,不然枚举等类型会得不到具体的枚举值 29 | * 30 | * @param actualSourceClass the actual source class 31 | * @param actualTargetClass the actual target class 32 | * @param value The input value to be converted 33 | * @return The converted value 34 | */ 35 | Object convert(Class actualSourceClass, Class actualTargetClass, Object value); 36 | 37 | } 38 | -------------------------------------------------------------------------------- /dexcoder-commons/src/main/java/com/dexcoder/commons/cache/CacheMap.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.commons.cache; 2 | 3 | /** 4 | * 缓存MAP接口 5 | * 6 | * Created by liyd on 7/24/14. 7 | */ 8 | public interface CacheMap { 9 | 10 | /** 11 | * 返回当前缓存的大小 12 | * 13 | * @return 14 | */ 15 | public int size(); 16 | 17 | /** 18 | * 返回默认存活时间 19 | * 20 | * @return 21 | */ 22 | public long getDefaultExpire(); 23 | 24 | /** 25 | * 向缓存添加value对象,其在缓存中生存时间为默认值 26 | * 27 | * @param key 28 | * @param value 29 | */ 30 | public void put(K key, V value); 31 | 32 | /** 33 | * 向缓存添加value对象,并指定存活时间 34 | * 35 | * @param key 36 | * @param value 37 | * @param expire 过期时间 38 | */ 39 | public void put(K key, V value, long expire); 40 | 41 | /** 42 | * 查找缓存对象 43 | * 44 | * @param key 45 | * @return 46 | */ 47 | public V get(K key); 48 | 49 | /** 50 | * 淘汰对象 51 | * 52 | * @return 被删除对象大小 53 | */ 54 | public int eliminate(); 55 | 56 | /** 57 | * 缓存是否已经满 58 | * 59 | * @return 60 | */ 61 | public boolean isFull(); 62 | 63 | /** 64 | * 删除缓存对象 65 | * 66 | * @param key 67 | */ 68 | public void remove(K key); 69 | 70 | /** 71 | * 清除所有缓存对象 72 | */ 73 | public void clear(); 74 | 75 | /** 76 | * 返回缓存大小 77 | * 78 | * @return 79 | */ 80 | public int getCacheSize(); 81 | 82 | /** 83 | * 缓存中是否为空 84 | */ 85 | public boolean isEmpty(); 86 | } 87 | -------------------------------------------------------------------------------- /dexcoder-commons/src/main/java/com/dexcoder/commons/cache/DisableCache.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.commons.cache; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * 不设置自动缓存注解 10 | * 11 | * Created by liyd on 9/26/14. 12 | */ 13 | @Retention(RetentionPolicy.RUNTIME) 14 | @Target({ ElementType.METHOD, ElementType.TYPE }) 15 | public @interface DisableCache { 16 | } 17 | -------------------------------------------------------------------------------- /dexcoder-commons/src/main/java/com/dexcoder/commons/cache/EnableCache.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.commons.cache; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * Created by liyd on 1/6/15. 10 | */ 11 | @Retention(RetentionPolicy.RUNTIME) 12 | @Target({ ElementType.METHOD, ElementType.TYPE }) 13 | public @interface EnableCache { 14 | 15 | /** 数据实体对象 */ 16 | Class[] value(); 17 | } 18 | -------------------------------------------------------------------------------- /dexcoder-commons/src/main/java/com/dexcoder/commons/cache/FIFOCache.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.commons.cache; 2 | 3 | import java.util.Iterator; 4 | import java.util.LinkedHashMap; 5 | 6 | /** 7 | * FIFO缓存实现 8 | * 9 | * Created by liyd on 9/25/14. 10 | */ 11 | public class FIFOCache extends AbstractCacheMap { 12 | 13 | /** 14 | * 构造访求 15 | * 16 | * @param cacheSize 17 | * @param defaultExpire 18 | */ 19 | public FIFOCache(int cacheSize, long defaultExpire) { 20 | super(cacheSize, defaultExpire); 21 | cacheMap = new LinkedHashMap>(cacheSize + 1, 1F, false); 22 | } 23 | 24 | @Override 25 | protected int eliminateCache() { 26 | 27 | int count = 0; 28 | K firstKey = null; 29 | 30 | Iterator> iterator = cacheMap.values().iterator(); 31 | while (iterator.hasNext()) { 32 | CacheObject cacheObject = iterator.next(); 33 | 34 | if (cacheObject.isExpired()) { 35 | iterator.remove(); 36 | count++; 37 | } else { 38 | if (firstKey == null) { 39 | firstKey = cacheObject.key; 40 | } 41 | } 42 | } 43 | 44 | //删除过期对象还是满,继续删除链表第一个 45 | if (firstKey != null && isFull()) { 46 | cacheMap.remove(firstKey); 47 | } 48 | 49 | return count; 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /dexcoder-commons/src/main/java/com/dexcoder/commons/cache/LFUCache.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.commons.cache; 2 | 3 | import java.util.HashMap; 4 | import java.util.Iterator; 5 | 6 | /** 7 | * LFU缓存实现 8 | * 9 | * Created by liyd on 9/25/14. 10 | */ 11 | public class LFUCache extends AbstractCacheMap { 12 | 13 | /** 14 | * 构造方法 15 | * 16 | * @param cacheSize 17 | * @param defaultExpire 18 | */ 19 | public LFUCache(int cacheSize, long defaultExpire) { 20 | super(cacheSize, defaultExpire); 21 | cacheMap = new HashMap>(cacheSize + 1); 22 | } 23 | 24 | /** 25 | * 实现删除过期对象 和 删除访问次数最少的对象 26 | * 27 | */ 28 | @Override 29 | protected int eliminateCache() { 30 | Iterator> iterator = cacheMap.values().iterator(); 31 | int count = 0; 32 | long minAccessCount = Long.MAX_VALUE; 33 | while (iterator.hasNext()) { 34 | CacheObject cacheObject = iterator.next(); 35 | 36 | if (cacheObject.isExpired()) { 37 | iterator.remove(); 38 | count++; 39 | continue; 40 | } else { 41 | //记录下最少的访问次数 42 | minAccessCount = Math.min(cacheObject.accessCount, minAccessCount); 43 | } 44 | } 45 | 46 | if (count > 0) { 47 | return count; 48 | } 49 | 50 | if (minAccessCount != Long.MAX_VALUE) { 51 | 52 | iterator = cacheMap.values().iterator(); 53 | 54 | while (iterator.hasNext()) { 55 | CacheObject cacheObject = iterator.next(); 56 | 57 | cacheObject.accessCount -= minAccessCount; 58 | 59 | if (cacheObject.accessCount <= 0) { 60 | iterator.remove(); 61 | count++; 62 | } 63 | 64 | } 65 | 66 | } 67 | 68 | return count; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /dexcoder-commons/src/main/java/com/dexcoder/commons/cache/LRUCache.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.commons.cache; 2 | 3 | import java.util.Iterator; 4 | import java.util.LinkedHashMap; 5 | import java.util.Map; 6 | 7 | /** 8 | * LRU缓存实现 9 | * 10 | * Created by liyd on 7/24/14. 11 | */ 12 | public class LRUCache extends AbstractCacheMap { 13 | 14 | /** 15 | * 构造方法 16 | * 17 | * @param cacheSize 18 | * @param defaultExpire 19 | */ 20 | public LRUCache(int cacheSize, long defaultExpire) { 21 | 22 | super(cacheSize, defaultExpire); 23 | 24 | //linkedHash已经实现LRU算法 是通过双向链表来实现, 25 | // 当某个位置被命中,通过调整链表的指向将该位置调整到头位置, 26 | // 新加入的内容直接放在链表头,如此一来,最近被命中的内容就向链表头移动, 27 | // 需要替换时,链表最后的位置就是最近最少使用的位置 28 | this.cacheMap = new LinkedHashMap>(cacheSize + 1, 1f, true) { 29 | 30 | private static final long serialVersionUID = 4789439462791125917L; 31 | 32 | @Override 33 | protected boolean removeEldestEntry(Map.Entry> eldest) { 34 | 35 | return LRUCache.this.removeEldestEntry(eldest); 36 | } 37 | 38 | }; 39 | } 40 | 41 | /** 42 | * 插入元素时是否需要移除最老的元素(超过缓存大小时) 43 | * 44 | * @param eldest 45 | * @return 46 | */ 47 | private boolean removeEldestEntry(Map.Entry> eldest) { 48 | 49 | if (cacheSize == 0) 50 | return false; 51 | 52 | return size() > cacheSize; 53 | } 54 | 55 | /** 56 | * 只需要实现清除过期对象就可以了,linkedHashMap已经实现LRU 57 | */ 58 | @Override 59 | protected int eliminateCache() { 60 | 61 | if (!isNeedClearExpiredObject()) { 62 | return 0; 63 | } 64 | 65 | Iterator> iterator = cacheMap.values().iterator(); 66 | int count = 0; 67 | while (iterator.hasNext()) { 68 | CacheObject cacheObject = iterator.next(); 69 | 70 | if (cacheObject.isExpired()) { 71 | iterator.remove(); 72 | count++; 73 | } 74 | } 75 | 76 | return count; 77 | } 78 | 79 | } 80 | -------------------------------------------------------------------------------- /dexcoder-commons/src/main/java/com/dexcoder/commons/enums/IEnum.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.commons.enums; 2 | 3 | /** 4 | * 枚举接口 5 | * 6 | * User: liyd 7 | * Date: 14-1-13 8 | * Time: 下午4:13 9 | */ 10 | public interface IEnum { 11 | 12 | /** 13 | * 获取枚举编码 14 | * 15 | * @return 16 | */ 17 | public String getCode(); 18 | 19 | /** 20 | * 获取枚举描述 21 | * 22 | * @return 23 | */ 24 | public String getDesc(); 25 | } 26 | -------------------------------------------------------------------------------- /dexcoder-commons/src/main/java/com/dexcoder/commons/exceptions/AssistantException.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.commons.exceptions; 2 | 3 | import com.dexcoder.commons.enums.IEnum; 4 | 5 | /** 6 | * 自定义异常类 7 | *

8 | * Created by liyd on 6/27/14. 9 | */ 10 | public class AssistantException extends DexcoderException { 11 | 12 | /** 13 | * serialVersionUID 14 | */ 15 | private static final long serialVersionUID = -1921648378954132894L; 16 | 17 | public AssistantException(String message, Throwable e) { 18 | super(message, e); 19 | this.resultMsg = message; 20 | } 21 | 22 | /** 23 | * Instantiates a new AssistantException. 24 | * 25 | * @param e the e 26 | */ 27 | public AssistantException(Throwable e) { 28 | super(e); 29 | } 30 | 31 | /** 32 | * Instantiates a new AssistantException. 33 | * 34 | * @param iEnum 35 | */ 36 | public AssistantException(IEnum iEnum) { 37 | super(iEnum); 38 | } 39 | 40 | /** 41 | * Constructor 42 | * 43 | * @param message the message 44 | */ 45 | public AssistantException(String message) { 46 | super(message); 47 | } 48 | 49 | /** 50 | * Constructor 51 | * 52 | * @param code the code 53 | * @param message the message 54 | */ 55 | public AssistantException(String code, String message) { 56 | super(code, message); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /dexcoder-commons/src/main/java/com/dexcoder/commons/exceptions/CommonsAssistantException.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.commons.exceptions; 2 | 3 | import com.dexcoder.commons.enums.IEnum; 4 | 5 | /** 6 | * Created by liyd on 2015-12-9. 7 | */ 8 | public class CommonsAssistantException extends AssistantException { 9 | 10 | private static final long serialVersionUID = 7607256205561930553L; 11 | 12 | public CommonsAssistantException(String message, Throwable e) { 13 | super(message, e); 14 | this.resultMsg = message; 15 | } 16 | 17 | /** 18 | * Instantiates a new CommonsAssistantException. 19 | * 20 | * @param e the e 21 | */ 22 | public CommonsAssistantException(Throwable e) { 23 | super(e); 24 | } 25 | 26 | /** 27 | * Instantiates a new CommonsAssistantException. 28 | * 29 | * @param iEnum 30 | */ 31 | public CommonsAssistantException(IEnum iEnum) { 32 | super(iEnum); 33 | } 34 | 35 | /** 36 | * Constructor 37 | * 38 | * @param message the message 39 | */ 40 | public CommonsAssistantException(String message) { 41 | super(message); 42 | } 43 | 44 | /** 45 | * Constructor 46 | * 47 | * @param code the code 48 | * @param message the message 49 | */ 50 | public CommonsAssistantException(String code, String message) { 51 | super(code, message); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /dexcoder-commons/src/main/java/com/dexcoder/commons/exceptions/DexcoderException.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.commons.exceptions; 2 | 3 | import com.dexcoder.commons.enums.IEnum; 4 | 5 | /** 6 | * 自定义异常类 7 | *

8 | * Created by liyd on 6/27/14. 9 | */ 10 | public class DexcoderException extends RuntimeException { 11 | 12 | private static final long serialVersionUID = -3039546280700778038L; 13 | 14 | /** 15 | * Exception code 16 | */ 17 | protected String resultCode = "UN_KNOWN_EXCEPTION"; 18 | 19 | /** 20 | * Exception message 21 | */ 22 | protected String resultMsg = "未知异常"; 23 | 24 | /** 25 | * Instantiates a new DexcoderException. 26 | * 27 | * @param e the e 28 | */ 29 | public DexcoderException(IEnum e) { 30 | super(e.getDesc()); 31 | this.resultCode = e.getCode(); 32 | this.resultMsg = e.getDesc(); 33 | } 34 | 35 | public DexcoderException(String message, Throwable e) { 36 | super(message, e); 37 | this.resultMsg = message; 38 | } 39 | 40 | public DexcoderException(IEnum msgEnum, Throwable e) { 41 | super(msgEnum.getDesc(), e); 42 | this.resultCode = msgEnum.getCode(); 43 | this.resultMsg = msgEnum.getDesc(); 44 | } 45 | 46 | /** 47 | * Instantiates a new DexcoderException. 48 | * 49 | * @param e the e 50 | */ 51 | public DexcoderException(Throwable e) { 52 | super(e); 53 | this.resultMsg = e.getMessage(); 54 | } 55 | 56 | /** 57 | * Constructor 58 | * 59 | * @param message the message 60 | */ 61 | public DexcoderException(String message) { 62 | super(message); 63 | this.resultMsg = message; 64 | } 65 | 66 | /** 67 | * Constructor 68 | * 69 | * @param code the code 70 | * @param message the message 71 | */ 72 | public DexcoderException(String code, String message) { 73 | super(message); 74 | this.resultCode = code; 75 | this.resultMsg = message; 76 | } 77 | 78 | public String getResultCode() { 79 | return resultCode; 80 | } 81 | 82 | public void setResultCode(String resultCode) { 83 | this.resultCode = resultCode; 84 | } 85 | 86 | public String getResultMsg() { 87 | return resultMsg; 88 | } 89 | 90 | public void setResultMsg(String resultMsg) { 91 | this.resultMsg = resultMsg; 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /dexcoder-commons/src/main/java/com/dexcoder/commons/interceptor/RunBinderMvcInterceptor.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.commons.interceptor; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | import javax.servlet.http.HttpServletResponse; 5 | 6 | import org.slf4j.MDC; 7 | import org.springframework.web.servlet.HandlerInterceptor; 8 | import org.springframework.web.servlet.ModelAndView; 9 | 10 | import com.dexcoder.commons.result.RunBinder; 11 | 12 | /** 13 | * mvc拦截器 14 | * 15 | * Created by liyd on 4/9/14. 16 | */ 17 | public class RunBinderMvcInterceptor implements HandlerInterceptor { 18 | 19 | public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) 20 | throws Exception { 21 | MDC.put("threadKey", String.valueOf(System.nanoTime())); 22 | RunBinder.clear(); 23 | return true; 24 | } 25 | 26 | public void postHandle(HttpServletRequest request, HttpServletResponse response, Object o, ModelAndView modelAndView) 27 | throws Exception { 28 | 29 | //清理资源,防止OOM 30 | RunBinder.clear(); 31 | MDC.clear(); 32 | } 33 | 34 | public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, 35 | Object o, Exception e) throws Exception { 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /dexcoder-commons/src/main/java/com/dexcoder/commons/interceptor/RunBinderTransactionAspectSupport.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.commons.interceptor; 2 | 3 | import org.springframework.transaction.interceptor.TransactionAspectSupport; 4 | 5 | /** 6 | * Created by liyd on 16/3/17. 7 | */ 8 | public class RunBinderTransactionAspectSupport extends TransactionAspectSupport { 9 | 10 | public static void setRollbackOnly() { 11 | TransactionAspectSupport.TransactionInfo transactionInfo = currentTransactionInfo(); 12 | if (transactionInfo != null && transactionInfo.hasTransaction()) { 13 | transactionInfo.getTransactionStatus().setRollbackOnly(); 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /dexcoder-commons/src/main/java/com/dexcoder/commons/mvc/IEnumConverterFactory.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.commons.mvc; 2 | 3 | import org.apache.commons.lang3.StringUtils; 4 | import org.springframework.core.convert.converter.Converter; 5 | import org.springframework.core.convert.converter.ConverterFactory; 6 | 7 | import com.dexcoder.commons.enums.IEnum; 8 | import com.dexcoder.commons.utils.EnumUtils; 9 | 10 | /** 11 | * 枚举转换工厂 12 | *

13 | * User: liyd 14 | * Date: 14-1-20 15 | * Time: 下午9:11 16 | */ 17 | @SuppressWarnings({ "rawtypes", "unchecked" }) 18 | public class IEnumConverterFactory implements ConverterFactory { 19 | 20 | /** 21 | * Get the converter to convert from S to target type T, where T is also an instance of R. 22 | * 23 | * @param targetType the target type to convert to 24 | * @return A converter from S to T 25 | */ 26 | public Converter getConverter(Class targetType) { 27 | if (IEnum.class.isAssignableFrom(targetType)) { 28 | return new IEnumConverter(targetType); 29 | } 30 | return null; 31 | } 32 | 33 | /** 34 | * 枚举转换内部类 35 | * 36 | * @param 37 | */ 38 | private class IEnumConverter implements Converter { 39 | 40 | /** 41 | * 枚举类型 42 | */ 43 | private final Class enumType; 44 | 45 | public IEnumConverter(Class enumType) { 46 | this.enumType = enumType; 47 | } 48 | 49 | /** 50 | * 转换 51 | * 52 | * @param source 53 | * @return 54 | */ 55 | public T convert(String source) { 56 | if (StringUtils.isBlank(source)) { 57 | return null; 58 | } 59 | return EnumUtils.getEnum(enumType, source); 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /dexcoder-commons/src/main/java/com/dexcoder/commons/office/ExcelCell.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.commons.office; 2 | 3 | /** 4 | * row中的一列数据 5 | * 6 | * Created by liyd on 7/28/14. 7 | */ 8 | public class ExcelCell { 9 | 10 | /** 列值 */ 11 | private Object value; 12 | 13 | public ExcelCell() { 14 | } 15 | 16 | public ExcelCell(Object value) { 17 | this.value = value; 18 | } 19 | 20 | /** 21 | * 获取value值的字符串形式 22 | * 23 | * @return 24 | */ 25 | public String getStringValue() { 26 | if (this.value != null) { 27 | return value.toString(); 28 | } 29 | return ""; 30 | } 31 | 32 | public Object getValue() { 33 | return value; 34 | } 35 | 36 | public void setValue(Object value) { 37 | this.value = value; 38 | } 39 | 40 | @Override 41 | public String toString() { 42 | if (this.value != null) { 43 | return value.toString(); 44 | } 45 | return "null"; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /dexcoder-commons/src/main/java/com/dexcoder/commons/office/ExcelRow.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.commons.office; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import org.apache.commons.lang3.StringUtils; 7 | 8 | /** 9 | * sheet中的一行数据 10 | *

11 | * Created by liyd on 7/28/14. 12 | */ 13 | public class ExcelRow { 14 | 15 | /** 16 | * 行中的列 17 | */ 18 | private List cells; 19 | 20 | public ExcelRow() { 21 | cells = new ArrayList(); 22 | } 23 | 24 | public List getCells() { 25 | return cells; 26 | } 27 | 28 | public void setCells(Object... values) { 29 | for (Object value : values) { 30 | this.addCell(value); 31 | } 32 | } 33 | 34 | public void setCells(List cells) { 35 | this.cells = cells; 36 | } 37 | 38 | public int getTotalCellsNum() { 39 | return cells.size(); 40 | } 41 | 42 | public boolean hasCells() { 43 | return !cells.isEmpty(); 44 | } 45 | 46 | public boolean isEmptyRow() { 47 | if (cells.isEmpty()) { 48 | return true; 49 | } 50 | for (ExcelCell excelCell : cells) { 51 | if (excelCell != null && excelCell.getValue() != null && StringUtils.isNotBlank(excelCell.getStringValue())) { 52 | return false; 53 | } 54 | } 55 | return true; 56 | } 57 | 58 | public void addCell(Object value) { 59 | ExcelCell excelCell = new ExcelCell(value); 60 | this.cells.add(excelCell); 61 | } 62 | 63 | public ExcelCell getFirstCell() { 64 | return cells.isEmpty() ? null : cells.iterator().next(); 65 | } 66 | 67 | public ExcelCell getCell(int i) { 68 | return cells.isEmpty() ? null : cells.get(i); 69 | } 70 | 71 | public Object getCellValue(int i) { 72 | return cells.isEmpty() ? null : cells.get(i).getValue(); 73 | } 74 | 75 | public String getCellStringValue(int i) { 76 | return cells.isEmpty() ? null : cells.get(i).getStringValue(); 77 | } 78 | 79 | @Override 80 | public String toString() { 81 | 82 | if (cells == null) { 83 | return null; 84 | } 85 | StringBuilder sb = new StringBuilder(); 86 | for (ExcelCell excelCell : cells) { 87 | sb.append(excelCell == null ? "null" : excelCell.toString()).append(" "); 88 | } 89 | return sb.toString(); 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /dexcoder-commons/src/main/java/com/dexcoder/commons/office/ExcelStyleCreator.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Yolema.com Inc. 3 | * Copyright (c) 2011-2013 All Rights Reserved. 4 | */ 5 | package com.dexcoder.commons.office; 6 | 7 | import org.apache.poi.hssf.usermodel.HSSFCell; 8 | import org.apache.poi.hssf.usermodel.HSSFRow; 9 | import org.apache.poi.hssf.usermodel.HSSFSheet; 10 | import org.apache.poi.hssf.usermodel.HSSFWorkbook; 11 | 12 | /** 13 | * Excel样式创建方法接口 14 | * 15 | * @author liyd 16 | * @version $Id: ExcelStyleCreate.java, v 0.1 2013-1-17 上午10:43:55 liyd Exp $ 17 | */ 18 | public interface ExcelStyleCreator { 19 | 20 | /** 21 | * 按指定的标题创建一个sheet 22 | * 23 | * @param workbook 工作薄对象 24 | * @param excelSheet the excel sheet 25 | * @return hSSF sheet 26 | */ 27 | HSSFSheet createSheet(HSSFWorkbook workbook, ExcelSheet excelSheet); 28 | 29 | /** 30 | * 生成sheet列标题行 31 | * 32 | * @param workbook 工作薄对象 33 | * @param sheet sheet对象 34 | * @param excelSheet the excel sheet 35 | */ 36 | void createTitle(HSSFWorkbook workbook, HSSFSheet sheet, ExcelSheet excelSheet); 37 | 38 | /** 39 | * 创建行 40 | * 41 | * @param workbook 工作薄 42 | * @param sheet sheet对象 43 | * @param excelRow the sheet row 44 | * @param rowIndex 行索引 45 | * @throws Exception 46 | */ 47 | void createRow(HSSFWorkbook workbook, HSSFSheet sheet, ExcelRow excelRow, int rowIndex); 48 | 49 | /** 50 | * 创建列 51 | * 52 | * @param workbook 工作薄 53 | * @param sheet sheet对象 54 | * @param row 行对象 55 | * @param value 列值 56 | * @param rowIndex 行索引 57 | * @param cellIndex 列索引 58 | */ 59 | void createCell(HSSFWorkbook workbook, HSSFSheet sheet, HSSFRow row, Object value, int rowIndex, int cellIndex); 60 | 61 | /** 62 | * 创建日期列 63 | * 64 | * @param cell 列对象 65 | * @param value 列的值 66 | */ 67 | void createDateCellStyle(HSSFCell cell, Object value); 68 | 69 | /** 70 | * 创建图片列 71 | * 72 | * @param workbook 工作薄 73 | * @param sheet sheet对象 74 | * @param row 行对象 75 | * @param rowIndex 行索引 76 | * @param cellIndex 列索引 77 | * @param value 列的值 78 | */ 79 | void createPictureCellStyle(HSSFWorkbook workbook, HSSFSheet sheet, HSSFRow row, int rowIndex, int cellIndex, 80 | byte[] value); 81 | 82 | /** 83 | * 创建下拉列表列 84 | * 85 | * @param sheet sheet对象 86 | * @param cell cell对象 87 | * @param firstRowIndex 开始行索引 88 | * @param lastRowIndex 结束行索引 89 | * @param firstCellIndex 开始列索引 90 | * @param lastCellIndex 结束列索引 91 | * @param cellValue 列的值 92 | */ 93 | void createSelectCellStyle(HSSFSheet sheet, HSSFCell cell, int firstRowIndex, int lastRowIndex, int firstCellIndex, 94 | int lastCellIndex, String[] cellValue); 95 | 96 | /** 97 | * 创建默认格式列 98 | * 99 | * @param cell 列对象 100 | * @param value 列的值 101 | */ 102 | void createDefaultCellStyle(HSSFCell cell, Object value); 103 | 104 | } 105 | -------------------------------------------------------------------------------- /dexcoder-commons/src/main/java/com/dexcoder/commons/result/RunResult.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.commons.result; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * 执行消息返回结果 8 | * 9 | * User: liyd 10 | * Date: 2/13/14 11 | * Time: 4:34 PM 12 | */ 13 | public class RunResult { 14 | 15 | /** is success */ 16 | protected boolean success = true; 17 | 18 | /** result code */ 19 | protected String code; 20 | 21 | /** error message */ 22 | protected List errors; 23 | 24 | /** result message */ 25 | protected List messages; 26 | 27 | /** 28 | * Constructor 29 | */ 30 | public RunResult() { 31 | } 32 | 33 | /** 34 | * Constructor 35 | * 36 | * @param isSuccess the is success 37 | */ 38 | public RunResult(boolean isSuccess) { 39 | this.success = isSuccess; 40 | } 41 | 42 | /** 43 | * Constructor 44 | * 45 | * @param isSuccess the is success 46 | * @param resultCode the result code 47 | */ 48 | public RunResult(boolean isSuccess, String resultCode) { 49 | this.success = isSuccess; 50 | this.code = resultCode; 51 | } 52 | 53 | /** 54 | * 添加运行信息 55 | * 56 | * @param message 57 | */ 58 | public void addMessage(String message) { 59 | if (this.messages == null) { 60 | messages = new ArrayList(); 61 | } 62 | this.messages.add(message); 63 | } 64 | 65 | /** 66 | * 添加错误信息 67 | * 68 | * @param error 69 | */ 70 | public void addError(String error) { 71 | if (this.errors == null) { 72 | errors = new ArrayList(); 73 | } 74 | this.errors.add(error); 75 | } 76 | 77 | /** 78 | * 获取错误信息字符串,以;号分隔 79 | * 80 | * @return 81 | */ 82 | public String getStrErrors() { 83 | if (this.errors == null || this.errors.isEmpty()) { 84 | return null; 85 | } 86 | 87 | StringBuilder sb = new StringBuilder(); 88 | for (String error : errors) { 89 | sb.append(error); 90 | sb.append(";"); 91 | } 92 | return sb.toString(); 93 | } 94 | 95 | /** 96 | * 获取结果信息字符串,以;号分隔 97 | * 98 | * @return 99 | */ 100 | public String getStrMessages() { 101 | 102 | if (this.messages == null || this.messages.isEmpty()) { 103 | return null; 104 | } 105 | 106 | StringBuilder sb = new StringBuilder(); 107 | for (String resultMessage : messages) { 108 | sb.append(resultMessage); 109 | sb.append(";"); 110 | } 111 | return sb.toString(); 112 | } 113 | 114 | public boolean isSuccess() { 115 | return success; 116 | } 117 | 118 | public void setSuccess(boolean success) { 119 | this.success = success; 120 | } 121 | 122 | public List getMessages() { 123 | return messages; 124 | } 125 | 126 | public void setMessages(List messages) { 127 | this.messages = messages; 128 | } 129 | 130 | public String getCode() { 131 | return code; 132 | } 133 | 134 | public void setCode(String code) { 135 | this.code = code; 136 | } 137 | 138 | public List getErrors() { 139 | return errors; 140 | } 141 | 142 | public void setErrors(List errors) { 143 | this.errors = errors; 144 | } 145 | } 146 | -------------------------------------------------------------------------------- /dexcoder-commons/src/main/java/com/dexcoder/commons/utils/EncryptUtils.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.commons.utils; 2 | 3 | import java.math.BigInteger; 4 | import java.security.MessageDigest; 5 | 6 | import javax.crypto.Mac; 7 | import javax.crypto.SecretKey; 8 | import javax.crypto.spec.SecretKeySpec; 9 | 10 | import com.dexcoder.commons.exceptions.CommonsAssistantException; 11 | 12 | /** 13 | * Created by liyd on 7/2/14. 14 | */ 15 | public class EncryptUtils { 16 | 17 | /** 18 | * 对字符串md5加密 19 | * 20 | * @param str 21 | * @return 22 | */ 23 | public static String getMD5(String str) { 24 | 25 | try { 26 | 27 | // 生成一个MD5加密计算摘要 28 | MessageDigest md = MessageDigest.getInstance("MD5"); 29 | // 计算md5函数 30 | md.update(str.getBytes()); 31 | // digest()最后确定返回md5 hash值,返回值为8为字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符 32 | // BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值 33 | String md5 = new BigInteger(1, md.digest()).toString(16); 34 | //当数字以0开头时会去掉0,补齐 35 | if (md5.length() < 32) { 36 | md5 = String.format("%32s", md5).replace(' ', '0'); 37 | } 38 | return md5; 39 | } catch (Exception e) { 40 | throw new CommonsAssistantException("MD5加密出现错误", e); 41 | } 42 | } 43 | 44 | /** 45 | * 使用 HMAC-SHA1 签名方法对对encryptText进行签名 46 | * @param encryptText 被签名的字符串 47 | * @param encryptKey 密钥 48 | * @return 49 | * @throws Exception 50 | */ 51 | public static byte[] hmacSHA1Encrypt(String encryptText, String encryptKey) { 52 | try { 53 | byte[] data = encryptKey.getBytes(); 54 | //根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称 55 | SecretKey secretKey = new SecretKeySpec(data, "HmacSHA1"); 56 | //生成一个指定 Mac 算法 的 Mac 对象 57 | Mac mac = Mac.getInstance("HmacSHA1"); 58 | //用给定密钥初始化 Mac 对象 59 | mac.init(secretKey); 60 | 61 | byte[] text = encryptText.getBytes(); 62 | //完成 Mac 操作 63 | return mac.doFinal(text); 64 | } catch (Exception e) { 65 | throw new CommonsAssistantException("HmacSHA1加密出现错误", e); 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /dexcoder-commons/src/main/java/com/dexcoder/commons/utils/EnumUtils.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.commons.utils; 2 | 3 | import com.dexcoder.commons.enums.IEnum; 4 | import com.dexcoder.commons.exceptions.CommonsAssistantException; 5 | 6 | /** 7 | * 枚举辅助类 8 | * 9 | * User: liyd 10 | * Date: 14-1-25 11 | * Time: 上午10:17 12 | */ 13 | public final class EnumUtils { 14 | 15 | /** 16 | * 获取枚举的所有属性 17 | * 18 | * @param clazz 19 | * @return 20 | */ 21 | public static IEnum[] getEnums(Class clazz) { 22 | if (IEnum.class.isAssignableFrom(clazz)) { 23 | Object[] enumConstants = clazz.getEnumConstants(); 24 | return (IEnum[]) enumConstants; 25 | } 26 | return null; 27 | } 28 | 29 | /** 30 | * 获取枚举的所有属性 31 | * 32 | * @param enumClass 33 | * @return 34 | */ 35 | public static IEnum[] getEnums(String enumClass) { 36 | try { 37 | Class clazz = Thread.currentThread().getContextClassLoader().loadClass(enumClass); 38 | return getEnums(clazz); 39 | } catch (ClassNotFoundException e) { 40 | throw new CommonsAssistantException("加载枚举类失败", e); 41 | } 42 | } 43 | 44 | /** 45 | * 获取枚举的所有属性 46 | * 47 | * @param clazz the clazz 48 | * @param code the code 49 | * @return enum 50 | */ 51 | @SuppressWarnings("unchecked") 52 | public static T getEnum(Class clazz, String code) { 53 | if (!IEnum.class.isAssignableFrom(clazz)) { 54 | return null; 55 | } 56 | IEnum[] enumConstants = (IEnum[]) clazz.getEnumConstants(); 57 | for (IEnum enumConstant : enumConstants) { 58 | if (enumConstant.getCode().equalsIgnoreCase(code)) { 59 | return (T) enumConstant; 60 | } 61 | } 62 | return null; 63 | } 64 | 65 | /** 66 | * 获取枚举的所有属性 67 | * 68 | * @param clazzName the clazzName 69 | * @param code the code 70 | * @return enum 71 | */ 72 | @SuppressWarnings("unchecked") 73 | public static T getEnum(String clazzName, String code) { 74 | Class clazz = ClassUtils.loadClass(clazzName); 75 | if (!IEnum.class.isAssignableFrom(clazz)) { 76 | return null; 77 | } 78 | IEnum[] enumConstants = (IEnum[]) clazz.getEnumConstants(); 79 | for (IEnum enumConstant : enumConstants) { 80 | if (enumConstant.getCode().equalsIgnoreCase(code)) { 81 | return (T) enumConstant; 82 | } 83 | } 84 | return null; 85 | } 86 | 87 | public static String getEnumVal(String clazzName, String code) { 88 | Object anEnum = getEnum(clazzName, code); 89 | return anEnum == null ? code : ((IEnum) anEnum).getDesc(); 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /dexcoder-commons/src/main/java/com/dexcoder/commons/utils/SerializeUtils.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Yolema.com Inc. 3 | * Copyright (c) 2011-2012 All Rights Reserved. 4 | */ 5 | package com.dexcoder.commons.utils; 6 | 7 | import java.io.*; 8 | 9 | import org.apache.commons.codec.binary.Base64; 10 | import org.apache.commons.io.IOUtils; 11 | import org.apache.commons.lang3.StringUtils; 12 | 13 | import com.dexcoder.commons.exceptions.CommonsAssistantException; 14 | 15 | /** 16 | * 序列化辅助类 17 | * 18 | * @author liyd 19 | * @version $Id: SerializerUtil.java, v 0.1 2012-8-16 下午4:11:08 liyd Exp $ 20 | */ 21 | public final class SerializeUtils { 22 | 23 | private SerializeUtils() { 24 | } 25 | 26 | /** 27 | * 将对象序列化成字符串 28 | * 29 | * @param obj 30 | * @return 31 | */ 32 | public static String objectToString(Object obj) { 33 | 34 | if (obj == null) { 35 | return null; 36 | } 37 | 38 | ByteArrayOutputStream baops = null; 39 | ObjectOutputStream oos = null; 40 | try { 41 | baops = new ByteArrayOutputStream(); 42 | oos = new ObjectOutputStream(baops); 43 | oos.writeObject(obj); 44 | 45 | //产生编码问题,用base64保证完整性 46 | return Base64.encodeBase64String(baops.toByteArray()); 47 | 48 | } catch (IOException e) { 49 | throw new CommonsAssistantException("将对象序列化成字符串失败", e); 50 | } finally { 51 | IOUtils.closeQuietly(baops); 52 | IOUtils.closeQuietly(oos); 53 | } 54 | } 55 | 56 | /** 57 | * 将字符串反序列化成对象 58 | * 59 | * @param strObj 60 | * @return 61 | */ 62 | public static Object stringToObject(String strObj) { 63 | 64 | if (StringUtils.isBlank(strObj)) { 65 | return null; 66 | } 67 | 68 | ObjectInputStream ois = null; 69 | 70 | try { 71 | byte[] bytes = strObj.getBytes(); 72 | ois = new ObjectInputStream(new BufferedInputStream(new ByteArrayInputStream(Base64.decodeBase64(bytes)))); 73 | 74 | Object obj = ois.readObject(); 75 | return obj; 76 | } catch (Exception e) { 77 | throw new CommonsAssistantException("将字符串反序列化成对象失败", e); 78 | } finally { 79 | IOUtils.closeQuietly(ois); 80 | } 81 | 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /dexcoder-commons/src/main/java/com/dexcoder/commons/utils/TextUtils.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.commons.utils; 2 | 3 | import java.io.UnsupportedEncodingException; 4 | 5 | import org.apache.commons.lang3.ArrayUtils; 6 | import org.apache.commons.lang3.StringUtils; 7 | 8 | import com.dexcoder.commons.exceptions.CommonsAssistantException; 9 | 10 | /** 11 | * 字符文本操作 12 | * 太多的StringUtils了,命名为TextUtils 13 | *

14 | * Created by liyd on 2015-8-14. 15 | */ 16 | public class TextUtils { 17 | 18 | /** 19 | * 转换特殊符号 20 | * 21 | * @param str 22 | * @return 23 | */ 24 | public static String convertHtmlSpecialChars(String str) { 25 | if (StringUtils.isBlank(str)) { 26 | return null; 27 | } 28 | //最后一个中文全角空格换成英文,防止strin的trim方法失效 29 | String[][] chars = new String[][] { { "&", "&" }, { "<", "<" }, { ">", ">" }, { "\"", """ }, 30 | { " ", " " } }; 31 | return replaceChars(str, chars); 32 | } 33 | 34 | /** 35 | * 反转特殊符号,将转义后的符号转换回标签,以便缩进等格式化 36 | * 37 | * @param str 38 | * @return 39 | */ 40 | public static String reverseHtmlSpecialChars(String str) { 41 | if (StringUtils.isBlank(str)) { 42 | return null; 43 | } 44 | String[][] chars = new String[][] { { "&", "&" }, { "<", "<" }, { ">", ">" }, { """, "\"" }, 45 | { " ", " " } }; 46 | return replaceChars(str, chars); 47 | } 48 | 49 | public static String replaceChars(String str, String[][] chars) { 50 | for (String[] cs : chars) { 51 | str = str.replace(cs[0], cs[1]); 52 | } 53 | return str; 54 | } 55 | 56 | /** 57 | * 截取字符串,按byte长度,可以避免直接按length截取中英文混合显示长短差很多的情况 58 | * 59 | * @param text 60 | * @param length 61 | * @return 62 | */ 63 | public static String substringForByte(String text, int length) { 64 | 65 | return substringForByte(text, length, false); 66 | } 67 | 68 | /** 69 | * 截取字符串,按byte长度,可以避免直接按length截取中英文混合显示长短差很多的情况 70 | * 71 | * @param text 72 | * @param length 73 | * @return 74 | */ 75 | public static String substringForByte(String text, int length, boolean isConvertSpecialChars) { 76 | 77 | if (StringUtils.isBlank(text) || length < 1) { 78 | return text; 79 | } 80 | //转换特殊字符,页面显示时非常有用 81 | if (isConvertSpecialChars) { 82 | text = convertHtmlSpecialChars(text); 83 | } 84 | try { 85 | //防止中英文有长有短,转换成byte截取 86 | byte[] bytes = text.getBytes("GBK"); 87 | 88 | //截取 89 | byte[] contentNameBytes = ArrayUtils.subarray(bytes, 0, length); 90 | 91 | //处理截取了半个汉字的情况 92 | int count = 0; 93 | for (byte b : contentNameBytes) { 94 | if (b < 0) { 95 | count++; 96 | } 97 | } 98 | if (count % 2 != 0) { 99 | contentNameBytes = ArrayUtils.subarray(contentNameBytes, 0, contentNameBytes.length - 1); 100 | } 101 | 102 | String contentName = new String(contentNameBytes, "GBK"); 103 | 104 | return contentName; 105 | } catch (UnsupportedEncodingException e) { 106 | throw new CommonsAssistantException("根据byte截取字符串失败", e); 107 | } 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /dexcoder-commons/src/main/java/com/dexcoder/commons/utils/ThreadExecutionUtils.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.commons.utils; 2 | 3 | import java.util.concurrent.LinkedBlockingQueue; 4 | import java.util.concurrent.ThreadPoolExecutor; 5 | import java.util.concurrent.TimeUnit; 6 | 7 | /** 8 | * 线程执行工厂类 9 | * 10 | * @author liyd 11 | * 12 | */ 13 | public class ThreadExecutionUtils { 14 | 15 | /** 核心线程数 */ 16 | private static final int CORE_POOL_SIZE = 1; 17 | 18 | /** 最大线程数 */ 19 | private static final int MAXIMUM_POOL_SIZE = 5; 20 | 21 | /** 线程生存时间,单位秒 */ 22 | private static final long KEEP_ALIVE_TIME = 10; 23 | 24 | /** 线程池对象 */ 25 | private static ThreadPoolExecutor threadPoolExecutor; 26 | 27 | /** 28 | * 添加线程执行任务,采用无界队列。 调用者添加线程任务完成之后,调用shutdown()方法关闭线程池 29 | * 30 | * @param runnable 31 | */ 32 | public synchronized static void addTask(Runnable runnable) { 33 | 34 | if (threadPoolExecutor == null || threadPoolExecutor.isShutdown()) { 35 | threadPoolExecutor = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, 36 | KEEP_ALIVE_TIME, TimeUnit.SECONDS, new LinkedBlockingQueue(), 37 | new ThreadPoolExecutor.AbortPolicy()); 38 | } 39 | threadPoolExecutor.execute(runnable); 40 | // shutdown(); 41 | } 42 | 43 | /** 44 | * 关闭线程池 45 | */ 46 | public static void shutdown() { 47 | if (threadPoolExecutor == null || threadPoolExecutor.isShutdown()) { 48 | return; 49 | } 50 | threadPoolExecutor.shutdown(); 51 | } 52 | 53 | } 54 | -------------------------------------------------------------------------------- /dexcoder-commons/src/main/java/com/dexcoder/commons/utils/UUIDUtils.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.commons.utils; 2 | 3 | import java.util.UUID; 4 | 5 | /** 6 | * Created by liyd on 9/10/14. 7 | */ 8 | public class UUIDUtils { 9 | 10 | public static final String[] CHARS = new String[] { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", 11 | "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", 12 | "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", 13 | "S", "T", "U", "V", "W", "X", "Y", "Z" }; 14 | 15 | /** 16 | * 生成指定长度的uuid 17 | * 18 | * @param length 19 | * @return 20 | */ 21 | private static String getUUID(int length, UUID uuid) { 22 | int groupLength = 32 / length; 23 | StringBuilder sb = new StringBuilder(); 24 | String id = uuid.toString().replace("-", ""); 25 | for (int i = 0; i < length; i++) { 26 | String str = id.substring(i * groupLength, i * groupLength + groupLength); 27 | int x = Integer.parseInt(str, 16); 28 | sb.append(CHARS[x % 0x3E]); 29 | } 30 | return sb.toString(); 31 | } 32 | 33 | /** 34 | * 8位UUID 35 | * 36 | * @return 37 | */ 38 | public static String getUUID8() { 39 | return getUUID(8, UUID.randomUUID()); 40 | } 41 | 42 | /** 43 | * 8位UUID 44 | * 45 | * @return 46 | */ 47 | public static String getUUID8(byte[] bytes) { 48 | return getUUID(8, UUID.nameUUIDFromBytes(bytes)); 49 | } 50 | 51 | /** 52 | * 8位UUID 53 | * 54 | * @return 55 | */ 56 | public static String getUUID8(String fromString) { 57 | return getUUID(8, UUID.fromString(fromString)); 58 | } 59 | 60 | /** 61 | * 16位UUID 62 | * 63 | * @return 64 | */ 65 | public static String getUUID16() { 66 | return getUUID(16, UUID.randomUUID()); 67 | } 68 | 69 | /** 70 | * 16位UUID 71 | * 72 | * @return 73 | */ 74 | public static String getUUID16(String fromString) { 75 | return getUUID(16, UUID.fromString(fromString)); 76 | } 77 | 78 | /** 79 | * 16位UUID 80 | * 81 | * @return 82 | */ 83 | public static String getUUID16(byte[] bytes) { 84 | return getUUID(16, UUID.nameUUIDFromBytes(bytes)); 85 | } 86 | 87 | /** 88 | * 32位UUID 89 | * 90 | * @return 91 | */ 92 | public static String getUUID32() { 93 | return UUID.randomUUID().toString().replace("-", ""); 94 | } 95 | 96 | } 97 | -------------------------------------------------------------------------------- /dexcoder-commons/src/main/java/com/dexcoder/commons/utils/ZipUtils.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.commons.utils; 2 | 3 | import java.io.BufferedOutputStream; 4 | import java.io.File; 5 | import java.io.FileOutputStream; 6 | import java.util.zip.ZipEntry; 7 | import java.util.zip.ZipOutputStream; 8 | 9 | import org.apache.commons.io.FileUtils; 10 | import org.apache.commons.io.IOUtils; 11 | 12 | import com.dexcoder.commons.exceptions.CommonsAssistantException; 13 | 14 | /** 15 | * zip包压缩工具类 jdk原生实现,不支持中文 16 | */ 17 | public class ZipUtils { 18 | 19 | /** 20 | * 压缩打包文件成zip包 21 | * 22 | * @param srcFileName 23 | * @param targetFileName 24 | */ 25 | public static void zip(String srcFileName, String targetFileName) { 26 | 27 | ZipOutputStream zos = null; 28 | BufferedOutputStream bos = null; 29 | try { 30 | zos = new ZipOutputStream(new FileOutputStream(targetFileName)); 31 | bos = new BufferedOutputStream(zos); 32 | File srcFile = new File(srcFileName); 33 | zip(zos, srcFile, srcFile.getName(), bos); 34 | } catch (Exception e) { 35 | throw new CommonsAssistantException("压缩打包文件成zip包失败:" + srcFileName, e); 36 | } finally { 37 | IOUtils.closeQuietly(bos); 38 | IOUtils.closeQuietly(zos); 39 | } 40 | } 41 | 42 | /** 43 | * 打包压缩文件 44 | * 45 | * @param zos 46 | * @param file 47 | * @param base 48 | * @param bos 49 | * @throws Exception 50 | */ 51 | private static void zip(ZipOutputStream zos, File file, String base, BufferedOutputStream bos) throws Exception { 52 | if (file.isDirectory()) { 53 | // 创建zip压缩进入点base 54 | zos.putNextEntry(new ZipEntry(base + "/")); 55 | zos.flush(); 56 | File[] fl = file.listFiles(); 57 | for (int i = 0; i < fl.length; i++) { 58 | // 递归遍历子文件夹 59 | zip(zos, fl[i], base + "/" + fl[i].getName(), bos); 60 | } 61 | } else { 62 | //创建zip压缩进入点base 63 | zos.putNextEntry(new ZipEntry(base)); 64 | bos.write(FileUtils.readFileToByteArray(file)); 65 | bos.flush(); 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | dexcoder-assistant 7 | com.dexcoder 8 | 2.3.5 9 | 10 | 4.0.0 11 | dexcoder-dal-batis 12 | dexcoder-dal-batis 13 | 14 | 15 | com.dexcoder 16 | dexcoder-dal 17 | 2.3.5 18 | 19 | 20 | org.springframework 21 | spring-beans 22 | 23 | 24 | ognl 25 | ognl 26 | 27 | 28 | org.slf4j 29 | slf4j-api 30 | 31 | 32 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/BatisSqlFactory.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | import org.apache.commons.lang3.ArrayUtils; 7 | import org.apache.commons.lang3.StringUtils; 8 | 9 | import com.dexcoder.dal.BoundSql; 10 | import com.dexcoder.dal.SqlFactory; 11 | import com.dexcoder.dal.batis.build.Configuration; 12 | import com.dexcoder.dal.batis.build.MappedStatement; 13 | import com.dexcoder.dal.exceptions.JdbcAssistantException; 14 | 15 | /** 16 | * Created by liyd on 2015-11-24. 17 | */ 18 | public class BatisSqlFactory implements SqlFactory { 19 | 20 | /** 默认参数名 */ 21 | private static final String DEFAULT_PARAMETERS_KEY = "parameters"; 22 | 23 | private Configuration configuration; 24 | 25 | public BatisSqlFactory(Configuration configuration) { 26 | this.configuration = configuration; 27 | } 28 | 29 | public BoundSql getBoundSql(String refSql, String expectParamKey, Object[] parameters) { 30 | 31 | Map params = this.processParameters(expectParamKey, parameters); 32 | MappedStatement mappedStatement = this.configuration.getMappedStatements().get(refSql); 33 | if (mappedStatement == null) { 34 | throw new JdbcAssistantException("自定义sql没有找到,refSql=" + refSql); 35 | } 36 | return mappedStatement.getSqlSource().getBoundSql(params); 37 | } 38 | 39 | /** 40 | * 处理转换参数 41 | * 42 | * @param expectParamKey 43 | * @param parameters 44 | * @return 45 | */ 46 | private Map processParameters(String expectParamKey, Object[] parameters) { 47 | 48 | if (ArrayUtils.isEmpty(parameters)) { 49 | return null; 50 | } 51 | String paramKey = StringUtils.isBlank(expectParamKey) ? DEFAULT_PARAMETERS_KEY : expectParamKey; 52 | Map map = new HashMap(); 53 | if (parameters.length == 1) { 54 | map.put(paramKey, parameters[0]); 55 | } else { 56 | map.put(paramKey, parameters); 57 | } 58 | return map; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/BatisSqlFactoryBean.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis; 2 | 3 | import com.dexcoder.dal.handler.DefaultMappingHandler; 4 | import com.dexcoder.dal.handler.MappingHandler; 5 | import org.apache.commons.lang3.StringUtils; 6 | import org.springframework.beans.factory.FactoryBean; 7 | import org.springframework.beans.factory.InitializingBean; 8 | import org.springframework.core.io.Resource; 9 | import org.springframework.core.io.support.PathMatchingResourcePatternResolver; 10 | import org.springframework.core.io.support.ResourcePatternResolver; 11 | 12 | import com.dexcoder.dal.batis.build.Configuration; 13 | import com.dexcoder.dal.batis.xml.XMLMapperBuilder; 14 | import com.dexcoder.dal.exceptions.JdbcAssistantException; 15 | 16 | /** 17 | * Created by liyd on 2015-11-24. 18 | */ 19 | public class BatisSqlFactoryBean implements FactoryBean, InitializingBean { 20 | 21 | private String sqlLocation; 22 | 23 | private Configuration configuration; 24 | 25 | private MappingHandler mappingHandler; 26 | 27 | private BatisSqlFactory sqlFactory; 28 | 29 | public void afterPropertiesSet() throws Exception { 30 | this.configuration = new Configuration(); 31 | String[] sqlLocations = StringUtils.split(this.sqlLocation, ","); 32 | ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver(); 33 | for (String location : sqlLocations) { 34 | try { 35 | Resource[] resources = resourcePatternResolver.getResources(location); 36 | this.readResource(resources); 37 | } catch (Exception e) { 38 | throw new JdbcAssistantException("读取sqlLocation失败:" + location, e); 39 | } 40 | } 41 | } 42 | 43 | /** 44 | * 读取resource 45 | * 46 | * @param resources 47 | */ 48 | private void readResource(Resource[] resources) { 49 | 50 | for (Resource resource : resources) { 51 | try { 52 | XMLMapperBuilder mapperParser = new XMLMapperBuilder(resource, this.configuration,getMappingHandler()); 53 | mapperParser.parse(); 54 | } catch (Exception e) { 55 | throw new JdbcAssistantException("读取resource文件失败:" + resource.getFilename(), e); 56 | } 57 | } 58 | } 59 | 60 | /** 61 | * 获取名称处理器 62 | * 63 | * @return 64 | */ 65 | protected MappingHandler getMappingHandler() { 66 | 67 | if (this.mappingHandler == null) { 68 | this.mappingHandler = new DefaultMappingHandler(); 69 | } 70 | return this.mappingHandler; 71 | } 72 | 73 | public BatisSqlFactory getObject() throws Exception { 74 | this.sqlFactory = new BatisSqlFactory(this.configuration); 75 | return this.sqlFactory; 76 | } 77 | 78 | public Class getObjectType() { 79 | return BatisSqlFactory.class; 80 | } 81 | 82 | public boolean isSingleton() { 83 | return true; 84 | } 85 | 86 | public void setMappingHandler(MappingHandler mappingHandler) { 87 | this.mappingHandler = mappingHandler; 88 | } 89 | 90 | public void setSqlLocation(String sqlLocation) { 91 | this.sqlLocation = sqlLocation; 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/build/BaseBuilder.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.build; 2 | 3 | /** 4 | * Created by liyd on 2015-11-24. 5 | */ 6 | public abstract class BaseBuilder { 7 | 8 | protected final Configuration configuration; 9 | 10 | public BaseBuilder(Configuration configuration) { 11 | this.configuration = configuration; 12 | } 13 | 14 | public Configuration getConfiguration() { 15 | return configuration; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/build/BatisBoundSql.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.build; 2 | 3 | import java.util.ArrayList; 4 | import java.util.HashMap; 5 | import java.util.List; 6 | import java.util.Map; 7 | 8 | import com.dexcoder.dal.BoundSql; 9 | import com.dexcoder.dal.batis.reflection.MetaObject; 10 | 11 | /** 12 | * Created by liyd on 2015-11-25. 13 | */ 14 | public class BatisBoundSql implements BoundSql { 15 | 16 | private String sql; 17 | private List parameterMappings; 18 | private Object parameterObject; 19 | private Map additionalParameters; 20 | private MetaObject metaParameters; 21 | 22 | public BatisBoundSql(String sql, List parameterMappings, Object parameterObject) { 23 | this.sql = sql; 24 | this.parameterMappings = parameterMappings; 25 | this.parameterObject = parameterObject; 26 | this.additionalParameters = new HashMap(); 27 | this.metaParameters = MetaObject.forObject(additionalParameters); 28 | } 29 | 30 | public List getParameters() { 31 | List params = new ArrayList(); 32 | if (parameterMappings == null) { 33 | return params; 34 | } 35 | for (ParameterMapping parameterMapping : parameterMappings) { 36 | String property = parameterMapping.getProperty(); 37 | Object value = getAdditionalParameter(property); 38 | params.add(value); 39 | } 40 | return params; 41 | } 42 | 43 | public String getSql() { 44 | return sql; 45 | } 46 | 47 | public void setAdditionalParameter(String name, Object value) { 48 | metaParameters.setValue(name, value); 49 | } 50 | 51 | public Object getAdditionalParameter(String name) { 52 | return metaParameters.getValue(name); 53 | } 54 | 55 | public Object getParameterObject() { 56 | return parameterObject; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/build/Configuration.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.build; 2 | 3 | import com.dexcoder.dal.batis.reflection.MetaObject; 4 | import com.dexcoder.dal.batis.xml.XNode; 5 | 6 | import java.util.*; 7 | 8 | /** 9 | * Created by liyd on 2015-11-24. 10 | */ 11 | public class Configuration { 12 | 13 | protected final Set loadedResources = new HashSet(); 14 | 15 | protected final Map mappedStatements = new HashMap(); 16 | 17 | protected final Map sqlFragments = new HashMap(); 18 | 19 | protected Properties variables = new Properties(); 20 | 21 | public Map getSqlFragments() { 22 | return sqlFragments; 23 | } 24 | 25 | public Map getMappedStatements() { 26 | return mappedStatements; 27 | } 28 | 29 | public boolean isResourceLoaded(String resource) { 30 | return loadedResources.contains(resource); 31 | } 32 | 33 | public void addLoadedResource(String resource) { 34 | loadedResources.add(resource); 35 | } 36 | 37 | public Properties getVariables() { 38 | return variables; 39 | } 40 | 41 | public void addMappedStatement(MappedStatement ms) { 42 | mappedStatements.put(ms.getId(), ms); 43 | } 44 | 45 | public MetaObject newMetaObject(Object object) { 46 | return MetaObject.forObject(object); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/build/DynamicContext.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.build; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | import com.dexcoder.dal.exceptions.JdbcAssistantException; 7 | 8 | /** 9 | * Created by liyd on 2015-11-25. 10 | */ 11 | public class DynamicContext { 12 | 13 | private final Map bindings; 14 | private final StringBuilder sqlBuilder = new StringBuilder(); 15 | private int uniqueNumber = 0; 16 | 17 | @SuppressWarnings({ "rawtypes", "unchecked" }) 18 | public DynamicContext(Object parameterObject) { 19 | bindings = new HashMap(); 20 | if (parameterObject != null && !(parameterObject instanceof Map)) { 21 | throw new JdbcAssistantException("参数错误"); 22 | } 23 | if (parameterObject instanceof Map) { 24 | bindings.putAll((Map) parameterObject); 25 | } 26 | } 27 | 28 | public Map getBindings() { 29 | return bindings; 30 | } 31 | 32 | public void bind(String name, Object value) { 33 | bindings.put(name, value); 34 | } 35 | 36 | public void appendSql(String sql) { 37 | sqlBuilder.append(sql); 38 | sqlBuilder.append(" "); 39 | } 40 | 41 | public String getSql() { 42 | return sqlBuilder.toString().trim(); 43 | } 44 | 45 | public int getUniqueNumber() { 46 | return uniqueNumber++; 47 | } 48 | 49 | } 50 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/build/DynamicSqlSource.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.build; 2 | 3 | import java.util.Map; 4 | 5 | import com.dexcoder.dal.batis.xml.SqlNode; 6 | 7 | /** 8 | * Created by liyd on 2015-11-27. 9 | */ 10 | public class DynamicSqlSource implements SqlSource { 11 | 12 | private Configuration configuration; 13 | private SqlNode rootSqlNode; 14 | 15 | public DynamicSqlSource(Configuration configuration, SqlNode rootSqlNode) { 16 | this.configuration = configuration; 17 | this.rootSqlNode = rootSqlNode; 18 | } 19 | 20 | public BatisBoundSql getBoundSql(Object parameterObject) { 21 | DynamicContext context = new DynamicContext(parameterObject); 22 | rootSqlNode.apply(context); 23 | SqlSourceBuilder sqlSourceParser = new SqlSourceBuilder(configuration); 24 | SqlSource sqlSource = sqlSourceParser.parse(context.getSql()); 25 | BatisBoundSql boundSql = sqlSource.getBoundSql(parameterObject); 26 | for (Map.Entry entry : context.getBindings().entrySet()) { 27 | boundSql.setAdditionalParameter(entry.getKey(), entry.getValue()); 28 | } 29 | return boundSql; 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/build/MappedStatement.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.build; 2 | 3 | /** 4 | * Created by liyd on 2015-11-26. 5 | */ 6 | public final class MappedStatement { 7 | 8 | private Configuration configuration; 9 | private String id; 10 | private SqlSource sqlSource; 11 | 12 | MappedStatement() { 13 | // constructor disabled 14 | } 15 | 16 | public static class Builder { 17 | private MappedStatement mappedStatement = new MappedStatement(); 18 | 19 | public Builder(Configuration configuration, String id, SqlSource sqlSource) { 20 | mappedStatement.configuration = configuration; 21 | mappedStatement.id = id; 22 | mappedStatement.sqlSource = sqlSource; 23 | } 24 | 25 | public MappedStatement build() { 26 | assert mappedStatement.configuration != null; 27 | assert mappedStatement.id != null; 28 | assert mappedStatement.sqlSource != null; 29 | return mappedStatement; 30 | } 31 | } 32 | 33 | public String getId() { 34 | return id; 35 | } 36 | 37 | public SqlSource getSqlSource() { 38 | return sqlSource; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/build/MapperBuilderAssistant.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.build; 2 | 3 | import com.dexcoder.dal.exceptions.JdbcAssistantException; 4 | 5 | /** 6 | * Created by liyd on 2015-11-24. 7 | */ 8 | public class MapperBuilderAssistant extends BaseBuilder { 9 | 10 | private String currentNamespace; 11 | private String resource; 12 | 13 | public MapperBuilderAssistant(Configuration configuration, String resource) { 14 | super(configuration); 15 | this.resource = resource; 16 | } 17 | 18 | public void setCurrentNamespace(String currentNamespace) { 19 | if (currentNamespace == null) { 20 | throw new JdbcAssistantException("The mapper element requires a namespace attribute to be specified."); 21 | } 22 | 23 | if (this.currentNamespace != null && !this.currentNamespace.equals(currentNamespace)) { 24 | throw new JdbcAssistantException("Wrong namespace. Expected '" + this.currentNamespace + "' but found '" 25 | + currentNamespace + "'."); 26 | } 27 | 28 | this.currentNamespace = currentNamespace; 29 | } 30 | 31 | public String applyCurrentNamespace(String base, boolean isReference) { 32 | if (base == null) { 33 | return null; 34 | } 35 | if (isReference) { 36 | // is it qualified with any namespace yet? 37 | if (base.contains(".")) { 38 | return base; 39 | } 40 | } else { 41 | // is it qualified with this namespace yet? 42 | if (base.startsWith(currentNamespace + ".")) { 43 | return base; 44 | } 45 | if (base.contains(".")) { 46 | throw new JdbcAssistantException("Dots are not allowed in element names, please remove it from " + base); 47 | } 48 | } 49 | return currentNamespace + "." + base; 50 | } 51 | 52 | public MappedStatement addMappedStatement(String id, SqlSource sqlSource) { 53 | 54 | id = applyCurrentNamespace(id, false); 55 | MappedStatement.Builder statementBuilder = new MappedStatement.Builder(configuration, id, sqlSource); 56 | MappedStatement statement = statementBuilder.build(); 57 | configuration.addMappedStatement(statement); 58 | return statement; 59 | } 60 | 61 | public String getResource(){ 62 | return resource; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/build/ParameterMapping.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.build; 2 | 3 | /** 4 | * Created by liyd on 2015-11-27. 5 | */ 6 | public class ParameterMapping { 7 | 8 | private String property; 9 | // private String expression; 10 | 11 | private ParameterMapping() { 12 | } 13 | 14 | public static class Builder { 15 | 16 | private ParameterMapping parameterMapping = new ParameterMapping(); 17 | 18 | public Builder(String property) { 19 | parameterMapping.property = property; 20 | } 21 | 22 | public ParameterMapping build() { 23 | return parameterMapping; 24 | } 25 | } 26 | 27 | public String getProperty() { 28 | return property; 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/build/PropertyTokenizer.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.build; 2 | 3 | import java.util.Iterator; 4 | 5 | /** 6 | * Created by liyd on 2015-11-30. 7 | */ 8 | public class PropertyTokenizer implements Iterable, Iterator { 9 | private String name; 10 | private String indexedName; 11 | private String index; 12 | private String children; 13 | 14 | public PropertyTokenizer(String fullname) { 15 | int delim = fullname.indexOf('.'); 16 | if (delim > -1) { 17 | name = fullname.substring(0, delim); 18 | children = fullname.substring(delim + 1); 19 | } else { 20 | name = fullname; 21 | children = null; 22 | } 23 | indexedName = name; 24 | delim = name.indexOf('['); 25 | if (delim > -1) { 26 | index = name.substring(delim + 1, name.length() - 1); 27 | name = name.substring(0, delim); 28 | } 29 | } 30 | 31 | public String getName() { 32 | return name; 33 | } 34 | 35 | public String getIndex() { 36 | return index; 37 | } 38 | 39 | public String getIndexedName() { 40 | return indexedName; 41 | } 42 | 43 | public String getChildren() { 44 | return children; 45 | } 46 | 47 | public boolean hasNext() { 48 | return children != null; 49 | } 50 | 51 | public PropertyTokenizer next() { 52 | return new PropertyTokenizer(children); 53 | } 54 | 55 | public void remove() { 56 | throw new UnsupportedOperationException("Remove is not supported, as it has no meaning in the context of properties."); 57 | } 58 | 59 | public Iterator iterator() { 60 | return this; 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/build/RawSqlSource.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.build; 2 | 3 | import com.dexcoder.dal.batis.xml.SqlNode; 4 | 5 | /** 6 | * Created by liyd on 2015-11-30. 7 | */ 8 | public class RawSqlSource implements SqlSource { 9 | 10 | private final SqlSource sqlSource; 11 | 12 | public RawSqlSource(Configuration configuration, SqlNode rootSqlNode) { 13 | this(configuration, getSql(rootSqlNode)); 14 | } 15 | 16 | public RawSqlSource(Configuration configuration, String sql) { 17 | SqlSourceBuilder sqlSourceParser = new SqlSourceBuilder(configuration); 18 | sqlSource = sqlSourceParser.parse(sql); 19 | } 20 | 21 | private static String getSql(SqlNode rootSqlNode) { 22 | DynamicContext context = new DynamicContext(null); 23 | rootSqlNode.apply(context); 24 | return context.getSql(); 25 | } 26 | 27 | public BatisBoundSql getBoundSql(Object parameterObject) { 28 | return sqlSource.getBoundSql(parameterObject); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/build/SqlSource.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.build; 2 | 3 | /** 4 | * Created by liyd on 2015-11-25. 5 | */ 6 | public interface SqlSource { 7 | 8 | BatisBoundSql getBoundSql(Object parameterObject); 9 | 10 | } 11 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/build/SqlSourceBuilder.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.build; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import com.dexcoder.dal.handler.GenericTokenParser; 7 | import com.dexcoder.dal.handler.TokenHandler; 8 | 9 | /** 10 | * Created by liyd on 2015-11-27. 11 | */ 12 | public class SqlSourceBuilder extends BaseBuilder { 13 | 14 | public SqlSourceBuilder(Configuration configuration) { 15 | super(configuration); 16 | } 17 | 18 | public SqlSource parse(String originalSql) { 19 | ParameterMappingTokenHandler handler = new ParameterMappingTokenHandler(); 20 | GenericTokenParser parser = new GenericTokenParser("#{", "}", handler); 21 | String sql = parser.parse(originalSql); 22 | return new StaticSqlSource(sql, handler.getParameterMappings()); 23 | } 24 | 25 | private static class ParameterMappingTokenHandler implements TokenHandler { 26 | 27 | private List parameterMappings = new ArrayList(); 28 | 29 | public List getParameterMappings() { 30 | return parameterMappings; 31 | } 32 | 33 | public String handleToken(String content) { 34 | parameterMappings.add(buildParameterMapping(content)); 35 | return "?"; 36 | } 37 | 38 | private ParameterMapping buildParameterMapping(String content) { 39 | ParameterMapping.Builder builder = new ParameterMapping.Builder(content); 40 | return builder.build(); 41 | } 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/build/StaticSqlSource.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.build; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * Created by liyd on 2015-12-1. 7 | */ 8 | public class StaticSqlSource implements SqlSource { 9 | 10 | private String sql; 11 | private List parameterMappings; 12 | 13 | public StaticSqlSource(String sql) { 14 | this(sql, null); 15 | } 16 | 17 | public StaticSqlSource(String sql, List parameterMappings) { 18 | this.sql = sql; 19 | this.parameterMappings = parameterMappings; 20 | } 21 | 22 | public BatisBoundSql getBoundSql(Object parameterObject) { 23 | return new BatisBoundSql(sql, parameterMappings,parameterObject); 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/build/SystemMetaObject.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.build; 2 | 3 | import com.dexcoder.dal.batis.reflection.MetaObject; 4 | 5 | /** 6 | * Created by liyd on 2015-12-1. 7 | */ 8 | public final class SystemMetaObject { 9 | 10 | public static final MetaObject NULL_META_OBJECT = MetaObject.forObject(NullObject.class); 11 | 12 | private SystemMetaObject() { 13 | // Prevent Instantiation of Static Class 14 | } 15 | 16 | private static class NullObject { 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/ognl/ExpressionEvaluator.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.ognl; 2 | 3 | import java.lang.reflect.Array; 4 | import java.math.BigDecimal; 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | import java.util.Map; 8 | 9 | import com.dexcoder.dal.exceptions.JdbcAssistantException; 10 | 11 | /** 12 | * Created by liyd on 2015-11-30. 13 | */ 14 | public class ExpressionEvaluator { 15 | 16 | public boolean evaluateBoolean(String expression, Object parameterObject) { 17 | Object value = OgnlCache.getValue(expression, parameterObject); 18 | if (value instanceof Boolean) { 19 | return (Boolean) value; 20 | } 21 | if (value instanceof Number) { 22 | return !new BigDecimal(String.valueOf(value)).equals(BigDecimal.ZERO); 23 | } 24 | return value != null; 25 | } 26 | 27 | @SuppressWarnings("rawtypes") 28 | public Iterable evaluateIterable(String expression, Object parameterObject) { 29 | Object value = OgnlCache.getValue(expression, parameterObject); 30 | if (value == null) { 31 | throw new JdbcAssistantException("The expression '" + expression + "' evaluated to a null value."); 32 | } 33 | if (value instanceof Iterable) { 34 | return (Iterable) value; 35 | } 36 | if (value.getClass().isArray()) { 37 | // the array may be primitive, so Arrays.asList() may throw 38 | // a ClassCastException (issue 209). Do the work manually 39 | // Curse primitives! :) (JGB) 40 | int size = Array.getLength(value); 41 | List answer = new ArrayList(); 42 | for (int i = 0; i < size; i++) { 43 | Object o = Array.get(value, i); 44 | answer.add(o); 45 | } 46 | return answer; 47 | } 48 | if (value instanceof Map) { 49 | return ((Map) value).entrySet(); 50 | } 51 | throw new JdbcAssistantException("Error evaluating expression '" + expression + "'. Return value (" + value 52 | + ") was not iterable."); 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/ognl/OgnlCache.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.ognl; 2 | 3 | import java.util.Map; 4 | import java.util.concurrent.ConcurrentHashMap; 5 | 6 | import ognl.Ognl; 7 | import ognl.OgnlException; 8 | 9 | import com.dexcoder.dal.exceptions.JdbcAssistantException; 10 | 11 | /** 12 | * Created by liyd on 2015-11-30. 13 | */ 14 | public final class OgnlCache { 15 | 16 | private static final Map expressionCache = new ConcurrentHashMap(); 17 | 18 | private OgnlCache() { 19 | // Prevent Instantiation of Static Class 20 | } 21 | 22 | public static Object getValue(String expression, Object root) { 23 | try { 24 | return Ognl.getValue(parseExpression(expression), root); 25 | } catch (OgnlException e) { 26 | throw new JdbcAssistantException("Error evaluating expression '" + expression + "'. Cause: " + e, e); 27 | } 28 | } 29 | 30 | private static Object parseExpression(String expression) throws OgnlException { 31 | Object node = expressionCache.get(expression); 32 | if (node == null) { 33 | node = Ognl.parseExpression(expression); 34 | expressionCache.put(expression, node); 35 | } 36 | return node; 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/parser/ClassFieldHandler.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.parser; 2 | 3 | import com.dexcoder.commons.utils.ClassUtils; 4 | import com.dexcoder.dal.build.MetaTable; 5 | import com.dexcoder.dal.handler.MappingHandler; 6 | import com.dexcoder.dal.handler.TokenHandler; 7 | import org.apache.commons.lang3.StringUtils; 8 | 9 | import java.util.Arrays; 10 | import java.util.HashSet; 11 | import java.util.List; 12 | import java.util.Set; 13 | 14 | /** 15 | * Created by liyd on 16/3/31. 16 | */ 17 | public class ClassFieldHandler implements TokenHandler { 18 | 19 | private MappingHandler mappingHandler; 20 | 21 | public ClassFieldHandler(MappingHandler mappingHandler) { 22 | this.mappingHandler = mappingHandler; 23 | } 24 | 25 | public String handleToken(String content) { 26 | 27 | int start = StringUtils.indexOf(content, ")") + 1; 28 | int end = StringUtils.indexOf(content, "["); 29 | String clazzName = StringUtils.substring(content, start != -1 ? start : 0, end != -1 ? end : content.length()); 30 | String tableAlias = this.getTokenStr(content, "(", ")"); 31 | List includeFields = this.getTokenStrSplitList(content, "[+", "+]", ","); 32 | List excludeFields = this.getTokenStrSplitList(content, "[-", "-]", ","); 33 | Class clazz = ClassUtils.loadClass(StringUtils.trim(clazzName)); 34 | MetaTable metaTable = new MetaTable().initAutoFields().tableAlias(tableAlias).tableClass(clazz) 35 | .mappingHandler(mappingHandler); 36 | Set classFields = new HashSet(metaTable.getClassFields()); 37 | StringBuilder sb = new StringBuilder(); 38 | for (String field : classFields) { 39 | 40 | if (excludeFields.contains(field)) { 41 | continue; 42 | } 43 | String column = metaTable.getColumnAndTableAliasName(field); 44 | if (!includeFields.isEmpty()) { 45 | if (includeFields.contains(field)) { 46 | sb.append(column).append(","); 47 | } 48 | continue; 49 | } 50 | sb.append(column).append(","); 51 | } 52 | if (sb.length() > 0) { 53 | sb.deleteCharAt(sb.length() - 1); 54 | } 55 | return sb.toString(); 56 | } 57 | 58 | private List getTokenStrSplitList(String content, String openToken, String closeToken, String split) { 59 | String subStr = this.getTokenStr(content, openToken, closeToken); 60 | return Arrays.asList(StringUtils.split(subStr.replaceAll(" ", ""), split)); 61 | } 62 | 63 | private String getTokenStr(String content, String openToken, String closeToken) { 64 | int start = StringUtils.indexOf(content, openToken); 65 | int end = StringUtils.indexOf(content, closeToken); 66 | if (start == -1 || end == -1) { 67 | return ""; 68 | } 69 | return StringUtils.substring(content, start + openToken.length(), end); 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/parser/PropertyParser.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.parser; 2 | 3 | import java.util.Properties; 4 | 5 | import com.dexcoder.dal.handler.GenericTokenParser; 6 | import com.dexcoder.dal.handler.TokenHandler; 7 | 8 | /** 9 | * Created by liyd on 2015-11-24. 10 | */ 11 | public class PropertyParser { 12 | 13 | private PropertyParser() { 14 | // Prevent Instantiation 15 | } 16 | 17 | public static String parse(String string, Properties variables) { 18 | VariableTokenHandler handler = new VariableTokenHandler(variables); 19 | GenericTokenParser parser = new GenericTokenParser("${", "}", handler); 20 | return parser.parse(string); 21 | } 22 | 23 | private static class VariableTokenHandler implements TokenHandler { 24 | private Properties variables; 25 | 26 | public VariableTokenHandler(Properties variables) { 27 | this.variables = variables; 28 | } 29 | 30 | public String handleToken(String content) { 31 | if (variables != null && variables.containsKey(content)) { 32 | return variables.getProperty(content); 33 | } 34 | return "${" + content + "}"; 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/reflection/MetaClass.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.reflection; 2 | 3 | import java.beans.BeanInfo; 4 | import java.beans.PropertyDescriptor; 5 | import java.lang.reflect.Method; 6 | import java.util.ArrayList; 7 | import java.util.HashMap; 8 | import java.util.List; 9 | import java.util.Map; 10 | 11 | import com.dexcoder.commons.utils.ClassUtils; 12 | import com.dexcoder.dal.exceptions.JdbcAssistantException; 13 | 14 | /** 15 | * Created by liyd on 2015-12-1. 16 | */ 17 | public class MetaClass { 18 | 19 | private Class typeClass; 20 | private List fields = new ArrayList(); 21 | private Map readMethods = new HashMap(); 22 | private Map writeMethods = new HashMap(); 23 | 24 | public MetaClass(Class typeClass) { 25 | this.typeClass = typeClass; 26 | BeanInfo beanInfo = ClassUtils.getBeanInfo(typeClass); 27 | PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors(); 28 | for (PropertyDescriptor pd : pds) { 29 | String fieldName = pd.getName(); 30 | this.fields.add(fieldName); 31 | this.readMethods.put(fieldName, pd.getReadMethod()); 32 | this.writeMethods.put(fieldName, pd.getWriteMethod()); 33 | } 34 | } 35 | 36 | public Method getReadMethod(String field) { 37 | if (!fields.contains(field) || readMethods.get(field) == null) { 38 | throw new JdbcAssistantException(String.format("属性[%s]在类[%s]中不存在或没有getter方法", field, typeClass.getName())); 39 | } 40 | return readMethods.get(field); 41 | } 42 | 43 | public Method getWriteMethod(String field) { 44 | if (!field.contains(field) || writeMethods.get(field) == null) { 45 | throw new JdbcAssistantException(String.format("属性[%s]在类[%s]中不存在或没有setter方法", field, typeClass.getName())); 46 | } 47 | return writeMethods.get(field); 48 | } 49 | 50 | // public boolean hasSetter(String name) { 51 | // PropertyTokenizer prop = new PropertyTokenizer(name); 52 | // if (prop.hasNext()) { 53 | // if (reflector.hasSetter(prop.getName())) { 54 | // MetaClass metaProp = metaClassForProperty(prop.getName()); 55 | // return metaProp.hasSetter(prop.getChildren()); 56 | // } else { 57 | // return false; 58 | // } 59 | // } else { 60 | // return reflector.hasSetter(prop.getName()); 61 | // } 62 | // } 63 | // 64 | // public boolean hasGetter(String name) { 65 | // } 66 | 67 | } 68 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/wrapper/BeanWrapper.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.wrapper; 2 | 3 | import java.lang.reflect.Method; 4 | 5 | import com.dexcoder.commons.utils.ClassUtils; 6 | import com.dexcoder.dal.batis.build.PropertyTokenizer; 7 | import com.dexcoder.dal.batis.reflection.MetaClass; 8 | import com.dexcoder.dal.batis.reflection.MetaObject; 9 | 10 | /** 11 | * Created by liyd on 2015-12-1. 12 | */ 13 | public class BeanWrapper extends BaseWrapper { 14 | 15 | private Object object; 16 | private MetaClass metaClass; 17 | 18 | public BeanWrapper(MetaObject metaObject, Object object) { 19 | super(metaObject); 20 | this.object = object; 21 | this.metaClass = new MetaClass(object.getClass()); 22 | } 23 | 24 | public Object get(PropertyTokenizer prop) { 25 | if (prop.getIndex() != null) { 26 | Object collection = resolveCollection(prop, object); 27 | return getCollectionValue(prop, collection); 28 | } else { 29 | return getBeanProperty(prop, object); 30 | } 31 | } 32 | 33 | public void set(PropertyTokenizer prop, Object value) { 34 | if (prop.getIndex() != null) { 35 | Object collection = resolveCollection(prop, object); 36 | setCollectionValue(prop, collection, value); 37 | } else { 38 | setBeanProperty(prop, object, value); 39 | } 40 | } 41 | 42 | private Object getBeanProperty(PropertyTokenizer prop, Object object) { 43 | Method readMethod = metaClass.getReadMethod(prop.getName()); 44 | return ClassUtils.invokeMethod(readMethod, object); 45 | } 46 | 47 | private void setBeanProperty(PropertyTokenizer prop, Object object, Object value) { 48 | Method writeMethod = metaClass.getWriteMethod(prop.getName()); 49 | ClassUtils.invokeMethod(writeMethod, object, value); 50 | } 51 | 52 | // public String findProperty(String name, boolean useCamelCaseMapping) { 53 | // return null; 54 | // } 55 | // 56 | public MetaObject instantiatePropertyValue(String name, PropertyTokenizer prop) { 57 | Object newObject = ClassUtils.newInstance(object.getClass()); 58 | MetaObject metaValue = MetaObject.forObject(newObject); 59 | set(prop, newObject); 60 | return metaValue; 61 | } 62 | 63 | // 64 | // public String[] getGetterNames() { 65 | // return new String[0]; 66 | // } 67 | // 68 | // public String[] getSetterNames() { 69 | // return new String[0]; 70 | // } 71 | 72 | // public Class getSetterType(String name) { 73 | // return null; 74 | // } 75 | // 76 | // public Class getGetterType(String name) { 77 | // return null; 78 | // } 79 | 80 | // public boolean hasSetter(String name) { 81 | // return false; 82 | // } 83 | 84 | // public boolean hasGetter(String name) { 85 | // return false; 86 | // } 87 | 88 | // public boolean isCollection() { 89 | // return false; 90 | // } 91 | 92 | // public void add(Object element) { 93 | // throw new UnsupportedOperationException(); 94 | // } 95 | // 96 | // public void addAll(List list) { 97 | // throw new UnsupportedOperationException(); 98 | // } 99 | 100 | } 101 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/wrapper/CollectionWrapper.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.wrapper; 2 | 3 | import java.util.Collection; 4 | 5 | import com.dexcoder.dal.batis.build.PropertyTokenizer; 6 | import com.dexcoder.dal.batis.reflection.MetaObject; 7 | 8 | /** 9 | * Created by liyd on 2015-12-1. 10 | */ 11 | public class CollectionWrapper implements ObjectWrapper { 12 | 13 | // private Collection object; 14 | 15 | public CollectionWrapper(MetaObject metaObject, Collection object) { 16 | // this.object = object; 17 | } 18 | 19 | public Object get(PropertyTokenizer prop) { 20 | throw new UnsupportedOperationException(); 21 | } 22 | 23 | public void set(PropertyTokenizer prop, Object value) { 24 | throw new UnsupportedOperationException(); 25 | } 26 | 27 | // public boolean hasGetter(String name) { 28 | // throw new UnsupportedOperationException(); 29 | // } 30 | 31 | public MetaObject instantiatePropertyValue(String name, PropertyTokenizer prop) { 32 | throw new UnsupportedOperationException(); 33 | } 34 | // 35 | // public boolean isCollection() { 36 | // return true; 37 | // } 38 | 39 | // public void add(Object element) { 40 | // object.add(element); 41 | // } 42 | 43 | // public void addAll(List element) { 44 | // object.addAll(element); 45 | // } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/wrapper/MapWrapper.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.wrapper; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | import com.dexcoder.dal.batis.build.PropertyTokenizer; 7 | import com.dexcoder.dal.batis.reflection.MetaObject; 8 | 9 | /** 10 | * Created by liyd on 2015-12-1. 11 | */ 12 | public class MapWrapper extends BaseWrapper { 13 | 14 | private Map map; 15 | 16 | public MapWrapper(MetaObject metaObject, Map map) { 17 | super(metaObject); 18 | this.map = map; 19 | } 20 | 21 | public Object get(PropertyTokenizer prop) { 22 | if (prop.getIndex() != null) { 23 | Object collection = resolveCollection(prop, map); 24 | return getCollectionValue(prop, collection); 25 | } else { 26 | return map.get(prop.getName()); 27 | } 28 | } 29 | 30 | public void set(PropertyTokenizer prop, Object value) { 31 | if (prop.getIndex() != null) { 32 | Object collection = resolveCollection(prop, map); 33 | setCollectionValue(prop, collection, value); 34 | } else { 35 | map.put(prop.getName(), value); 36 | } 37 | } 38 | 39 | // public boolean hasGetter(String name) { 40 | // PropertyTokenizer prop = new PropertyTokenizer(name); 41 | // if (prop.hasNext()) { 42 | // if (map.containsKey(prop.getIndexedName())) { 43 | // MetaObject metaValue = metaObject.metaObjectForProperty(prop.getIndexedName()); 44 | // if (metaValue == SystemMetaObject.NULL_META_OBJECT) { 45 | // return true; 46 | // } else { 47 | // return metaValue.hasGetter(prop.getChildren()); 48 | // } 49 | // } else { 50 | // return false; 51 | // } 52 | // } else { 53 | // return map.containsKey(prop.getName()); 54 | // } 55 | // } 56 | 57 | public MetaObject instantiatePropertyValue(String name, PropertyTokenizer prop) { 58 | HashMap map = new HashMap(); 59 | set(prop, map); 60 | return MetaObject.forObject(map); 61 | } 62 | 63 | // public boolean isCollection() { 64 | // return false; 65 | // } 66 | 67 | // public void add(Object element) { 68 | // throw new UnsupportedOperationException(); 69 | // } 70 | // 71 | // public void addAll(List element) { 72 | // throw new UnsupportedOperationException(); 73 | // } 74 | 75 | } 76 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/wrapper/ObjectWrapper.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.wrapper; 2 | 3 | import com.dexcoder.dal.batis.build.PropertyTokenizer; 4 | import com.dexcoder.dal.batis.reflection.MetaObject; 5 | 6 | /** 7 | * Created by liyd on 2015-11-30. 8 | */ 9 | public interface ObjectWrapper { 10 | 11 | Object get(PropertyTokenizer prop); 12 | 13 | void set(PropertyTokenizer prop, Object value); 14 | 15 | // String findProperty(String name, boolean useCamelCaseMapping); 16 | // 17 | // String[] getGetterNames(); 18 | // 19 | // String[] getSetterNames(); 20 | 21 | // Class getSetterType(String name); 22 | // 23 | // Class getGetterType(String name); 24 | 25 | // boolean hasSetter(String name); 26 | 27 | // boolean hasGetter(String name); 28 | 29 | MetaObject instantiatePropertyValue(String name, PropertyTokenizer prop); 30 | 31 | // boolean isCollection(); 32 | 33 | // void add(Object element); 34 | 35 | // void addAll(List element); 36 | 37 | } 38 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/xml/ChooseSqlNode.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.xml; 2 | 3 | import com.dexcoder.dal.batis.build.DynamicContext; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * Created by liyd on 2015-11-30. 9 | */ 10 | public class ChooseSqlNode implements SqlNode { 11 | private SqlNode defaultSqlNode; 12 | private List ifSqlNodes; 13 | 14 | public ChooseSqlNode(List ifSqlNodes, SqlNode defaultSqlNode) { 15 | this.ifSqlNodes = ifSqlNodes; 16 | this.defaultSqlNode = defaultSqlNode; 17 | } 18 | 19 | public boolean apply(DynamicContext context) { 20 | for (SqlNode sqlNode : ifSqlNodes) { 21 | if (sqlNode.apply(context)) { 22 | return true; 23 | } 24 | } 25 | if (defaultSqlNode != null) { 26 | defaultSqlNode.apply(context); 27 | return true; 28 | } 29 | return false; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/xml/IfSqlNode.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.xml; 2 | 3 | import com.dexcoder.dal.batis.build.DynamicContext; 4 | import com.dexcoder.dal.batis.ognl.ExpressionEvaluator; 5 | 6 | /** 7 | * Created by liyd on 2015-11-30. 8 | */ 9 | public class IfSqlNode implements SqlNode { 10 | private ExpressionEvaluator evaluator; 11 | private String test; 12 | private SqlNode contents; 13 | 14 | public IfSqlNode(SqlNode contents, String test) { 15 | this.test = test; 16 | this.contents = contents; 17 | this.evaluator = new ExpressionEvaluator(); 18 | } 19 | 20 | public boolean apply(DynamicContext context) { 21 | if (evaluator.evaluateBoolean(test, context.getBindings())) { 22 | contents.apply(context); 23 | return true; 24 | } 25 | return false; 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/xml/MixedSqlNode.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.xml; 2 | 3 | import com.dexcoder.dal.batis.build.DynamicContext; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * Created by liyd on 2015-11-25. 9 | */ 10 | public class MixedSqlNode implements SqlNode { 11 | private List contents; 12 | 13 | public MixedSqlNode(List contents) { 14 | this.contents = contents; 15 | } 16 | 17 | public boolean apply(DynamicContext context) { 18 | for (SqlNode sqlNode : contents) { 19 | sqlNode.apply(context); 20 | } 21 | return true; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/xml/SetSqlNode.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.xml; 2 | 3 | import com.dexcoder.dal.batis.build.Configuration; 4 | 5 | import java.util.Arrays; 6 | import java.util.List; 7 | 8 | /** 9 | * Created by liyd on 2015-11-30. 10 | */ 11 | public class SetSqlNode extends TrimSqlNode { 12 | 13 | private static List suffixList = Arrays.asList(","); 14 | 15 | public SetSqlNode(Configuration configuration, SqlNode contents) { 16 | super(configuration, contents, "SET", null, null, suffixList); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/xml/SqlNode.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.xml; 2 | 3 | import com.dexcoder.dal.batis.build.DynamicContext; 4 | 5 | /** 6 | * Created by liyd on 2015-11-25. 7 | */ 8 | public interface SqlNode { 9 | boolean apply(DynamicContext context); 10 | } 11 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/xml/StaticTextSqlNode.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.xml; 2 | 3 | import com.dexcoder.dal.batis.build.DynamicContext; 4 | 5 | /** 6 | * Created by liyd on 2015-11-30. 7 | */ 8 | public class StaticTextSqlNode implements SqlNode { 9 | private String text; 10 | 11 | public StaticTextSqlNode(String text) { 12 | this.text = text; 13 | } 14 | 15 | public boolean apply(DynamicContext context) { 16 | context.appendSql(text); 17 | return true; 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/xml/TextSqlNode.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.xml; 2 | 3 | import java.util.regex.Pattern; 4 | 5 | import com.dexcoder.dal.batis.build.DynamicContext; 6 | import com.dexcoder.dal.exceptions.JdbcAssistantException; 7 | import com.dexcoder.dal.handler.GenericTokenParser; 8 | import com.dexcoder.dal.handler.TokenHandler; 9 | 10 | /** 11 | * Created by liyd on 2015-11-26. 12 | */ 13 | public class TextSqlNode implements SqlNode { 14 | private String text; 15 | private Pattern injectionFilter; 16 | 17 | public TextSqlNode(String text) { 18 | this(text, null); 19 | } 20 | 21 | public TextSqlNode(String text, Pattern injectionFilter) { 22 | this.text = text; 23 | this.injectionFilter = injectionFilter; 24 | } 25 | 26 | public boolean isDynamic() { 27 | DynamicCheckerTokenParser checker = new DynamicCheckerTokenParser(); 28 | GenericTokenParser parser = createParser(checker); 29 | parser.parse(text); 30 | return checker.isDynamic(); 31 | } 32 | 33 | public boolean apply(DynamicContext context) { 34 | GenericTokenParser parser = createParser(new BindingTokenParser(context, injectionFilter)); 35 | context.appendSql(parser.parse(text)); 36 | return true; 37 | } 38 | 39 | private GenericTokenParser createParser(TokenHandler handler) { 40 | return new GenericTokenParser("${", "}", handler); 41 | } 42 | 43 | private static class BindingTokenParser implements TokenHandler { 44 | 45 | private DynamicContext context; 46 | private Pattern injectionFilter; 47 | 48 | public BindingTokenParser(DynamicContext context, Pattern injectionFilter) { 49 | this.context = context; 50 | this.injectionFilter = injectionFilter; 51 | } 52 | 53 | public String handleToken(String content) { 54 | Object parameter = context.getBindings().get("_parameter"); 55 | if (parameter == null) { 56 | context.getBindings().put("value", null); 57 | } 58 | // else if (SimpleTypeRegistry.isSimpleType(parameter.getClass())) { 59 | // context.getBindings().put("value", parameter); 60 | // } 61 | // Object value = OgnlCache.getValue(content, context.getBindings()); 62 | Object value = null; 63 | String srtValue = (value == null ? "" : String.valueOf(value)); // issue #274 return "" instead of "null" 64 | checkInjection(srtValue); 65 | return srtValue; 66 | } 67 | 68 | private void checkInjection(String value) { 69 | if (injectionFilter != null && !injectionFilter.matcher(value).matches()) { 70 | throw new JdbcAssistantException("Invalid input. Please conform to regex" + injectionFilter.pattern()); 71 | } 72 | } 73 | } 74 | 75 | private static class DynamicCheckerTokenParser implements TokenHandler { 76 | 77 | private boolean isDynamic; 78 | 79 | public DynamicCheckerTokenParser() { 80 | // Prevent Synthetic Access 81 | } 82 | 83 | public boolean isDynamic() { 84 | return isDynamic; 85 | } 86 | 87 | public String handleToken(String content) { 88 | this.isDynamic = true; 89 | return null; 90 | } 91 | } 92 | 93 | } 94 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/xml/VarDeclSqlNode.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.xml; 2 | 3 | import com.dexcoder.dal.batis.ognl.OgnlCache; 4 | import com.dexcoder.dal.batis.build.DynamicContext; 5 | 6 | /** 7 | * Created by liyd on 2015-11-30. 8 | */ 9 | public class VarDeclSqlNode implements SqlNode { 10 | 11 | private final String name; 12 | private final String expression; 13 | 14 | public VarDeclSqlNode(String var, String exp) { 15 | name = var; 16 | expression = exp; 17 | } 18 | 19 | public boolean apply(DynamicContext context) { 20 | final Object value = OgnlCache.getValue(expression, context.getBindings()); 21 | context.bind(name, value); 22 | return true; 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/xml/WhereSqlNode.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.xml; 2 | 3 | import com.dexcoder.dal.batis.build.Configuration; 4 | 5 | import java.util.Arrays; 6 | import java.util.List; 7 | 8 | /** 9 | * Created by liyd on 2015-11-30. 10 | */ 11 | public class WhereSqlNode extends TrimSqlNode { 12 | 13 | private static List prefixList = Arrays.asList("AND ", "OR ", "AND\n", "OR\n", "AND\r", "OR\r", "AND\t", "OR\t"); 14 | 15 | public WhereSqlNode(Configuration configuration, SqlNode contents) { 16 | super(configuration, contents, "WHERE", prefixList, null, null); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/xml/XMLMapperEntityResolver.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.xml; 2 | 3 | import java.io.InputStream; 4 | import java.util.HashMap; 5 | import java.util.Locale; 6 | import java.util.Map; 7 | 8 | import org.xml.sax.EntityResolver; 9 | import org.xml.sax.InputSource; 10 | import org.xml.sax.SAXException; 11 | 12 | import com.dexcoder.commons.utils.ClassUtils; 13 | 14 | /** 15 | * Offline entity resolver for the MyBatis DTDs 16 | * 17 | * @author Clinton Begin 18 | */ 19 | public class XMLMapperEntityResolver implements EntityResolver { 20 | 21 | private static final Map DOCTYPE_MAP = new HashMap(); 22 | 23 | private static final String BATIS_MAPPER_PUBLIC = "-//dexcoder.com//DTD Mapper 2.0//EN" 24 | .toUpperCase(Locale.ENGLISH); 25 | private static final String MYBATIS_MAPPER_SYSTEM = "http://mybatis.org/dtd/mybatis-3-mapper.dtd" 26 | .toUpperCase(Locale.ENGLISH); 27 | private static final String BATIS_MAPPER_DTD = "batis-mapper.dtd"; 28 | 29 | static { 30 | 31 | DOCTYPE_MAP.put(BATIS_MAPPER_PUBLIC, BATIS_MAPPER_DTD); 32 | 33 | DOCTYPE_MAP.put(MYBATIS_MAPPER_SYSTEM, BATIS_MAPPER_DTD); 34 | } 35 | 36 | /* 37 | * Converts a public DTD into a local one 38 | * 39 | * @param publicId The public id that is what comes after "PUBLIC" 40 | * @param systemId The system id that is what comes after the public id. 41 | * @return The InputSource for the DTD 42 | * 43 | * @throws org.xml.sax.SAXException If anything goes wrong 44 | */ 45 | public InputSource resolveEntity(String publicId, String systemId) throws SAXException { 46 | 47 | if (publicId != null) { 48 | publicId = publicId.toUpperCase(Locale.ENGLISH); 49 | } 50 | if (systemId != null) { 51 | systemId = systemId.toUpperCase(Locale.ENGLISH); 52 | } 53 | 54 | InputSource source; 55 | try { 56 | String path = DOCTYPE_MAP.get(publicId); 57 | source = getInputSource(path); 58 | if (source == null) { 59 | path = DOCTYPE_MAP.get(systemId); 60 | source = getInputSource(path); 61 | } 62 | } catch (Exception e) { 63 | throw new SAXException(e); 64 | } 65 | return source; 66 | } 67 | 68 | private InputSource getInputSource(String path) { 69 | if (path != null) { 70 | InputStream in; 71 | in = ClassUtils.getDefaultClassLoader().getResourceAsStream(path); 72 | return new InputSource(in); 73 | } 74 | return null; 75 | } 76 | 77 | } 78 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/java/com/dexcoder/dal/batis/xml/XMLStatementBuilder.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.batis.xml; 2 | 3 | import com.dexcoder.dal.batis.build.BaseBuilder; 4 | import com.dexcoder.dal.batis.build.Configuration; 5 | import com.dexcoder.dal.batis.build.MapperBuilderAssistant; 6 | import com.dexcoder.dal.batis.build.SqlSource; 7 | 8 | /** 9 | * Created by liyd on 2015-11-24. 10 | */ 11 | public class XMLStatementBuilder extends BaseBuilder { 12 | 13 | private MapperBuilderAssistant builderAssistant; 14 | private XNode xNode; 15 | 16 | public XMLStatementBuilder(Configuration configuration, MapperBuilderAssistant builderAssistant, XNode xNode) { 17 | super(configuration); 18 | this.builderAssistant = builderAssistant; 19 | this.xNode = xNode; 20 | } 21 | 22 | public void parseStatementNode() { 23 | String id = xNode.getStringAttribute("id"); 24 | 25 | // Include Fragments before parsing 26 | XMLIncludeTransformer includeParser = new XMLIncludeTransformer(configuration, builderAssistant); 27 | includeParser.applyIncludes(xNode.getNode()); 28 | 29 | // SqlSource sqlSource = new XMLLanguageDriver().createSqlSource(configuration, xNode); 30 | 31 | XMLScriptBuilder builder = new XMLScriptBuilder(configuration, xNode); 32 | SqlSource sqlSource = builder.parseScriptNode(); 33 | builderAssistant.addMappedStatement(id, sqlSource); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /dexcoder-dal-batis/src/main/resources/batis-mapper.dtd: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 11 | 12 | 13 | 16 | 17 | 18 | 21 | 22 | 23 | 26 | 27 | 28 | 31 | 32 | 33 | 34 | 38 | 39 | 42 | 43 | 44 | 48 | 49 | 50 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 67 | 75 | 76 | 77 | 78 | 81 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /dexcoder-dal-spring/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | dexcoder-assistant 7 | com.dexcoder 8 | 2.3.5 9 | 10 | 4.0.0 11 | 12 | dexcoder-dal-spring 13 | dexcoder-dal-spring 14 | 15 | 16 | com.dexcoder 17 | dexcoder-commons 18 | 2.3.5 19 | 20 | 21 | com.dexcoder 22 | dexcoder-dal 23 | 2.3.5 24 | 25 | 26 | org.springframework 27 | spring-jdbc 28 | 29 | 30 | org.aspectj 31 | aspectjweaver 32 | 33 | 34 | com.github.jsqlparser 35 | jsqlparser 36 | 37 | 38 | org.slf4j 39 | slf4j-api 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /dexcoder-dal-spring/src/main/java/com/dexcoder/dal/spring/datasource/DataSourceContext.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.spring.datasource; 2 | 3 | /** 4 | * Created by liyd on 2015-11-2. 5 | */ 6 | public class DataSourceContext { 7 | 8 | /** dataSource key */ 9 | private String dsKey; 10 | 11 | /** 是否可写 */ 12 | private Boolean isWrite; 13 | 14 | public Boolean getIsWrite() { 15 | return isWrite; 16 | } 17 | 18 | public void setIsWrite(Boolean isWrite) { 19 | this.isWrite = isWrite; 20 | } 21 | 22 | public String getDsKey() { 23 | return dsKey; 24 | } 25 | 26 | public void setDsKey(String dsKey) { 27 | this.dsKey = dsKey; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /dexcoder-dal-spring/src/main/java/com/dexcoder/dal/spring/datasource/DynamicDataSourceHolder.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.spring.datasource; 2 | 3 | /** 4 | * 动态数据源切换标识 5 | *

6 | * Created by liyd on 2015-11-2. 7 | */ 8 | public class DynamicDataSourceHolder { 9 | 10 | private static final ThreadLocal DATASOURCE_LOCAL = new ThreadLocal(); 11 | 12 | /** 13 | * 设置数据源读写模式 14 | * 15 | * @param isWrite 16 | */ 17 | public static void setIsWrite(boolean isWrite) { 18 | DataSourceContext dsContext = DATASOURCE_LOCAL.get(); 19 | //已经持有且可写,直接返回 20 | if (dsContext != null && dsContext.getIsWrite()) { 21 | return; 22 | } 23 | 24 | if (dsContext == null || isWrite) { 25 | dsContext = new DataSourceContext(); 26 | dsContext.setIsWrite(isWrite); 27 | DATASOURCE_LOCAL.set(dsContext); 28 | } 29 | } 30 | 31 | /** 32 | * 获取dsKey 33 | * 34 | * @return 35 | */ 36 | public static DataSourceContext getDsContent() { 37 | return DATASOURCE_LOCAL.get(); 38 | } 39 | 40 | 41 | /** 42 | * 清除 43 | */ 44 | public static void clear() { 45 | DATASOURCE_LOCAL.remove(); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /dexcoder-dal-spring/src/main/java/com/dexcoder/dal/spring/datasource/DynamicDsInterceptor.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.spring.datasource; 2 | 3 | import org.apache.commons.lang3.StringUtils; 4 | import org.aspectj.lang.ProceedingJoinPoint; 5 | import org.aspectj.lang.annotation.Around; 6 | import org.aspectj.lang.annotation.Aspect; 7 | import org.aspectj.lang.annotation.Pointcut; 8 | 9 | /** 10 | * 动态数据源拦截器 11 | *

12 | * Created by liyd on 2015-11-2. 13 | */ 14 | @Aspect 15 | public class DynamicDsInterceptor { 16 | 17 | @Pointcut("execution(* org.springframework.jdbc.core.JdbcOperations.*(..))") 18 | public void executeMethod() { 19 | throw new UnsupportedOperationException("不支持的方法"); 20 | } 21 | 22 | @Around("executeMethod()") 23 | public Object methodAspect(ProceedingJoinPoint pjp) throws Throwable { 24 | 25 | String methodName = pjp.getSignature().getName(); 26 | if (StringUtils.startsWith(methodName, "query")) { 27 | DynamicDataSourceHolder.setIsWrite(false); 28 | } else { 29 | DynamicDataSourceHolder.setIsWrite(true); 30 | } 31 | 32 | return pjp.proceed(); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /dexcoder-dal-spring/src/main/java/com/dexcoder/dal/spring/page/PageSqlHandler.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.spring.page; 2 | 3 | import com.dexcoder.commons.pager.Pager; 4 | 5 | /** 6 | * Created by liyd on 16/6/8. 7 | */ 8 | public interface PageSqlHandler { 9 | 10 | /** 11 | * 根据查询sql获取count sql 12 | * 13 | * @param sql 14 | * @param pager 15 | * @param database 16 | * @return 17 | */ 18 | String getCountSql(String sql, Pager pager, String database); 19 | 20 | /** 21 | * 根据查询sql获取分页sql 22 | * 23 | * @param sql 24 | * @param pager 25 | * @param database 26 | * @return 27 | */ 28 | String getPageSql(String sql, Pager pager, String database); 29 | } 30 | -------------------------------------------------------------------------------- /dexcoder-dal-spring/src/main/java/com/dexcoder/dal/spring/page/SimplePageSqlHandler.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.spring.page; 2 | 3 | import com.dexcoder.commons.pager.Pager; 4 | 5 | /** 6 | * Created by liyd on 16/6/8. 7 | */ 8 | public class SimplePageSqlHandler implements PageSqlHandler { 9 | 10 | public String getCountSql(String sql, Pager pager, String database) { 11 | return new StringBuilder("select count(*) from (").append(sql).append(") tmp_count").toString(); 12 | } 13 | 14 | public String getPageSql(String sql, Pager pager, String database) { 15 | StringBuilder pageSql = new StringBuilder(200); 16 | if ("MYSQL".equals(database)) { 17 | pageSql.append(sql); 18 | pageSql.append(" limit "); 19 | pageSql.append(pager.getBeginIndex()); 20 | pageSql.append(","); 21 | pageSql.append(pager.getItemsPerPage()); 22 | } else if ("ORACLE".equals(database)) { 23 | pageSql.append("select * from ( select rownum num,temp.* from ("); 24 | pageSql.append(sql); 25 | pageSql.append(") temp where rownum <= ").append(pager.getEndIndex()); 26 | pageSql.append(") where num > ").append(pager.getBeginIndex()); 27 | } 28 | return pageSql.toString(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /dexcoder-dal-spring/src/main/java/com/dexcoder/dal/spring/page/SqlParser.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.spring.page; 2 | 3 | /** 4 | * Created by liyd on 16/6/8. 5 | */ 6 | 7 | /** 8 | * sql解析类,提供更智能的count查询sql 9 | * 10 | * @author liuzh 11 | */ 12 | public class SqlParser { 13 | 14 | 15 | } 16 | -------------------------------------------------------------------------------- /dexcoder-dal/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | dexcoder-assistant 7 | com.dexcoder 8 | 2.3.5 9 | 10 | 4.0.0 11 | 12 | dexcoder-dal 13 | dexcoder-dal 14 | 15 | 16 | com.dexcoder 17 | dexcoder-commons 18 | 2.3.5 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /dexcoder-dal/src/main/java/com/dexcoder/dal/BoundSql.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * 具体的sql、参数信息对象 7 | *

8 | * Created by liyd on 2015-12-4. 9 | */ 10 | public interface BoundSql { 11 | 12 | /** 13 | * Get execute sql. 14 | * Parameter with a ? mark and corresponds below parameters. 15 | * 16 | * @return 17 | */ 18 | String getSql(); 19 | 20 | /** 21 | * Get execute sql parameters. 22 | * Allowed to return empty list,Don't return null. 23 | * 24 | * @return 25 | */ 26 | List getParameters(); 27 | 28 | } 29 | -------------------------------------------------------------------------------- /dexcoder-dal/src/main/java/com/dexcoder/dal/SimpleSqlFactory.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Arrays; 5 | 6 | import com.dexcoder.dal.build.CriteriaBoundSql; 7 | 8 | /** 9 | * Created by liyd on 2015-12-9. 10 | */ 11 | public class SimpleSqlFactory implements SqlFactory { 12 | 13 | public BoundSql getBoundSql(String refSql, String expectParamKey, Object[] parameters) { 14 | return new CriteriaBoundSql(refSql, parameters == null ? new ArrayList() : Arrays.asList(parameters)); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /dexcoder-dal/src/main/java/com/dexcoder/dal/SqlFactory.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal; 2 | 3 | /** 4 | * Created by liyd on 2015-12-4. 5 | */ 6 | public interface SqlFactory { 7 | 8 | /** 9 | * 获取BoundSql 10 | * 11 | * @param refSql the ref sql 12 | * @param expectParamKey the expect param key 13 | * @param parameters the parameters 14 | * @return bound sql 15 | */ 16 | BoundSql getBoundSql(String refSql, String expectParamKey, Object[] parameters); 17 | } 18 | -------------------------------------------------------------------------------- /dexcoder-dal/src/main/java/com/dexcoder/dal/annotation/Column.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.annotation; 2 | 3 | import static java.lang.annotation.ElementType.METHOD; 4 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 5 | 6 | import java.lang.annotation.Retention; 7 | import java.lang.annotation.Target; 8 | 9 | /** 10 | * Created by liyd on 2016-1-4. 11 | */ 12 | @Target({ METHOD }) 13 | @Retention(RUNTIME) 14 | public @interface Column { 15 | 16 | String value(); 17 | } 18 | -------------------------------------------------------------------------------- /dexcoder-dal/src/main/java/com/dexcoder/dal/annotation/Table.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.annotation; 2 | 3 | import static java.lang.annotation.ElementType.TYPE; 4 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 5 | 6 | import java.lang.annotation.Retention; 7 | import java.lang.annotation.Target; 8 | 9 | /** 10 | * Created by liyd on 2016-1-4. 11 | */ 12 | @Target({ TYPE }) 13 | @Retention(RUNTIME) 14 | public @interface Table { 15 | 16 | String name(); 17 | 18 | String alias() default ""; 19 | 20 | String pkField() default ""; 21 | 22 | Class mappingHandler() default Object.class; 23 | } 24 | -------------------------------------------------------------------------------- /dexcoder-dal/src/main/java/com/dexcoder/dal/annotation/Transient.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.annotation; 2 | 3 | import static java.lang.annotation.ElementType.METHOD; 4 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 5 | 6 | import java.lang.annotation.Retention; 7 | import java.lang.annotation.Target; 8 | 9 | /** 10 | * Created by liyd on 2015-12-31. 11 | */ 12 | @Target({ METHOD }) 13 | @Retention(RUNTIME) 14 | public @interface Transient { 15 | } 16 | -------------------------------------------------------------------------------- /dexcoder-dal/src/main/java/com/dexcoder/dal/build/AbstractSqlBuilder.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.build; 2 | 3 | import java.util.HashSet; 4 | import java.util.Set; 5 | 6 | import com.dexcoder.commons.utils.AssertUtils; 7 | import com.dexcoder.dal.BoundSql; 8 | import com.dexcoder.dal.handler.GenericTokenParser; 9 | import com.dexcoder.dal.handler.NativeTokenHandler; 10 | import com.dexcoder.dal.handler.TokenHandler; 11 | 12 | /** 13 | * Created by liyd on 2015-12-7. 14 | */ 15 | public abstract class AbstractSqlBuilder implements SqlBuilder { 16 | 17 | /** 18 | * 符号中内容会被转换(field -> column) 19 | */ 20 | public static final String[] NATIVE_TOKENS = { "{", "}", "[", "]" }; 21 | 22 | /** 23 | * 表信息 24 | */ 25 | protected MetaTable metaTable; 26 | 27 | /** 28 | * parser map 29 | */ 30 | protected Set tokenParsers; 31 | 32 | public AbstractSqlBuilder(Class clazz) { 33 | metaTable = new MetaTable().initAutoFields().tableClass(clazz); 34 | } 35 | 36 | public BoundSql build(Object entity, boolean isIgnoreNull) { 37 | AssertUtils.assertNotNull(metaTable.getMappingHandler(), "MappingHandler can not be null !"); 38 | return this.buildBoundSql(entity, isIgnoreNull); 39 | } 40 | 41 | public abstract BoundSql buildBoundSql(Object entity, boolean isIgnoreNull); 42 | 43 | public MetaTable getMetaTable() { 44 | return metaTable; 45 | } 46 | 47 | /** 48 | * 初始化 TokenParsers 49 | * 50 | * @param metaTable the meta table 51 | * @return set set 52 | */ 53 | protected Set initTokenParsers(MetaTable metaTable) { 54 | if (tokenParsers == null) { 55 | tokenParsers = new HashSet(2); 56 | TokenHandler tokenHandler = new NativeTokenHandler(null); 57 | tokenParsers.add(new GenericTokenParser(NATIVE_TOKENS[0], NATIVE_TOKENS[1], tokenHandler)); 58 | tokenHandler = new NativeTokenHandler(metaTable); 59 | tokenParsers.add(new GenericTokenParser(NATIVE_TOKENS[2], NATIVE_TOKENS[3], tokenHandler)); 60 | } 61 | return tokenParsers; 62 | } 63 | 64 | /** 65 | * TokenParsers 解析 66 | * 67 | * @param autoField the auto field 68 | * @param metaTable the auto table 69 | * @return string string 70 | */ 71 | protected String tokenParse(AutoField autoField, MetaTable metaTable) { 72 | return tokenParse(autoField.getName(), metaTable); 73 | } 74 | 75 | /** 76 | * TokenParsers 解析 77 | * 78 | * @param content the content 79 | * @param metaTable the meta table 80 | * @return string string 81 | */ 82 | protected String tokenParse(String content, MetaTable metaTable) { 83 | Set tokenParsers = initTokenParsers(metaTable); 84 | String result = content; 85 | for (GenericTokenParser tokenParser : tokenParsers) { 86 | result = tokenParser.parse(result); 87 | } 88 | return result; 89 | } 90 | 91 | } 92 | -------------------------------------------------------------------------------- /dexcoder-dal/src/main/java/com/dexcoder/dal/build/AutoField.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.build; 2 | 3 | import org.apache.commons.lang3.StringUtils; 4 | 5 | /** 6 | * 组装sql时的列信息 7 | *

8 | * Created by liyd on 7/7/14. 9 | */ 10 | public class AutoField { 11 | 12 | /** 13 | * native field 正则 14 | */ 15 | public static final String REGEX_NATIVE_FIELD = "(^[\\[].+[\\]]$)|(^[{].+[}]$)"; 16 | 17 | /** 18 | * 名称 19 | */ 20 | private String name; 21 | 22 | // /** 23 | // * 别名 24 | // */ 25 | // private String annotationName; 26 | 27 | /** 28 | * 逻辑操作符 and or 29 | */ 30 | private String logicalOperator; 31 | 32 | /** 33 | * 属性操作符 值大于、小于、in等 34 | */ 35 | private String fieldOperator; 36 | 37 | /** 38 | * 值 39 | */ 40 | private Object value; 41 | 42 | /** 43 | * 类型 44 | */ 45 | private AutoFieldType type; 46 | 47 | /** 48 | * 是否native属性 49 | * 50 | * @return 51 | */ 52 | public boolean isNativeField() { 53 | return name.matches(REGEX_NATIVE_FIELD); 54 | } 55 | 56 | /** 57 | * 是否括号 58 | * 59 | * @return 60 | */ 61 | public boolean isBracket() { 62 | return type == AutoFieldType.BRACKET_BEGIN || type == AutoFieldType.BRACKET_END; 63 | } 64 | 65 | /** 66 | * fieldOperator是否需要括号 67 | * 68 | * @return 69 | */ 70 | public boolean isFieldOperatorNeedBracket() { 71 | return StringUtils.indexOf(StringUtils.upperCase(fieldOperator), "IN") != -1; 72 | } 73 | 74 | public String getName() { 75 | return name; 76 | } 77 | 78 | // public String getAnnotationName() { 79 | // return annotationName; 80 | // } 81 | 82 | public String getLogicalOperator() { 83 | return logicalOperator; 84 | } 85 | 86 | public String getFieldOperator() { 87 | return fieldOperator; 88 | } 89 | 90 | public Object getValue() { 91 | return value; 92 | } 93 | 94 | public AutoFieldType getType() { 95 | return type; 96 | } 97 | 98 | public static class Builder { 99 | 100 | private AutoField autoField = new AutoField(); 101 | 102 | public Builder name(String fieldName) { 103 | autoField.name = fieldName; 104 | return this; 105 | } 106 | 107 | public Builder logicalOperator(String logicalOperator) { 108 | autoField.logicalOperator = logicalOperator; 109 | return this; 110 | } 111 | 112 | public Builder fieldOperator(String fieldOperator) { 113 | autoField.fieldOperator = fieldOperator; 114 | return this; 115 | } 116 | 117 | public Builder value(Object value) { 118 | autoField.value = value; 119 | return this; 120 | } 121 | 122 | public Builder type(AutoFieldType type) { 123 | autoField.type = type; 124 | return this; 125 | } 126 | 127 | // public Builder annotationName(String annotationName) { 128 | // autoField.annotationName = annotationName; 129 | // return this; 130 | // } 131 | 132 | public AutoField build() { 133 | assert autoField.name != null; 134 | return autoField; 135 | } 136 | } 137 | } 138 | -------------------------------------------------------------------------------- /dexcoder-dal/src/main/java/com/dexcoder/dal/build/AutoFieldType.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.build; 2 | 3 | /** 4 | * Created by liyd on 2015-12-4. 5 | */ 6 | public enum AutoFieldType { 7 | 8 | NORMAL, 9 | 10 | INSERT, 11 | 12 | UPDATE, 13 | 14 | WHERE, 15 | 16 | INCLUDE, 17 | 18 | EXCLUDE, 19 | 20 | ORDER_BY_ASC, 21 | 22 | ORDER_BY_DESC, 23 | 24 | BRACKET_BEGIN, 25 | 26 | BRACKET_END, 27 | 28 | /** 函数 */ 29 | FUNC, 30 | 31 | /** 拼装sql时忽略 */ 32 | TRANSIENT 33 | } 34 | -------------------------------------------------------------------------------- /dexcoder-dal/src/main/java/com/dexcoder/dal/build/CriteriaBoundSql.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.build; 2 | 3 | import java.util.List; 4 | 5 | import com.dexcoder.dal.BoundSql; 6 | 7 | /** 8 | * Created by liyd on 2015-12-7. 9 | */ 10 | public class CriteriaBoundSql implements BoundSql { 11 | 12 | /** 13 | * sql 14 | */ 15 | private String sql; 16 | 17 | /** 18 | * parameters 19 | */ 20 | private List parameters; 21 | 22 | /** 23 | * Constructor 24 | * 25 | * @param sql 26 | * @param parameters 27 | */ 28 | public CriteriaBoundSql(String sql, List parameters) { 29 | this.sql = sql; 30 | this.parameters = parameters; 31 | } 32 | 33 | public String getSql() { 34 | return this.sql; 35 | } 36 | 37 | public List getParameters() { 38 | return this.parameters; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /dexcoder-dal/src/main/java/com/dexcoder/dal/build/DeleteBuilder.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.build; 2 | 3 | import com.dexcoder.dal.BoundSql; 4 | 5 | /** 6 | * Created by liyd on 2015-12-7. 7 | */ 8 | public class DeleteBuilder extends AbstractSqlBuilder { 9 | 10 | protected static final String COMMAND_OPEN = "DELETE FROM "; 11 | 12 | /** 13 | * whereBuilder 14 | */ 15 | private SqlBuilder whereBuilder; 16 | 17 | public DeleteBuilder(Class clazz) { 18 | super(clazz); 19 | whereBuilder = new WhereBuilder(clazz); 20 | } 21 | 22 | public void addField(String fieldName, String logicalOperator, String fieldOperator, AutoFieldType type, 23 | Object value) { 24 | this.addCondition(fieldName, logicalOperator, fieldOperator, type, value); 25 | } 26 | 27 | public void addCondition(String fieldName, String logicalOperator, String fieldOperator, AutoFieldType type, 28 | Object value) { 29 | whereBuilder.addCondition(fieldName, logicalOperator, fieldOperator, type, value); 30 | } 31 | 32 | public BoundSql buildBoundSql(Object entity, boolean isIgnoreNull) { 33 | //构建到whereBuilder 34 | whereBuilder.getMetaTable().mappingHandler(metaTable.getMappingHandler()).tableAlias(metaTable.getTableAlias()) 35 | .entity(entity, isIgnoreNull); 36 | //这里必须从whereBuilder的MetaTable中获取表名,以便水平分表时能使用正确的表名 37 | String tableName = whereBuilder.getMetaTable().getTableAndAliasName(); 38 | StringBuilder sb = new StringBuilder(COMMAND_OPEN); 39 | sb.append(tableName); 40 | BoundSql boundSql = whereBuilder.build(entity, isIgnoreNull); 41 | sb.append(boundSql.getSql()); 42 | return new CriteriaBoundSql(sb.toString(), boundSql.getParameters()); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /dexcoder-dal/src/main/java/com/dexcoder/dal/build/InsertBuilder.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.build; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | import java.util.Map; 6 | 7 | import com.dexcoder.dal.BoundSql; 8 | import com.dexcoder.dal.exceptions.JdbcAssistantException; 9 | 10 | /** 11 | * Created by liyd on 2015-12-7. 12 | */ 13 | public class InsertBuilder extends AbstractSqlBuilder { 14 | 15 | protected static final String COMMAND_OPEN = "INSERT INTO "; 16 | 17 | public InsertBuilder(Class clazz) { 18 | super(clazz); 19 | } 20 | 21 | public void addField(String fieldName, String logicalOperator, String fieldOperator, AutoFieldType type, 22 | Object value) { 23 | AutoField autoField = new AutoField.Builder().name(fieldName).logicalOperator(logicalOperator) 24 | .fieldOperator(fieldOperator).type(type).value(value).build(); 25 | metaTable.getAutoFields().put(fieldName, autoField); 26 | } 27 | 28 | public void addCondition(String fieldName, String logicalOperator, String fieldOperator, AutoFieldType type, 29 | Object value) { 30 | throw new JdbcAssistantException("InsertBuilder不支持设置条件"); 31 | } 32 | 33 | public BoundSql buildBoundSql(Object entity, boolean isIgnoreNull) { 34 | metaTable.entity(entity, isIgnoreNull); 35 | StringBuilder sql = new StringBuilder(COMMAND_OPEN); 36 | StringBuilder args = new StringBuilder("("); 37 | List params = new ArrayList(); 38 | sql.append(metaTable.getTableAndAliasName()).append(" ("); 39 | 40 | for (Map.Entry entry : metaTable.getAutoFields().entrySet()) { 41 | AutoField autoField = entry.getValue(); 42 | //忽略null值 43 | if (autoField.getValue() == null && isIgnoreNull) { 44 | continue; 45 | } 46 | //原生类型 47 | if (autoField.isNativeField()) { 48 | String nativeFieldName = tokenParse(autoField, metaTable); 49 | String nativeValue = tokenParse(String.valueOf(autoField.getValue()), metaTable); 50 | sql.append(nativeFieldName).append(","); 51 | args.append(nativeValue); 52 | } else { 53 | String columnName = metaTable.getColumnAndTableAliasName(autoField); 54 | sql.append(columnName).append(","); 55 | args.append("?"); 56 | params.add(autoField.getValue()); 57 | } 58 | args.append(","); 59 | } 60 | sql.deleteCharAt(sql.length() - 1); 61 | args.deleteCharAt(args.length() - 1); 62 | sql.append(")").append(" VALUES ").append(args.append(")")); 63 | return new CriteriaBoundSql(sql.toString(), params); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /dexcoder-dal/src/main/java/com/dexcoder/dal/build/OrderByBuilder.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.build; 2 | 3 | import java.util.Map; 4 | 5 | import com.dexcoder.dal.BoundSql; 6 | import com.dexcoder.dal.exceptions.JdbcAssistantException; 7 | 8 | /** 9 | * Created by liyd on 2015-12-4. 10 | */ 11 | public class OrderByBuilder extends AbstractSqlBuilder { 12 | 13 | protected static final String COMMAND_OPEN = " ORDER BY "; 14 | 15 | public OrderByBuilder(Class clazz) { 16 | super(clazz); 17 | } 18 | 19 | public void addField(String fieldName, String logicalOperator, String fieldOperator, AutoFieldType type, 20 | Object value) { 21 | AutoField autoField = new AutoField.Builder().name(fieldName).fieldOperator(fieldOperator).type(type).build(); 22 | metaTable.getAutoFields().put(fieldName, autoField); 23 | } 24 | 25 | public void addCondition(String fieldName, String logicalOperator, String fieldOperator, AutoFieldType type, 26 | Object value) { 27 | throw new JdbcAssistantException("OrderByBuilder不支持设置条件"); 28 | } 29 | 30 | public BoundSql buildBoundSql(Object entity, boolean isIgnoreNull) { 31 | StringBuilder sb = new StringBuilder(COMMAND_OPEN); 32 | if (metaTable.getAutoFields().isEmpty()) { 33 | sb.append(metaTable.applyColumnTableAlias(metaTable.getColumnName(metaTable.getPkFieldName()))).append( 34 | " DESC"); 35 | } else { 36 | for (Map.Entry entry : metaTable.getAutoFields().entrySet()) { 37 | String columnName = metaTable.getColumnAndTableAliasName(entry.getValue()); 38 | sb.append(columnName).append(" ").append(entry.getValue().getFieldOperator()).append(","); 39 | } 40 | if (sb.length() > 10) { 41 | sb.deleteCharAt(sb.length() - 1); 42 | } 43 | } 44 | return new CriteriaBoundSql(sb.toString(), null); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /dexcoder-dal/src/main/java/com/dexcoder/dal/build/SqlBuilder.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.build; 2 | 3 | import com.dexcoder.dal.BoundSql; 4 | 5 | /** 6 | * Created by liyd on 2015-12-4. 7 | */ 8 | public interface SqlBuilder { 9 | 10 | /** 11 | * 添加操作字段 12 | * 13 | * @param fieldName the field name 14 | * @param logicalOperator the logicalOperator 15 | * @param fieldOperator the field operator 16 | * @param type the type 17 | * @param value the value 18 | */ 19 | void addField(String fieldName, String logicalOperator, String fieldOperator, AutoFieldType type, Object value); 20 | 21 | /** 22 | * 添加操作条件 23 | * 24 | * @param fieldName the field name 25 | * @param logicalOperator the logicalOperator 26 | * @param fieldOperator the field operator 27 | * @param type the type 28 | * @param value the value 29 | */ 30 | void addCondition(String fieldName, String logicalOperator, String fieldOperator, AutoFieldType type, Object value); 31 | 32 | /** 33 | * 获取操作表对象 34 | * 35 | * @return 36 | */ 37 | MetaTable getMetaTable(); 38 | 39 | /** 40 | * 构建BoundSql 41 | * 42 | * @param entity 可以为空 43 | * @param isIgnoreNull entity不为空的情况下是否忽略null属性 44 | * @return bound sql 45 | */ 46 | BoundSql build(Object entity, boolean isIgnoreNull); 47 | 48 | } 49 | -------------------------------------------------------------------------------- /dexcoder-dal/src/main/java/com/dexcoder/dal/exceptions/ClassAssistantException.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.exceptions; 2 | 3 | import com.dexcoder.commons.exceptions.AssistantException; 4 | 5 | /** 6 | * Created by liyd on 2015-12-4. 7 | */ 8 | public class ClassAssistantException extends AssistantException { 9 | 10 | private static final long serialVersionUID = 776718620724899656L; 11 | 12 | public ClassAssistantException(String message, Throwable e) { 13 | super(message, e); 14 | this.resultMsg = message; 15 | } 16 | 17 | /** 18 | * Instantiates. 19 | * 20 | * @param e the e 21 | */ 22 | public ClassAssistantException(Throwable e) { 23 | super(e); 24 | } 25 | 26 | /** 27 | * Constructor 28 | * 29 | * @param message the message 30 | */ 31 | public ClassAssistantException(String message) { 32 | super(message); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /dexcoder-dal/src/main/java/com/dexcoder/dal/exceptions/JdbcAssistantException.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.exceptions; 2 | 3 | import com.dexcoder.commons.exceptions.AssistantException; 4 | 5 | /** 6 | * dal 异常 7 | * Created by liyd on 2015-12-4. 8 | */ 9 | public class JdbcAssistantException extends AssistantException { 10 | 11 | private static final long serialVersionUID = -2908094775089363098L; 12 | 13 | public JdbcAssistantException(String message, Throwable e) { 14 | super(message, e); 15 | this.resultMsg = message; 16 | } 17 | 18 | /** 19 | * Instantiates. 20 | * 21 | * @param e the e 22 | */ 23 | public JdbcAssistantException(Throwable e) { 24 | super(e); 25 | } 26 | 27 | /** 28 | * Constructor 29 | * 30 | * @param message the message 31 | */ 32 | public JdbcAssistantException(String message) { 33 | super(message); 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /dexcoder-dal/src/main/java/com/dexcoder/dal/handler/DefaultMappingHandler.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.handler; 2 | 3 | import java.util.Map; 4 | 5 | import org.apache.commons.lang3.StringUtils; 6 | 7 | import com.dexcoder.commons.utils.NameUtils; 8 | import com.dexcoder.dal.build.AutoField; 9 | 10 | /** 11 | * 默认名称处理handler 12 | *

13 | * User: liyd 14 | * Date: 2/12/14 15 | * Time: 4:51 PM 16 | */ 17 | public class DefaultMappingHandler implements MappingHandler { 18 | 19 | /** 20 | * 主键属性后缀 21 | */ 22 | private static final String PRI_FIELD_SUFFIX = "Id"; 23 | 24 | public String getTableName(Class entityClass, Map fieldMap) { 25 | //Java属性的骆驼命名法转换回数据库下划线“_”分隔的格式 26 | return NameUtils.getUnderlineName(entityClass.getSimpleName()); 27 | } 28 | 29 | public String getPkFieldName(Class entityClass) { 30 | String firstLowerName = NameUtils.getFirstLowerName(entityClass.getSimpleName()); 31 | //主键以类名加上“Id” 如user表主键属性即userId 32 | return firstLowerName + PRI_FIELD_SUFFIX; 33 | } 34 | 35 | public String getColumnName(Class entityClass, String fieldName, String annColumnName) { 36 | 37 | //默认如果有注解的列名,直接返回 38 | if (StringUtils.isNotBlank(annColumnName)) { 39 | return annColumnName; 40 | } 41 | return NameUtils.getUnderlineName(fieldName); 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /dexcoder-dal/src/main/java/com/dexcoder/dal/handler/GenericTokenParser.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.handler; 2 | 3 | /** 4 | * Created by liyd on 2015-11-24. 5 | */ 6 | public class GenericTokenParser { 7 | 8 | private final String openToken; 9 | private final String closeToken; 10 | private final TokenHandler handler; 11 | 12 | public GenericTokenParser(String openToken, String closeToken, TokenHandler handler) { 13 | this.openToken = openToken; 14 | this.closeToken = closeToken; 15 | this.handler = handler; 16 | } 17 | 18 | public String parse(String text) { 19 | text = text.trim(); 20 | StringBuilder builder = new StringBuilder(); 21 | if (text != null && text.length() > 0) { 22 | char[] src = text.toCharArray(); 23 | int offset = 0; 24 | int start = text.indexOf(openToken, offset); 25 | while (start > -1) { 26 | if (start > 0 && src[start - 1] == '\\') { 27 | // the variable is escaped. remove the backslash. 28 | builder.append(src, offset, start - offset - 1).append(openToken); 29 | offset = start + openToken.length(); 30 | } else { 31 | int end = text.indexOf(closeToken, start); 32 | if (end == -1) { 33 | builder.append(src, offset, src.length - offset); 34 | offset = src.length; 35 | } else { 36 | builder.append(src, offset, start - offset); 37 | offset = start + openToken.length(); 38 | String content = new String(src, offset, end - offset); 39 | builder.append(handler.handleToken(content)); 40 | offset = end + closeToken.length(); 41 | } 42 | } 43 | start = text.indexOf(openToken, offset); 44 | } 45 | if (offset < src.length) { 46 | builder.append(src, offset, src.length - offset); 47 | } 48 | } 49 | return builder.toString(); 50 | } 51 | } 52 | 53 | -------------------------------------------------------------------------------- /dexcoder-dal/src/main/java/com/dexcoder/dal/handler/KeyGenerator.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.handler; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * Created by liyd on 16/8/25. 7 | */ 8 | public interface KeyGenerator { 9 | 10 | /** 11 | * 主键值是否来自sql 12 | * true:类似于oracle的序列,下面的generateKeyValue方法只是返回了序列名,真正的主键值是sql执行时获取的序列值 13 | * false:如UUID主键,下面的generateKeyValue方法返回一个UUID,这个UUID就已经是实际的主键值 14 | * 15 | * @return 16 | */ 17 | boolean isPkValueBySql(); 18 | 19 | /** 20 | * 处理主键名(跟原生执行符号一致 {pkFieldName}field和value都原生执行 [pkFieldName]field会进行转换,value原生执行) 21 | * 22 | * @param pkFieldName the pk field name 23 | * @param dialect the dialect 24 | * @return string 25 | */ 26 | String handlePkFieldName(String pkFieldName, String dialect); 27 | 28 | /** 29 | * 生成主键值 30 | * 31 | * @param clazz the clazz 32 | * @param dialect the dialect 33 | * @return serializable serializable 34 | */ 35 | Serializable generateKeyValue(Class clazz, String dialect); 36 | 37 | } 38 | -------------------------------------------------------------------------------- /dexcoder-dal/src/main/java/com/dexcoder/dal/handler/MappingHandler.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.handler; 2 | 3 | import java.util.Map; 4 | 5 | import com.dexcoder.dal.build.AutoField; 6 | 7 | /** 8 | * 名称处理接口 9 | *

10 | * User: liyd 11 | * Date: 2/12/14 12 | * Time: 4:51 PM 13 | */ 14 | public interface MappingHandler { 15 | 16 | /** 17 | * 根据实体名获取表名 18 | * 19 | * @param entityClass the entity class 20 | * @param fieldMap the field map 21 | * @return table name 22 | */ 23 | String getTableName(Class entityClass, Map fieldMap); 24 | 25 | /** 26 | * 根据类名获取主键字段名 27 | * 28 | * @param entityClass the entity class 29 | * @return pK name 30 | */ 31 | String getPkFieldName(Class entityClass); 32 | 33 | /** 34 | * 根据属性名获取列名 35 | * 36 | * @param entityClass the entity class 37 | * @param fieldName the field name 38 | * @return column name 39 | */ 40 | String getColumnName(Class entityClass, String fieldName, String annColumnName); 41 | 42 | } 43 | -------------------------------------------------------------------------------- /dexcoder-dal/src/main/java/com/dexcoder/dal/handler/NativeTokenHandler.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.handler; 2 | 3 | import com.dexcoder.dal.build.MetaTable; 4 | 5 | /** 6 | * 解析[]符号 7 | * 8 | * Created by liyd on 2015-12-8. 9 | */ 10 | public class NativeTokenHandler implements TokenHandler { 11 | 12 | private MetaTable metaTable; 13 | 14 | public NativeTokenHandler(MetaTable metaTable) { 15 | this.metaTable = metaTable; 16 | } 17 | 18 | public String handleToken(String content) { 19 | if (metaTable == null) { 20 | return content; 21 | } 22 | return metaTable.getColumnAndTableAliasName(content); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /dexcoder-dal/src/main/java/com/dexcoder/dal/handler/OracleKeyGenerator.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.handler; 2 | 3 | import java.io.Serializable; 4 | 5 | import com.dexcoder.commons.utils.NameUtils; 6 | 7 | /** 8 | * Created by liyd on 16/8/25. 9 | */ 10 | public class OracleKeyGenerator implements KeyGenerator { 11 | 12 | public boolean isPkValueBySql() { 13 | return true; 14 | } 15 | 16 | public String handlePkFieldName(String pkFieldName, String dialect) { 17 | return String.format("[%s]", pkFieldName); 18 | } 19 | 20 | public Serializable generateKeyValue(Class clazz, String dialect) { 21 | //根据实体名获取主键序列名 22 | String tableName = NameUtils.getUnderlineName(clazz.getSimpleName()); 23 | return String.format("SEQ_%s.NEXTVAL", tableName); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /dexcoder-dal/src/main/java/com/dexcoder/dal/handler/TokenHandler.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.handler; 2 | 3 | /** 4 | * Created by liyd on 2015-11-24. 5 | */ 6 | public interface TokenHandler { 7 | 8 | String handleToken(String content); 9 | } 10 | -------------------------------------------------------------------------------- /dexcoder-dal/src/main/java/com/dexcoder/dal/handler/UUIDKeyGenerator.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.dal.handler; 2 | 3 | import java.io.Serializable; 4 | 5 | import com.dexcoder.commons.utils.UUIDUtils; 6 | 7 | /** 8 | * Created by liyd on 16/8/25. 9 | */ 10 | public class UUIDKeyGenerator implements KeyGenerator { 11 | 12 | public boolean isPkValueBySql() { 13 | return false; 14 | } 15 | 16 | public String handlePkFieldName(String pkFieldName, String dialect) { 17 | return pkFieldName; 18 | } 19 | 20 | public Serializable generateKeyValue(Class clazz, String dialect) { 21 | return UUIDUtils.getUUID32(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /dexcoder-test/src/main/java/com/dexcoder/test/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.test; 2 | 3 | /** 4 | * 当工程模块内无任务代码生成时,maven install会通不过 5 | * 此类的存在只是确保maven install的成功 6 | */ 7 | public class ApplicationTest { 8 | 9 | /** 10 | * 测试方法 11 | */ 12 | public void test() { 13 | System.out.printf("-----------------"); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /dexcoder-test/src/test/java/com/dexcoder/test/BaseTest.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.test; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.test.context.ContextConfiguration; 6 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 7 | 8 | /** 9 | * 加载spring配置文件 10 | * 11 | * User: liyd 12 | * Date: 2/13/14 13 | * Time: 5:33 PM 14 | */ 15 | @RunWith(SpringJUnit4ClassRunner.class) 16 | @ContextConfiguration(locations = {"classpath:applicationContext.xml"}) 17 | //@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false) 18 | //@Transactional() 19 | public class BaseTest { 20 | 21 | /** 22 | * 必须有个运行方法,不然maven install会通不过 23 | */ 24 | @Test 25 | public void out(){ 26 | System.out.printf("=============================="); 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /dexcoder-test/src/test/java/com/dexcoder/test/bean/BeanConvertTest.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.test.bean; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | 6 | import com.dexcoder.commons.bean.BeanConverter; 7 | import com.dexcoder.test.model.User; 8 | import com.dexcoder.test.model.UserVo; 9 | 10 | import java.util.Date; 11 | import java.util.HashMap; 12 | import java.util.Map; 13 | 14 | /** 15 | * Created by liyd on 2015-6-4. 16 | */ 17 | public class BeanConvertTest { 18 | 19 | @Test 20 | public void convert() { 21 | 22 | UserVo user = new UserVo(); 23 | user.setUserId(1000L); 24 | user.setLoginName("liyd"); 25 | 26 | User userVo = BeanConverter.convert(new User(), user); 27 | 28 | System.out.println(userVo.getLoginName()); 29 | 30 | } 31 | 32 | @Test 33 | public void map2Bean() { 34 | 35 | Map map = new HashMap(); 36 | map.put("userId", 10000L); 37 | map.put("loginName", "loginName"); 38 | map.put("userAge", 8); 39 | map.put("gmtCreate", new Date()); 40 | 41 | map.put("userQQ", "12345678"); 42 | 43 | User user = BeanConverter.mapToBean(map, User.class); 44 | 45 | Assert.assertTrue(user.getUserId().equals(10000L)); 46 | Assert.assertEquals(user.getLoginName(), "loginName"); 47 | Assert.assertTrue(user.getUserAge().equals(8)); 48 | Assert.assertTrue(user.getGmtCreate() != null); 49 | 50 | Assert.assertTrue(user.get("userQQ").equals("12345678")); 51 | 52 | } 53 | 54 | @Test 55 | public void map2Bean2() { 56 | 57 | Map map = new HashMap(); 58 | map.put("user_Id", 10000L); 59 | map.put("login_Name", "loginName"); 60 | map.put("user_Age", 8); 61 | map.put("gmt_Create", new Date()); 62 | 63 | User user = BeanConverter.underlineKeyMapToBean(map, User.class); 64 | 65 | Assert.assertTrue(user.getUserId().equals(10000L)); 66 | Assert.assertEquals(user.getLoginName(), "loginName"); 67 | Assert.assertTrue(user.getUserAge().equals(8)); 68 | Assert.assertTrue(user.getGmtCreate() != null); 69 | } 70 | 71 | @Test 72 | public void map2Bean3() { 73 | 74 | Map map = new HashMap(); 75 | map.put("user-Id", 10000L); 76 | map.put("login-Name", "loginName"); 77 | map.put("user-Age", 8); 78 | map.put("gmt-Create", new Date()); 79 | 80 | User user = BeanConverter.mapToBean(map, User.class,'-'); 81 | 82 | Assert.assertTrue(user.getUserId().equals(10000L)); 83 | Assert.assertEquals(user.getLoginName(), "loginName"); 84 | Assert.assertTrue(user.getUserAge().equals(8)); 85 | Assert.assertTrue(user.getGmtCreate() != null); 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /dexcoder-test/src/test/java/com/dexcoder/test/enums/UserType.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.test.enums; 2 | 3 | import com.dexcoder.commons.enums.IEnum; 4 | 5 | /** 6 | * Created by liyd on 2015-10-19. 7 | */ 8 | public enum UserType implements IEnum { 9 | 10 | ADMIN("1", "管理员"), 11 | 12 | VIP("2", "VIP"), 13 | 14 | MEMBER("3", "会员"); 15 | 16 | UserType(String code, String desc) { 17 | this.code = code; 18 | this.desc = desc; 19 | } 20 | 21 | private String code; 22 | 23 | private String desc; 24 | 25 | public String getCode() { 26 | return code; 27 | } 28 | 29 | public void setCode(String code) { 30 | this.code = code; 31 | } 32 | 33 | public String getDesc() { 34 | return desc; 35 | } 36 | 37 | public void setDesc(String desc) { 38 | this.desc = desc; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /dexcoder-test/src/test/java/com/dexcoder/test/model/AnnotationUser.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.test.model; 2 | 3 | import java.util.Date; 4 | 5 | import com.dexcoder.commons.pager.Pageable; 6 | import com.dexcoder.dal.annotation.Column; 7 | import com.dexcoder.dal.annotation.Table; 8 | import com.dexcoder.dal.annotation.Transient; 9 | 10 | /** 11 | * Created by liyd on 2016-1-14. 12 | */ 13 | @Table(name = "USER_A", pkField = "usernameId") 14 | public class AnnotationUser extends Pageable { 15 | 16 | private static final long serialVersionUID = -3902415084403784275L; 17 | 18 | /** 用户id */ 19 | private Long usernameId; 20 | 21 | /** 登录名 */ 22 | private String username; 23 | 24 | /** 注释 数据库关键字 */ 25 | private String description; 26 | 27 | /** 创建时间 */ 28 | private Date gmtCreate; 29 | 30 | /** 修改时间 数据库无 */ 31 | private Date gmtModify; 32 | 33 | 34 | @Column("user_id") 35 | public Long getUsernameId() { 36 | return usernameId; 37 | } 38 | 39 | public void setUsernameId(Long usernameId) { 40 | this.usernameId = usernameId; 41 | } 42 | 43 | @Column("`DESC`") 44 | public String getDescription() { 45 | return description; 46 | } 47 | 48 | public void setDescription(String description) { 49 | this.description = description; 50 | } 51 | 52 | @Column("login_name") 53 | public String getUsername() { 54 | return username; 55 | } 56 | 57 | public void setUsername(String username) { 58 | this.username = username; 59 | } 60 | 61 | public Date getGmtCreate() { 62 | return gmtCreate; 63 | } 64 | 65 | public void setGmtCreate(Date gmtCreate) { 66 | this.gmtCreate = gmtCreate; 67 | } 68 | 69 | @Transient 70 | public Date getGmtModify() { 71 | return gmtModify; 72 | } 73 | 74 | public void setGmtModify(Date gmtModify) { 75 | this.gmtModify = gmtModify; 76 | } 77 | 78 | } 79 | -------------------------------------------------------------------------------- /dexcoder-test/src/test/java/com/dexcoder/test/model/Book.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.test.model; 2 | 3 | import java.util.Date; 4 | 5 | import com.dexcoder.commons.pager.Pageable; 6 | 7 | /** 8 | * Created by liyd on 2015-10-27. 9 | */ 10 | public class Book extends Pageable { 11 | 12 | private static final long serialVersionUID = 6325757555273943337L; 13 | 14 | private Long bookId; 15 | 16 | private String bookName; 17 | 18 | private Date gmtCreate; 19 | 20 | public Long getBookId() { 21 | return bookId; 22 | } 23 | 24 | public void setBookId(Long bookId) { 25 | this.bookId = bookId; 26 | } 27 | 28 | public String getBookName() { 29 | return bookName; 30 | } 31 | 32 | public void setBookName(String bookName) { 33 | this.bookName = bookName; 34 | } 35 | 36 | public Date getGmtCreate() { 37 | return gmtCreate; 38 | } 39 | 40 | public void setGmtCreate(Date gmtCreate) { 41 | this.gmtCreate = gmtCreate; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /dexcoder-test/src/test/java/com/dexcoder/test/model/Chapter.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.test.model; 2 | 3 | import java.util.Date; 4 | 5 | import com.dexcoder.commons.pager.Pageable; 6 | 7 | /** 8 | * Created by liyd on 2015-10-27. 9 | */ 10 | public class Chapter extends Pageable { 11 | 12 | private static final long serialVersionUID = 4281180331848977421L; 13 | 14 | private Long chapterId; 15 | 16 | private Long bookId; 17 | 18 | private String chapterName; 19 | 20 | private Date gmtCreate; 21 | 22 | public Long getChapterId() { 23 | return chapterId; 24 | } 25 | 26 | public void setChapterId(Long chapterId) { 27 | this.chapterId = chapterId; 28 | } 29 | 30 | public Long getBookId() { 31 | return bookId; 32 | } 33 | 34 | public void setBookId(Long bookId) { 35 | this.bookId = bookId; 36 | } 37 | 38 | public String getChapterName() { 39 | return chapterName; 40 | } 41 | 42 | public void setChapterName(String chapterName) { 43 | this.chapterName = chapterName; 44 | } 45 | 46 | public Date getGmtCreate() { 47 | return gmtCreate; 48 | } 49 | 50 | public void setGmtCreate(Date gmtCreate) { 51 | this.gmtCreate = gmtCreate; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /dexcoder-test/src/test/java/com/dexcoder/test/model/People.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.test.model; 2 | 3 | import com.dexcoder.commons.pager.Pageable; 4 | 5 | import java.util.Date; 6 | 7 | /** 8 | * Created by liyd on 16/8/25. 9 | */ 10 | public class People extends Pageable { 11 | 12 | private static final long serialVersionUID = -2382877626585956174L; 13 | 14 | private String peopleId; 15 | private String peopleName; 16 | private Integer peopleAge; 17 | private Date gmtCreate; 18 | 19 | public String getPeopleId() { 20 | return peopleId; 21 | } 22 | 23 | public void setPeopleId(String peopleId) { 24 | this.peopleId = peopleId; 25 | } 26 | 27 | public String getPeopleName() { 28 | return peopleName; 29 | } 30 | 31 | public void setPeopleName(String peopleName) { 32 | this.peopleName = peopleName; 33 | } 34 | 35 | public Integer getPeopleAge() { 36 | return peopleAge; 37 | } 38 | 39 | public void setPeopleAge(Integer peopleAge) { 40 | this.peopleAge = peopleAge; 41 | } 42 | 43 | public Date getGmtCreate() { 44 | return gmtCreate; 45 | } 46 | 47 | public void setGmtCreate(Date gmtCreate) { 48 | this.gmtCreate = gmtCreate; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /dexcoder-test/src/test/java/com/dexcoder/test/model/User.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.test.model; 2 | 3 | import java.util.Date; 4 | 5 | import com.dexcoder.dal.annotation.Column; 6 | import com.dexcoder.dal.annotation.Transient; 7 | import com.dexcoder.commons.pager.Pageable; 8 | 9 | /** 10 | * 用户 11 | * 12 | * User: liyd 13 | * Date: Wed Dec 24 16:46:48 CST 2014 14 | */ 15 | public class User extends Pageable { 16 | 17 | private static final long serialVersionUID = 8166785520231287816L; 18 | 19 | /** 用户id */ 20 | private Long userId; 21 | 22 | /** 登录名 */ 23 | private String loginName; 24 | 25 | /** 密码 */ 26 | private String password; 27 | 28 | /** 年龄 */ 29 | private Integer userAge; 30 | 31 | /** 用户类型 */ 32 | private String userType; 33 | 34 | /** 邮箱 */ 35 | private String email; 36 | 37 | /** 创建时间 */ 38 | private Date gmtCreate; 39 | 40 | /** 修改时间 */ 41 | private Date gmtModify; 42 | 43 | /** 数据库无 */ 44 | private Date gmtBeginTime; 45 | 46 | @Transient 47 | public Date getGmtBeginTime() { 48 | return gmtBeginTime; 49 | } 50 | 51 | public void setGmtBeginTime(Date gmtBeginTime) { 52 | this.gmtBeginTime = gmtBeginTime; 53 | } 54 | 55 | public Long getUserId() { 56 | return userId; 57 | } 58 | 59 | public void setUserId(Long userId) { 60 | this.userId = userId; 61 | } 62 | 63 | public String getLoginName() { 64 | return loginName; 65 | } 66 | 67 | public void setLoginName(String loginName) { 68 | this.loginName = loginName; 69 | } 70 | 71 | public String getPassword() { 72 | return password; 73 | } 74 | 75 | public void setPassword(String password) { 76 | this.password = password; 77 | } 78 | 79 | @Column("`USER_AGE`") 80 | public Integer getUserAge() { 81 | return userAge; 82 | } 83 | 84 | public void setUserAge(Integer userAge) { 85 | this.userAge = userAge; 86 | } 87 | 88 | public String getUserType() { 89 | return userType; 90 | } 91 | 92 | public void setUserType(String userType) { 93 | this.userType = userType; 94 | } 95 | 96 | public String getEmail() { 97 | return email; 98 | } 99 | 100 | public void setEmail(String email) { 101 | this.email = email; 102 | } 103 | 104 | public Date getGmtCreate() { 105 | return gmtCreate; 106 | } 107 | 108 | public void setGmtCreate(Date gmtCreate) { 109 | this.gmtCreate = gmtCreate; 110 | } 111 | 112 | public Date getGmtModify() { 113 | return gmtModify; 114 | } 115 | 116 | public void setGmtModify(Date gmtModify) { 117 | this.gmtModify = gmtModify; 118 | } 119 | 120 | } 121 | -------------------------------------------------------------------------------- /dexcoder-test/src/test/java/com/dexcoder/test/model/UserInfo.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.test.model; 2 | 3 | import java.util.Date; 4 | 5 | import com.dexcoder.commons.pager.Pageable; 6 | 7 | /** 8 | * Created by liyd on 16/10/17. 9 | */ 10 | public class UserInfo extends Pageable { 11 | 12 | private static final long serialVersionUID = 1L; 13 | 14 | private Long userInfoId; 15 | 16 | private String userName; 17 | 18 | private String password; 19 | 20 | private String email; 21 | 22 | private Integer age; 23 | 24 | private Date gmtCreate; 25 | 26 | public Long getUserInfoId() { 27 | return userInfoId; 28 | } 29 | 30 | public void setUserInfoId(Long userInfoId) { 31 | this.userInfoId = userInfoId; 32 | } 33 | 34 | public String getUserName() { 35 | return userName; 36 | } 37 | 38 | public void setUserName(String userName) { 39 | this.userName = userName; 40 | } 41 | 42 | public String getPassword() { 43 | return password; 44 | } 45 | 46 | public void setPassword(String password) { 47 | this.password = password; 48 | } 49 | 50 | public String getEmail() { 51 | return email; 52 | } 53 | 54 | public void setEmail(String email) { 55 | this.email = email; 56 | } 57 | 58 | public Integer getAge() { 59 | return age; 60 | } 61 | 62 | public void setAge(Integer age) { 63 | this.age = age; 64 | } 65 | 66 | public Date getGmtCreate() { 67 | return gmtCreate; 68 | } 69 | 70 | public void setGmtCreate(Date gmtCreate) { 71 | this.gmtCreate = gmtCreate; 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /dexcoder-test/src/test/java/com/dexcoder/test/model/UserVo.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.test.model;//package com.dexcoder.dal.test.model; 2 | 3 | import java.util.Date; 4 | 5 | import com.dexcoder.test.enums.UserType; 6 | 7 | /** 8 | * Created by liyd on 2015-6-4. 9 | */ 10 | public class UserVo { 11 | 12 | /** 用户id */ 13 | private Long userId; 14 | 15 | /** 登录名 */ 16 | private String loginName; 17 | 18 | /** 密码 */ 19 | private String password; 20 | 21 | /** 年龄 */ 22 | private Integer userAge; 23 | 24 | /** 用户类型 */ 25 | private UserType userType; 26 | 27 | /** 邮箱 */ 28 | private String email; 29 | 30 | /** 创建时间 */ 31 | private Date gmtCreate; 32 | 33 | /** 修改时间 */ 34 | private Date gmtModify; 35 | 36 | public Long getUserId() { 37 | return userId; 38 | } 39 | 40 | public void setUserId(Long userId) { 41 | this.userId = userId; 42 | } 43 | 44 | public Date getGmtCreate() { 45 | return gmtCreate; 46 | } 47 | 48 | public void setGmtCreate(Date gmtCreate) { 49 | this.gmtCreate = gmtCreate; 50 | } 51 | 52 | public Date getGmtModify() { 53 | return gmtModify; 54 | } 55 | 56 | public void setGmtModify(Date gmtModify) { 57 | this.gmtModify = gmtModify; 58 | } 59 | 60 | public String getLoginName() { 61 | return loginName; 62 | } 63 | 64 | public void setLoginName(String loginName) { 65 | this.loginName = loginName; 66 | } 67 | 68 | public String getPassword() { 69 | return password; 70 | } 71 | 72 | public void setPassword(String password) { 73 | this.password = password; 74 | } 75 | 76 | public Integer getUserAge() { 77 | return userAge; 78 | } 79 | 80 | public void setUserAge(Integer userAge) { 81 | this.userAge = userAge; 82 | } 83 | 84 | public UserType getUserType() { 85 | return userType; 86 | } 87 | 88 | public void setUserType(UserType userType) { 89 | this.userType = userType; 90 | } 91 | 92 | public String getEmail() { 93 | return email; 94 | } 95 | 96 | public void setEmail(String email) { 97 | this.email = email; 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /dexcoder-test/src/test/java/com/dexcoder/test/persistence/CustomMappingHandler.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.test.persistence; 2 | 3 | import java.util.Map; 4 | 5 | import com.dexcoder.commons.exceptions.AssistantException; 6 | import com.dexcoder.commons.utils.NameUtils; 7 | import com.dexcoder.dal.build.AutoField; 8 | import com.dexcoder.dal.handler.DefaultMappingHandler; 9 | import com.dexcoder.test.model.Book; 10 | import com.dexcoder.test.model.Chapter; 11 | 12 | /** 13 | * 这里主要重写了分表的获取表名逻辑 14 | *

15 | * User: liyd 16 | * Date: 2/12/14 17 | * Time: 4:51 PM 18 | */ 19 | public class CustomMappingHandler extends DefaultMappingHandler { 20 | 21 | public String getTableName(Class entityClass, Map fieldMap) { 22 | //Java属性的骆驼命名法转换回数据库下划线“_”分隔的格式 23 | String tableName = NameUtils.getUnderlineName(entityClass.getSimpleName()); 24 | if (Book.class.equals(entityClass)) { 25 | AutoField autoField = fieldMap.get("bookId"); 26 | if (autoField == null || autoField.getValue() == null) { 27 | throw new AssistantException("书籍bookId不能为空"); 28 | } 29 | if (!(autoField.getValue() instanceof Long)) { 30 | throw new AssistantException("书籍bookId错误"); 31 | } 32 | Long id = (Long) autoField.getValue(); 33 | //书籍3张表 34 | long tableNum = id % 3; 35 | return tableName + "_" + tableNum; 36 | } else if (Chapter.class.equals(entityClass)) { 37 | AutoField autoField = fieldMap.get("bookId"); 38 | if (autoField == null || autoField.getValue() == null) { 39 | throw new AssistantException("章节bookId不能为空"); 40 | } 41 | if (!(autoField.getValue() instanceof Long)) { 42 | throw new AssistantException("书籍bookId错误"); 43 | } 44 | Long id = (Long) autoField.getValue(); 45 | //章节5张表 46 | long tableNum = id % 5; 47 | return tableName + "_" + tableNum; 48 | } 49 | return tableName; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /dexcoder-test/src/test/java/com/dexcoder/test/persistence/DynamicDsTransactionTest.java: -------------------------------------------------------------------------------- 1 | //package com.dexcoder.test.persistence; 2 | // 3 | //import java.util.ArrayList; 4 | //import java.util.Date; 5 | //import java.util.List; 6 | // 7 | //import org.junit.Test; 8 | //import org.springframework.beans.factory.annotation.Autowired; 9 | // 10 | //import com.dexcoder.dal.JdbcDao; 11 | //import com.dexcoder.test.BaseTest; 12 | //import com.dexcoder.test.transaction.JdbcDaoTransactionService; 13 | // 14 | ///** 15 | // * Created by liyd on 2015-11-6. 16 | // */ 17 | //public class DynamicDsTransactionTest extends BaseTest { 18 | // 19 | // @Autowired 20 | // private JdbcDao jdbcDao; 21 | // 22 | // @Autowired 23 | //// private JdbcDaoTransactionService jdbcDaoTransactionService; 24 | // 25 | // @Test 26 | // public void testTrans() { 27 | // 28 | // //插入测试数据 29 | // List bookIdList = new ArrayList(); 30 | // for (int i = 0; i < 20; i++) { 31 | // Book book = new Book(); 32 | // book.setBookName("book" + i); 33 | // book.setGmtCreate(new Date()); 34 | // Long bookId = jdbcDao.insert(book); 35 | // bookIdList.add(bookId); 36 | // } 37 | // for (Long bookId : bookIdList) { 38 | // //此处捕获异常,以免程序终止 39 | // try { 40 | // jdbcDaoTransactionService.updateBook(bookId); 41 | // } catch (Exception e) { 42 | // e.printStackTrace(); 43 | // } 44 | // } 45 | // 46 | // } 47 | // 48 | //} 49 | -------------------------------------------------------------------------------- /dexcoder-test/src/test/java/com/dexcoder/test/persistence/JdbcDaoBatisTest.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.test.persistence; 2 | 3 | import java.util.Date; 4 | import java.util.List; 5 | import java.util.Map; 6 | 7 | import org.junit.Assert; 8 | import org.junit.Test; 9 | import org.junit.runner.RunWith; 10 | import org.springframework.beans.factory.annotation.Autowired; 11 | import org.springframework.test.context.ContextConfiguration; 12 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 13 | 14 | import com.dexcoder.dal.JdbcDao; 15 | import com.dexcoder.test.model.User; 16 | 17 | /** 18 | * mybatis方式 对应sql文件:user-sql.xml 19 | * 这里主要看如何传参及使用参数,其它和mybatis一样 20 | * 21 | * Created by liyd on 2016-1-13. 22 | */ 23 | @RunWith(SpringJUnit4ClassRunner.class) 24 | @ContextConfiguration(locations = { "classpath:batis-applicationContext.xml" }) 25 | public class JdbcDaoBatisTest { 26 | 27 | @Autowired 28 | private JdbcDao jdbcDao; 29 | 30 | @Test 31 | public void batisInsert() { 32 | //login_name,password,user_age,user_type,email,gmt_create 33 | int i = jdbcDao.updateForSql("User.insertUser", new Object[] { "batis_user", "123456", 18, "1", 34 | "batis@dexcoder.com", new Date() }); 35 | Assert.assertEquals(i, 1); 36 | } 37 | 38 | @Test 39 | public void batisInsert2() { 40 | User user = new User(); 41 | user.setLoginName("batisUser2"); 42 | user.setPassword("123456"); 43 | user.setUserAge(19); 44 | user.setUserType("1"); 45 | user.setEmail("batis2@dexcoder.com"); 46 | user.setGmtCreate(new Date()); 47 | int i = jdbcDao.updateForSql("User.insertUser2", "user", new Object[] { user }); 48 | Assert.assertEquals(i, 1); 49 | } 50 | 51 | @Test 52 | public void batisInsert3() { 53 | int i = jdbcDao.updateForSql("User.insertUser3"); 54 | Assert.assertEquals(i, 1); 55 | } 56 | 57 | @Test 58 | public void batisInsert4() { 59 | //login_name,password,user_age,user_type,email,gmt_create 60 | int i = jdbcDao.updateForSql("User.insertUser4", new Object[] { "batis_user4", "123456", 18, "1", 61 | "batis@dexcoder.com", new Date() }); 62 | Assert.assertEquals(i, 1); 63 | } 64 | 65 | @Test 66 | public void batisSelect() { 67 | this.batisInsert2(); 68 | User user = new User(); 69 | user.setLoginName("batisUser2"); 70 | List> mapList = jdbcDao.queryListForSql("User.getUser", new Object[] { "1", user }); 71 | Assert.assertNotNull(mapList); 72 | for (Map map : mapList) { 73 | Assert.assertEquals("1", map.get("USER_TYPE")); 74 | Assert.assertEquals("batisUser2", map.get("LOGIN_NAME")); 75 | } 76 | } 77 | 78 | @Test 79 | public void batisSelect2() { 80 | this.batisInsert2(); 81 | User user = new User(); 82 | user.setLoginName("selfly_6"); 83 | List> mapList = jdbcDao.queryListForSql("User.queryUser", new Object[] { "1", user }); 84 | Assert.assertNotNull(mapList); 85 | } 86 | 87 | } 88 | -------------------------------------------------------------------------------- /dexcoder-test/src/test/java/com/dexcoder/test/persistence/JdbcDaoDsTest.java: -------------------------------------------------------------------------------- 1 | //package com.dexcoder.test.persistence; 2 | // 3 | //import java.util.*; 4 | // 5 | //import org.junit.Assert; 6 | //import org.junit.Test; 7 | //import org.junit.runner.RunWith; 8 | //import org.springframework.beans.factory.annotation.Autowired; 9 | //import org.springframework.test.context.ContextConfiguration; 10 | //import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 11 | // 12 | //import com.dexcoder.dal.JdbcDao; 13 | //import com.dexcoder.dal.build.Criteria; 14 | //import com.dexcoder.test.model.User; 15 | // 16 | ///** 17 | // * Created by liyd on 2016-1-27. 18 | // */ 19 | //@RunWith(SpringJUnit4ClassRunner.class) 20 | //@ContextConfiguration(locations = { "classpath:ds-applicationContext.xml" }) 21 | //public class JdbcDaoDsTest { 22 | // 23 | // @Autowired 24 | // private JdbcDao jdbcDao; 25 | // 26 | // @Test 27 | // public void dyDsInsert() { 28 | // User user = new User(); 29 | // user.setLoginName("selfly"); 30 | // user.setGmtCreate(new Date()); 31 | // Long id = jdbcDao.insert(user); 32 | // 33 | // User u = jdbcDao.get(Criteria.select(User.class).include("userId", "loginName", "gmtCreate"), id); 34 | // Assert.assertNotNull(u); 35 | // System.out.println(u.getUserId() + " : " + u.getLoginName()); 36 | // } 37 | // 38 | // @Test 39 | // public void dyDsGet() { 40 | // User u = jdbcDao.get(Criteria.select(User.class).include("userId", "loginName", "gmtCreate"), 6L); 41 | // Assert.assertNull(u); 42 | // } 43 | // 44 | // @Test 45 | // public void dyDsGet2() { 46 | // List> dsList = new ArrayList>(); 47 | // 48 | // Map map = new HashMap(); 49 | // map.put("id", "dataSource4"); 50 | // map.put("class", "org.apache.commons.dbcp.BasicDataSource"); 51 | // map.put("default", "true"); 52 | // map.put("weight", "10"); 53 | // map.put("mode", "rw"); 54 | // map.put("driverClassName", "com.mysql.dal.Driver"); 55 | // map.put("url", "dal:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=utf-8"); 56 | // map.put("username", "root"); 57 | // map.put("password", ""); 58 | // dsList.add(map); 59 | // 60 | // int i = 0; 61 | // while (i < 100) { 62 | // User u = jdbcDao.get(Criteria.select(User.class).include("userId", "loginName", "gmtCreate"), 6L); 63 | // System.out.println(u == null ? "null" : u.getLoginName()); 64 | // 65 | // if (i == 70) { 66 | // // dynamicDataSource.initDataSources(dsList); 67 | // } 68 | // i++; 69 | // } 70 | // } 71 | //} 72 | -------------------------------------------------------------------------------- /dexcoder-test/src/test/java/com/dexcoder/test/persistence/JdbcDaoKeyTest.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.test.persistence; 2 | 3 | import java.util.Date; 4 | 5 | import org.junit.Assert; 6 | import org.junit.Test; 7 | import org.junit.runner.RunWith; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.test.context.ContextConfiguration; 10 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 11 | 12 | import com.dexcoder.dal.JdbcDao; 13 | import com.dexcoder.test.model.People; 14 | 15 | /** 16 | * Created by liyd on 16/8/25. 17 | */ 18 | @RunWith(SpringJUnit4ClassRunner.class) 19 | @ContextConfiguration(locations = { "classpath:key-applicationContext.xml" }) 20 | public class JdbcDaoKeyTest { 21 | 22 | @Autowired 23 | private JdbcDao jdbcDao; 24 | 25 | @Test 26 | public void insert() { 27 | 28 | for (int i = 0; i < 10; i++) { 29 | People people = new People(); 30 | people.setPeopleName("liyd" + i); 31 | people.setPeopleAge(i); 32 | people.setGmtCreate(new Date()); 33 | 34 | jdbcDao.insert(people); 35 | } 36 | } 37 | 38 | @Test 39 | public void get() { 40 | 41 | People people = new People(); 42 | people.setPeopleName("liyd-get"); 43 | people.setPeopleAge(12); 44 | people.setGmtCreate(new Date()); 45 | String id = jdbcDao.insert(people); 46 | 47 | People people1 = jdbcDao.get(People.class, id); 48 | Assert.assertEquals(people.getPeopleName(), people1.getPeopleName()); 49 | 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /dexcoder-test/src/test/java/com/dexcoder/test/persistence/JdbcDaoMultiTableTest.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.test.persistence; 2 | 3 | import java.util.Date; 4 | 5 | import org.junit.Assert; 6 | import org.junit.Test; 7 | import org.junit.runner.RunWith; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.test.context.ContextConfiguration; 10 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 11 | 12 | import com.dexcoder.dal.JdbcDao; 13 | import com.dexcoder.dal.build.Criteria; 14 | import com.dexcoder.test.model.Book; 15 | import com.dexcoder.test.model.Chapter; 16 | 17 | /** 18 | * 水平分表测试 19 | * 20 | * Created by liyd on 2016-1-14. 21 | */ 22 | @RunWith(SpringJUnit4ClassRunner.class) 23 | @ContextConfiguration(locations = { "classpath:multiTable-applicationContext.xml" }) 24 | public class JdbcDaoMultiTableTest { 25 | 26 | @Autowired 27 | private JdbcDao jdbcDao; 28 | 29 | @Test 30 | public void multiTableBook() { 31 | //50本书,这里是否分表插入了需要人工看数据库 32 | //毕竟如果没有分表,get也没分表还是能取到结果 33 | for (int i = 1; i < 51; i++) { 34 | jdbcDao.delete(Book.class,(long)i); 35 | Book book = new Book(); 36 | book.setBookId((long) i); 37 | book.setBookName("测试book" + i); 38 | book.setGmtCreate(new Date()); 39 | jdbcDao.save(book); 40 | } 41 | } 42 | 43 | @Test 44 | public void multiTableChapter() { 45 | //两次插入bookId不同,根据CustomMappingHandler中的策略应该在不同的表中 46 | for (int i = 1; i < 51; i++) { 47 | 48 | Chapter chapter = new Chapter(); 49 | chapter.setChapterId((long) i); 50 | chapter.setBookId(5L); 51 | jdbcDao.delete(chapter); 52 | 53 | chapter.setChapterName("章节一" + i); 54 | chapter.setGmtCreate(new Date()); 55 | jdbcDao.save(chapter); 56 | } 57 | for (int i = 51; i < 101; i++) { 58 | Chapter chapter = new Chapter(); 59 | chapter.setChapterId((long) i); 60 | chapter.setBookId(6L); 61 | jdbcDao.delete(chapter); 62 | 63 | chapter.setChapterName("章节二" + i); 64 | chapter.setGmtCreate(new Date()); 65 | jdbcDao.save(chapter); 66 | } 67 | } 68 | 69 | @Test 70 | public void multiTableChapterQuery() { 71 | Chapter chapter = new Chapter(); 72 | chapter.setChapterId(22L); 73 | chapter.setBookId(5L); 74 | chapter = jdbcDao.querySingleResult(chapter); 75 | Assert.assertNotNull(chapter); 76 | chapter = jdbcDao.querySingleResult(Criteria.select(Chapter.class).where("chapterId", new Object[] { 67L }) 77 | .and("bookId", new Object[] { 6L })); 78 | Assert.assertNotNull(chapter); 79 | } 80 | 81 | @Test 82 | public void multiTableChapterUpdate() { 83 | Chapter chapter = new Chapter(); 84 | chapter.setChapterId(22L); 85 | chapter.setBookId(5L); 86 | chapter.setChapterName("updateChapter"); 87 | jdbcDao.update(chapter); 88 | 89 | Chapter tmp = jdbcDao.querySingleResult(Criteria.select(Chapter.class).where("chapterId", new Object[] { 22L }) 90 | .and("bookId", new Object[] { 5L })); 91 | Assert.assertEquals("updateChapter", tmp.getChapterName()); 92 | } 93 | 94 | @Test 95 | public void multiTableChapterDelete() { 96 | Chapter chapter = new Chapter(); 97 | chapter.setChapterId(23L); 98 | chapter.setBookId(5L); 99 | jdbcDao.delete(chapter); 100 | 101 | Chapter tmp = jdbcDao.querySingleResult(Criteria.select(Chapter.class).where("chapterId", new Object[] { 23L }) 102 | .and("bookId", new Object[] { 5L })); 103 | Assert.assertNull(tmp); 104 | } 105 | 106 | } 107 | -------------------------------------------------------------------------------- /dexcoder-test/src/test/java/com/dexcoder/test/persistence/OracleTest.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.test.persistence; 2 | 3 | import java.util.Date; 4 | 5 | import org.junit.Assert; 6 | import org.junit.Test; 7 | import org.junit.runner.RunWith; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.test.context.ContextConfiguration; 10 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 11 | 12 | import com.dexcoder.dal.JdbcDao; 13 | import com.dexcoder.test.model.UserInfo; 14 | 15 | /** 16 | * Created by liyd on 16/10/17. 17 | */ 18 | 19 | @RunWith(SpringJUnit4ClassRunner.class) 20 | @ContextConfiguration(locations = { "classpath:oracle-applicationContext.xml" }) 21 | public class OracleTest { 22 | 23 | @Autowired 24 | private JdbcDao jdbcDao; 25 | 26 | @Test 27 | public void insert() { 28 | 29 | UserInfo userInfo = new UserInfo(); 30 | userInfo.setUserName("selfly"); 31 | userInfo.setPassword("123456"); 32 | userInfo.setEmail("selfly@foxmail.com"); 33 | userInfo.setAge(20); 34 | userInfo.setGmtCreate(new Date()); 35 | 36 | Object id = jdbcDao.insert(userInfo); 37 | 38 | System.out.println(id); 39 | //返回的是序列的值,而非序列名 40 | Assert.assertTrue(id instanceof Long); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /dexcoder-test/src/test/java/com/dexcoder/test/persistence/ResourceTest.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.test.persistence; 2 | 3 | import org.junit.Test; 4 | import org.springframework.core.io.Resource; 5 | import org.springframework.core.io.support.PathMatchingResourcePatternResolver; 6 | import org.springframework.core.io.support.ResourcePatternResolver; 7 | 8 | /** 9 | * Created by liyd on 2015-11-17. 10 | */ 11 | public class ResourceTest { 12 | 13 | @Test 14 | public void resourceTest() throws Exception { 15 | ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver(); 16 | Resource[] resources = resourcePatternResolver.getResources("*.xml"); 17 | 18 | for (Resource resource : resources) { 19 | System.out.println(resource.getFile().getAbsolutePath()); 20 | } 21 | 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /dexcoder-test/src/test/java/com/dexcoder/test/tmp/SiteMapUtils.java: -------------------------------------------------------------------------------- 1 | //package com.dexcoder.commons.utils; 2 | // 3 | //import java.io.FileOutputStream; 4 | //import java.io.PrintWriter; 5 | //import java.util.List; 6 | //import java.util.Map; 7 | // 8 | //import javax.xml.parsers.DocumentBuilder; 9 | //import javax.xml.parsers.DocumentBuilderFactory; 10 | //import javax.xml.parsers.ParserConfigurationException; 11 | //import javax.xml.transform.OutputKeys; 12 | //import javax.xml.transform.Transformer; 13 | //import javax.xml.transform.TransformerFactory; 14 | //import javax.xml.transform.dom.DOMSource; 15 | //import javax.xml.transform.stream.StreamResult; 16 | // 17 | //import org.apache.commons.collections.CollectionUtils; 18 | //import org.w3c.dom.Document; 19 | //import org.w3c.dom.Element; 20 | // 21 | //import com.dexcoder.commons.exceptions.CommonsAssistantException; 22 | // 23 | ///** 24 | // * Created by liyd on 11/5/14. 25 | // */ 26 | //public class SiteMapUtils { 27 | // 28 | // /** 29 | // * 获取xml document对象 30 | // * 31 | // * @return 32 | // */ 33 | // public static Document getDocument() { 34 | // 35 | // try { 36 | // DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 37 | // DocumentBuilder builder = factory.newDocumentBuilder(); 38 | // return builder.newDocument(); 39 | // } catch (ParserConfigurationException e) { 40 | // throw new CommonsAssistantException("创建document对象失败", e); 41 | // } 42 | // 43 | // } 44 | // 45 | // /** 46 | // * 创建sitemap到指定路径下 47 | // * 48 | // * @param urlList 49 | // * @param targetPath 50 | // */ 51 | // public static void createSiteMapXml(List> urlList, String targetPath) { 52 | // 53 | // if (CollectionUtils.isEmpty(urlList)) { 54 | // return; 55 | // } 56 | // 57 | // Document document = getDocument(); 58 | // Element urlset = document.createElement("urlset"); 59 | // urlset.setAttribute("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9"); 60 | // document.appendChild(urlset); 61 | // 62 | // for (Map map : urlList) { 63 | // 64 | // Element url = document.createElement("url"); 65 | // urlset.appendChild(url); 66 | // 67 | // for (Map.Entry entry : map.entrySet()) { 68 | // 69 | // Element element = document.createElement(entry.getKey()); 70 | // element.setTextContent(entry.getValue()); 71 | // url.appendChild(element); 72 | // } 73 | // } 74 | // 75 | // outputXml(document, targetPath); 76 | // } 77 | // 78 | // /** 79 | // * 将XML文件输出到指定的路径 80 | // * 81 | // * @param doc 82 | // * @param fileName 83 | // * @throws Exception 84 | // */ 85 | // public static void outputXml(Document doc, String fileName) { 86 | // try { 87 | // TransformerFactory tf = TransformerFactory.newInstance(); 88 | // Transformer transformer = tf.newTransformer(); 89 | // DOMSource source = new DOMSource(doc); 90 | // transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); 91 | // //设置文档的换行与缩进 92 | // transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 93 | // PrintWriter pw = new PrintWriter(new FileOutputStream(fileName)); 94 | // StreamResult result = new StreamResult(pw); 95 | // transformer.transform(source, result); 96 | // } catch (Exception e) { 97 | // throw new CommonsAssistantException("写入xml文件失败", e); 98 | // } 99 | // } 100 | //} 101 | -------------------------------------------------------------------------------- /dexcoder-test/src/test/java/com/dexcoder/test/transaction/JdbcDaoTransactionService.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.test.transaction; 2 | 3 | /** 4 | * JdbcDao事务测试 5 | *

6 | * Created by liyd on 2015-11-6. 7 | */ 8 | public interface JdbcDaoTransactionService { 9 | 10 | /** 11 | * jdbcDao 多数据源时事务测试 12 | * 13 | * @param bookId 14 | */ 15 | void updateBook(Long bookId); 16 | } 17 | -------------------------------------------------------------------------------- /dexcoder-test/src/test/java/com/dexcoder/test/transaction/JdbcDaoTransactionServiceImpl.java: -------------------------------------------------------------------------------- 1 | //package com.dexcoder.test.transaction; 2 | // 3 | //import java.util.Date; 4 | // 5 | //import org.slf4j.Logger; 6 | //import org.slf4j.LoggerFactory; 7 | //import org.springframework.beans.factory.annotation.Autowired; 8 | // 9 | //import com.dexcoder.dal.JdbcDao; 10 | //import com.dexcoder.dal.test.model.Book; 11 | //import com.dexcoder.dal.test.model.Chapter; 12 | // 13 | ///** 14 | // * Created by liyd on 2015-11-6. 15 | // */ 16 | ////@Service 17 | //public class JdbcDaoTransactionServiceImpl implements JdbcDaoTransactionService { 18 | // 19 | // private static final Logger LOG = LoggerFactory.getLogger(JdbcDaoTransactionServiceImpl.class); 20 | // 21 | // @Autowired 22 | // private JdbcDao jdbcDao; 23 | // 24 | // public void updateBook(Long bookId) { 25 | // 26 | // //先读操作,应该都是null,因为读库无数据 27 | // Book book = jdbcDao.get(Book.class, bookId); 28 | // LOG.info("book:{}", book); 29 | // 30 | // //这里只是测试,数据未做主从同步,预料中首次读数据源无数据会返回null,后面会使用写数据源 31 | // if (book == null) { 32 | // book = new Book(); 33 | // book.setBookName("nullBook"); 34 | // //写库上有数据,所以这批数据应该多出来了,但是有一半会被回滚掉,而读库还是空的 35 | // Long id = jdbcDao.insert(book); 36 | // book.setBookId(id); 37 | // } 38 | // 39 | // //写操作 40 | // Chapter chapter = new Chapter(); 41 | // chapter.setBookId(bookId); 42 | // chapter.setChapterName("test chapter"); 43 | // chapter.setGmtCreate(new Date()); 44 | // jdbcDao.insert(chapter); 45 | // 46 | // //写操作 47 | // book.setBookName("update book"); 48 | // jdbcDao.update(book); 49 | // 50 | // //抛出异常,看事务是否回滚 51 | // if (bookId % 2 == 0) { 52 | // throw new RuntimeException("事务回滚"); 53 | // } 54 | // 55 | // } 56 | //} 57 | -------------------------------------------------------------------------------- /dexcoder-test/src/test/java/com/dexcoder/test/utils/SiteMapUtilsTest.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.test.utils; 2 | 3 | import org.junit.Test; 4 | 5 | import java.util.ArrayList; 6 | import java.util.HashMap; 7 | import java.util.List; 8 | import java.util.Map; 9 | 10 | /** 11 | * Created by liyd on 2015-12-15. 12 | */ 13 | public class SiteMapUtilsTest { 14 | 15 | @Test 16 | public void ttt() { 17 | 18 | List> mapList = new ArrayList>(); 19 | Map map = new HashMap(); 20 | map.put("loc", "http://www.oschina.net/code/explore/.repo"); 21 | map.put("priority", "0.6"); 22 | mapList.add(map); 23 | // SiteMapUtils.createSiteMapXml(mapList, "d:/aaa.xml"); 24 | 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /dexcoder-test/src/test/java/com/dexcoder/test/utils/SourceCodeFormatterTest.java: -------------------------------------------------------------------------------- 1 | package com.dexcoder.test.utils;//package com.dexcoder.commons.test.utils; 2 | // 3 | //import org.junit.Test; 4 | // 5 | ///** 6 | // * Created by liyd on 2015-8-14. 7 | // */ 8 | //public class SourceCodeFormatterTest { 9 | // 10 | // @Test 11 | // public void formatEscapeCode() { 12 | // 13 | // String code = SourceCodeFormatter 14 | // .formatEscapeCode( 15 | // "String uri = request.getRequestURI();\n" + 16 | // "String contextPath = request.getContextPath();\n" + 17 | // "if (StringUtils.length(contextPath) > 0) {\n" + 18 | // "uri = StringUtils.substring(uri, contextPath.length());\n" + 19 | // "}"); 20 | // 21 | // System.out.println(code); 22 | // } 23 | //} 24 | -------------------------------------------------------------------------------- /dexcoder-test/src/test/resources/batis-applicationContext.xml: -------------------------------------------------------------------------------- 1 | 2 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 25 | 26 | ${driverClassName} 27 | 28 | 29 | ${jdbcUrl} 30 | 31 | 32 | ${username} 33 | 34 | 35 | ${password} 36 | 37 | 38 | ${initialSize} 39 | 40 | 41 | ${maxActive} 42 | 43 | 44 | ${maxIdle} 45 | 46 | 47 | ${maxWait} 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | ${jdbcTemplate.fetchSize} 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /dexcoder-test/src/test/resources/ds-applicationContext.xml: -------------------------------------------------------------------------------- 1 | 2 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | ${jdbcTemplate.fetchSize} 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /dexcoder-test/src/test/resources/dynamic-ds.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /dexcoder-test/src/test/resources/dynamic-ds2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /dexcoder-test/src/test/resources/init.properties: -------------------------------------------------------------------------------- 1 | #test 2 | driverClassName=com.mysql.jdbc.Driver 3 | jdbcUrl=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8 4 | username=root 5 | password= 6 | jdbcTemplate.fetchSize=350 7 | initialSize = 3 8 | maxActive = 100 9 | maxIdle = 5 10 | maxWait = 10 11 | 12 | -------------------------------------------------------------------------------- /dexcoder-test/src/test/resources/log4j.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /dexcoder-test/src/test/resources/multiTable-applicationContext.xml: -------------------------------------------------------------------------------- 1 | 2 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 26 | 27 | ${driverClassName} 28 | 29 | 30 | ${jdbcUrl} 31 | 32 | 33 | ${username} 34 | 35 | 36 | ${password} 37 | 38 | 39 | ${initialSize} 40 | 41 | 42 | ${maxActive} 43 | 44 | 45 | ${maxIdle} 46 | 47 | 48 | ${maxWait} 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | ${jdbcTemplate.fetchSize} 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /dexcoder-test/src/test/resources/oracle-init.properties: -------------------------------------------------------------------------------- 1 | driverClassName=oracle.jdbc.driver.OracleDriver 2 | jdbcUrl=jdbc:oracle:thin:@127.0.0.1:1521:xe 3 | username=selfly 4 | password=123456 5 | jdbcTemplate.fetchSize=350 6 | initialSize = 3 7 | maxActive = 100 8 | maxIdle = 5 9 | maxWait = 10 -------------------------------------------------------------------------------- /dexcoder-test/src/test/resources/user-sql.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | ${com.dexcoder.test.model.User}, 9 | login_name,password,user_age,user_type,email,gmt_create 10 | 11 | 12 | 13 | insert into USER( 14 | 15 | ) values ( 16 | 17 | #{item} 18 | 19 | ) 20 | 21 | 22 | 23 | insert into USER( 24 | 25 | ) values ( 26 | #{user.loginName}, 27 | #{user.password}, 28 | #{user.userAge}, 29 | #{user.userType}, 30 | #{user.email}, 31 | #{user.gmtCreate} 32 | ) 33 | 34 | 35 | 36 | insert into USER( 37 | 38 | ) values ( 39 | 'batisUser3', 40 | '123456', 41 | 18, 42 | '1', 43 | 'batis3@dexcoder.com', 44 | now() 45 | ) 46 | 47 | 48 | 49 | insert into USER( 50 | 51 | ) values ( 52 | #{parameters[0]}, 53 | #{parameters[1]}, 54 | #{parameters[2]}, 55 | #{parameters[3]}, 56 | #{parameters[4]}, 57 | #{parameters[5]} 58 | ) 59 | 60 | 61 | 74 | 75 | 88 | 89 | -------------------------------------------------------------------------------- /md/other-component.md: -------------------------------------------------------------------------------- 1 | - 比Apache BeanUtils更强大高效的Bean转换工具类`BeanConverter`。支持属性的过滤及实现自定义的类型转换器。 2 | 3 | - office操作封装工具类`ExcelReadTools`和`ExcelWriteTools`。对程序员来说office操作最多的莫过于excel了,提供了对excel的读写实现。支持扩展实现自宝义的表格样式。 4 | 5 | - 运行时的异常结果拦截器。`RunBinderInterceptor`可以和`RunBinderMvcInterceptor`配对使用(web项目),`RunBinder`用以获取异常结果信息。 6 | 7 | 其它: 8 | 9 | - 自行实现的轻量简易缓存。包括`LRUCache`,`LFUCache`,`FIFOCache`,目前只用到了LRUCache,可以使用已有的缓存工具类`CacheUtils`直接进行操作。 10 | 11 | - 枚举操作工具类`EnumUtils`。结合当中定义的枚举接口`IEnum`进行操作,可以方便清晰的使用枚举处理及显示一些信息。 12 | 13 | - 加密工具类`EncryptUtils`。目前只有MD5实现。 14 | 15 | - Class工具类`ClassUtils`。获取BeanInfo,自身+指定父类BeanInfo,加载class,反射实例化对象等。 16 | 17 | - 图片工具类`ImageUtils`。支持图片缩放,裁剪,加水印等。 18 | 19 | - 名称及命名转换工具类`NameUtils`。提供下划线命名到骆驼命名的相互转换,及首字母大写、首字母小写、保留后缀生成唯一文件名等操作。 20 | 21 | - 配置文件属性获取工具类`PropertyUtils`。默认优先从tomcat的conf目录获取,如果conf目录下没有则从classpath获取,方便部署时不用修改properties配置文件。 22 | 23 | - 序列化工具类`SerializeUtils`。序列化和反序列化,jdk原生实现。 24 | 25 | - 代码格式化工具类`SourceCodeFormatter`。使用了eclipse的组件,目前只能完美格式化Java代码,另外使用dom4j增加了xml的格式化。ps:本来打算站点用的后来感觉比较鸡肋了。 26 | 27 | - 字符文本内容工具类`TextUtils`。一些StringUtils中没有的字符串操作,奈何StringUtils这类太多了,只能命名TextUtils了。 28 | 29 | - 时间工具类`TimeUtils`。提供返回跟当前时间`几分钟前`,`几小时前`这种xxxx前的时间格式。 30 | 31 | - UUID工具类`UUIDUtils`。提供返回8位、16位、32位的UUID。 32 | 33 | - 线程执行工具类`ThreadExecutionUtils`。方便执行多线程任务。 34 | 35 | - Spring mvc中针对上面定义的IEnum从页面字符值到枚举的转换类`IEnumConverterFactory`。 -------------------------------------------------------------------------------- /md/update-log.md: -------------------------------------------------------------------------------- 1 | ##更新日志 2 | 3 | ### 版本 2.3.5 更新时间:2016-06-08 4 | 5 | - 重构分页功能,支持sql解析方式,用户可自由选择 6 | - 修正Criteria方式先使用queryCount再queryList,order by丢失问题 7 | - 修正RunBinder拦截器事务嵌套有错时,事务回滚出错问题 8 | 9 | ### 版本 2.3.4 更新时间:2016-05-11 10 | 11 | - 修正使用Criteria方式调用queryCount方法后不能再queryList的bug 12 | 13 | ### 版本 2.3.3 更新时间:2016-04-28 14 | 15 | - 修正自定义sql查询使用PageControl分页时使用pager不能获取实体对象问题 16 | - 修正使用Criteria方式查询时,当同一属性有多个where条件时被覆盖问题 17 | - 根据反馈意见,自定义sql查询返回map时返回原生列名,不再进行骆驼命名法转换 18 | - 针对上面的返回原生列名,增强BeanConverter的mapToBean方法,可以直接将下划线分隔的原生列名转换为实体,也可以自已指定分隔符 19 | 20 | 21 | ### 版本 2.3.2 更新时间:2016-04-22 22 | 23 | - spring升级到4.x版本 24 | - 修正执行自定义sql分页无数据时空指针异常的问题 25 | 26 | ### 版本 2.3.1 更新时间:2016-03-03 27 | 28 | - 增加queryRowMap方法 29 | - 增加queryObjectList方法 30 | - 增加一系列执行自定义sql时返回实体重载方法 31 | - 保持命名统一,querySingleRowMapForSql方法改名为querySingleResultForSql,queryRowMapListForSql方法改名为queryListForSql 32 | - batis方式加载xml出错时提示信息细化 33 | - 实体父类Pageable增加put、get、remove等方法方便操作时在实体不增加属性的情况下保存想要的数据 34 | - Bean转换工具类BeanConverter增加map转实体bean方法 35 | - 修正多个参数使用or时操作符有时会出错的bug 36 | - 修正where条件使用in、not in等操作符当值只有一个时括号bug 37 | - 修正使用动态数据源时,数据源属性不是String是出错的bug 38 | - 修正动态数据源配置文件添加注释时导致出错bug 39 | - 优化Excel处理工具类 40 | - 修正Commons包中TextUtils替换特殊字符时数组越界bug 41 | - 其它细节修正 42 | 43 | ### 版本 2.3.0 更新时间:2016-01-18 44 | 45 | - 实体类表名及属性名映射增加注解支持 46 | - 增加更多的执行自定义sql方法 47 | - 因为sql权限问题去掉使用TRUNCATE的deleteAll方法 48 | - 修正使用注解时注解的属性名不遵循规范时get方法主键错误问题 49 | - 修正水平拆分数据分表不根据主键拆分时update无法获取表名的问题 50 | - 修改NameHandler类名为MappingHandler 51 | 52 | ### 版本 2.2.0-beta1 更新时间:2015-12-23 53 | 54 | - update更新支持选择是否更新值为null的属性 55 | 56 | ### 版本 2.1.0-beta1 更新时间:2015-12-22 57 | 58 | - 增加表别名支持 59 | 60 | 具体请看:[增加表别名支持](http://www.dexcoder.com/selfly/article/4309) 61 | 62 | ### 版本:v2.0.0-beta1 更新时间:2015-12-15 63 | 64 | - 本版进行了彻底的重构,提供了更好的扩展和更多的功能。 65 | - 重构之前版本分支:[通用dao v1.2.4](https://github.com/selfly/dexcoder-assistant/tree/v1.2.4) 66 | 67 | ### 版本:V1.2.3 更新时间:2015-11-2 68 | 69 | - 增加读写分离,动态数据源支持 70 | 71 | 具体请看:[动态数据源的使用](http://www.dexcoder.com/selfly/article/4049 "通用JdbcDao更新,增加动态数据源,支持权重和读写分离") 72 | 73 | ### 版本:2015-10-27 更新时间:V1.1.2版本 74 | 75 | - 增加了数据拆分时,水平分表的支持。 76 | 77 | 具体请看:[增加数据分表水平拆分支持](http://www.dexcoder.com/selfly/article/3857 "增加数据分表水平拆分支持") 78 | 79 | ### 版本:2015-10-9 更新时间:V1.0.2版本 80 | 81 | - 增加了括号的支持,可以实现不同的属性在括号内or的情况: 82 | 83 | 具体请看:[通用JdbcDao更新,增加括号支持](http://www.dexcoder.com/selfly/article/3846 "通用JdbcDao更新,增加括号支持") --------------------------------------------------------------------------------