// Path: src/main/java/org/easyarch/slardar/cache/InterfaceCache.java
// public class InterfaceCache implements Cache<Class,ClassItem>{
// 
//     private volatile Cache<Class,ClassItem> cache;
// 
//     public InterfaceCache(Cache<Class,ClassItem> cache){
//         this.cache = cache;
//     }
// 
//     @Override
//     public ClassItem get(Class key) {
//         return cache.get(key);
//     }
// 
//     @Override
//     public void set(Class key, ClassItem value) {
//         if (value == null){
//             return;
//         }
//         cache.set(key,value);
//     }
// 
//     @Override
//     public ClassItem remove(Class key) {
//         return cache.remove(key);
//     }
// 
//     @Override
//     public boolean isHit(Class key) {
//         return cache.isHit(key);
//     }
// 
//     @Override
//     public void clear() {
//         cache.clear();
//     }
// }
// 
// Path: src/main/java/org/easyarch/slardar/cache/factory/InterfaceCacheFactory.java
// public class InterfaceCacheFactory extends AbstractCacheFactory<InterfaceCache> {
// 
//     private static InterfaceCacheFactory interfaceCacheFactory;
// 
//     private volatile InterfaceCache interfaceCache;
// 
//     public static InterfaceCacheFactory getInstance() {
//         synchronized (InterfaceCacheFactory.class){
//             if (interfaceCacheFactory == null){
//                 synchronized (InterfaceCacheFactory.class){
//                     interfaceCacheFactory = new InterfaceCacheFactory();
//                 }
//             }
//         }
//         return interfaceCacheFactory;
//     }
// 
//     private InterfaceCacheFactory(){
// 
//     }
//     @Override
//     public InterfaceCache createCache(CacheEntity entity) {
//         if (interfaceCache == null){
//             if (entity != null &&entity.isEnable()){
//                 switch (entity.getMode()){
//                     case FIFO:
//                         interfaceCache = new InterfaceCache(new FIFOCache<>(entity.getSize()));
//                         return interfaceCache;
//                     case LRU:
//                         interfaceCache = new InterfaceCache(new LRUCache<>(entity.getSize()));
//                         return interfaceCache;
//                     case TIMEOUT:
//                         interfaceCache = new InterfaceCache(new TimeOutCache<>(entity.getSize()));
//                         return interfaceCache;
//                     default:
//                         interfaceCache = new InterfaceCache(new DefaultCache<>());
//                         return interfaceCache;
//                 }
//             }
//             interfaceCache = new InterfaceCache(new DefaultCache<>());
//         }
//         return interfaceCache;
//     }
// }
// 
// Path: src/main/java/org/easyarch/slardar/session/impl/MapperDBSession.java
// public class MapperDBSession extends DBSessionAdapter {
// 
//     private ProxyCacheFactory factory;
// 
//     private Configuration configuration;
// 
//     private AbstractExecutor executor;
// 
//     public MapperDBSession(Configuration configuration, AbstractExecutor executor) {
//         this.executor = executor;
//         this.configuration = configuration;
//         factory = ProxyCacheFactory.getInstance();
//     }
// 
//     @Override
//     public <T> T selectOne(String sql, Class<T> clazz, Object... parameters) {
//         return executor.query(sql,new BeanResultSetHadler<T>(clazz),parameters);
//     }
// 
//     @Override
//     public <E> List<E> selectList(String sql, Class<E> clazz, Object... parameters) {
//         List<E> list = executor.query(sql, new BeanListResultSetHadler<>(clazz), parameters);
//         return list;
//     }
// 
//     @Override
//     public int selectCount(String sql, Object... parameters) {
//         return executor.query(sql, new BaseTypeResultSetHandler<>(Integer.class), parameters);
//     }
// 
//     @Override
//     public List<Map<String, Object>> selectMap(String sql, Object... parameters) {
//         List<Map<String, Object>> list = executor.query(sql, new MapResultHandler(), parameters);
//         return list;
//     }
// 
//     @Override
//     public int update(String sql, Object... parameter) {
//         return executor.alter(sql, parameter);
//     }
// 
//     @Override
//     public int delete(String sql, Object... parameter) {
//         return update(sql, parameter);
//     }
// 
//     @Override
//     public int insert(String sql, Object... parameter) {
//         return update(sql, parameter);
//     }
// 
//     @Override
//     public <T> T getMapper(Class<T> clazz) {
//         ProxyCache proxyCache = factory.createCache(configuration.getCacheEntity());
//         if (proxyCache.isHit(clazz)){
//             return (T) proxyCache.get(clazz);
//         }
//         MapperProxyFactory<T> mapperProxyFactory = new MapperProxyFactory(configuration,clazz);
//         return mapperProxyFactory.newInstance(this);
//     }
// 
//     @Override
//     public Configuration getConfiguration() {
//         return configuration;
//     }
// 
//     @Override
//     public void close() {
//         executor.close();
//     }
// 
//     @Override
//     public void rollback() {
//         executor.rollback();
//     }
// }


import org.easyarch.slardar.annotation.sql.Mapper;
import org.easyarch.slardar.cache.InterfaceCache;
import org.easyarch.slardar.cache.factory.InterfaceCacheFactory;
import org.easyarch.slardar.session.impl.MapperDBSession;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
package org.easyarch.slardar.mapping;



/**
 * Description :
 * Created by xingtianyu on 17-1-24
 * 下午8:17
 * description:
 */

public class MapperProxy<T> implements InvocationHandler {

    private MapperDBSession session;

    private Class<T> interfaceClass;

    private InterfaceCache interfaceCache;

    public MapperProxy(MapperDBSession session, Class<T> interfaceClass){
        this.session = session;
        this.interfaceClass = interfaceClass;
// Path: src/main/java/org/easyarch/slardar/cache/InterfaceCache.java
// public class InterfaceCache implements Cache<Class,ClassItem>{
// 
//     private volatile Cache<Class,ClassItem> cache;
// 
//     public InterfaceCache(Cache<Class,ClassItem> cache){
//         this.cache = cache;
//     }
// 
//     @Override
//     public ClassItem get(Class key) {
//         return cache.get(key);
//     }
// 
//     @Override
//     public void set(Class key, ClassItem value) {
//         if (value == null){
//             return;
//         }
//         cache.set(key,value);
//     }
// 
//     @Override
//     public ClassItem remove(Class key) {
//         return cache.remove(key);
//     }
// 
//     @Override
//     public boolean isHit(Class key) {
//         return cache.isHit(key);
//     }
// 
//     @Override
//     public void clear() {
//         cache.clear();
//     }
// }
// 
// Path: src/main/java/org/easyarch/slardar/cache/factory/InterfaceCacheFactory.java
// public class InterfaceCacheFactory extends AbstractCacheFactory<InterfaceCache> {
// 
//     private static InterfaceCacheFactory interfaceCacheFactory;
// 
//     private volatile InterfaceCache interfaceCache;
// 
//     public static InterfaceCacheFactory getInstance() {
//         synchronized (InterfaceCacheFactory.class){
//             if (interfaceCacheFactory == null){
//                 synchronized (InterfaceCacheFactory.class){
//                     interfaceCacheFactory = new InterfaceCacheFactory();
//                 }
//             }
//         }
//         return interfaceCacheFactory;
//     }
// 
//     private InterfaceCacheFactory(){
// 
//     }
//     @Override
//     public InterfaceCache createCache(CacheEntity entity) {
//         if (interfaceCache == null){
//             if (entity != null &&entity.isEnable()){
//                 switch (entity.getMode()){
//                     case FIFO:
//                         interfaceCache = new InterfaceCache(new FIFOCache<>(entity.getSize()));
//                         return interfaceCache;
//                     case LRU:
//                         interfaceCache = new InterfaceCache(new LRUCache<>(entity.getSize()));
//                         return interfaceCache;
//                     case TIMEOUT:
//                         interfaceCache = new InterfaceCache(new TimeOutCache<>(entity.getSize()));
//                         return interfaceCache;
//                     default:
//                         interfaceCache = new InterfaceCache(new DefaultCache<>());
//                         return interfaceCache;
//                 }
//             }
//             interfaceCache = new InterfaceCache(new DefaultCache<>());
//         }
//         return interfaceCache;
//     }
// }
// 
// Path: src/main/java/org/easyarch/slardar/session/impl/MapperDBSession.java
// public class MapperDBSession extends DBSessionAdapter {
// 
//     private ProxyCacheFactory factory;
// 
//     private Configuration configuration;
// 
//     private AbstractExecutor executor;
// 
//     public MapperDBSession(Configuration configuration, AbstractExecutor executor) {
//         this.executor = executor;
//         this.configuration = configuration;
//         factory = ProxyCacheFactory.getInstance();
//     }
// 
//     @Override
//     public <T> T selectOne(String sql, Class<T> clazz, Object... parameters) {
//         return executor.query(sql,new BeanResultSetHadler<T>(clazz),parameters);
//     }
// 
//     @Override
//     public <E> List<E> selectList(String sql, Class<E> clazz, Object... parameters) {
//         List<E> list = executor.query(sql, new BeanListResultSetHadler<>(clazz), parameters);
//         return list;
//     }
// 
//     @Override
//     public int selectCount(String sql, Object... parameters) {
//         return executor.query(sql, new BaseTypeResultSetHandler<>(Integer.class), parameters);
//     }
// 
//     @Override
//     public List<Map<String, Object>> selectMap(String sql, Object... parameters) {
//         List<Map<String, Object>> list = executor.query(sql, new MapResultHandler(), parameters);
//         return list;
//     }
// 
//     @Override
//     public int update(String sql, Object... parameter) {
//         return executor.alter(sql, parameter);
//     }
// 
//     @Override
//     public int delete(String sql, Object... parameter) {
//         return update(sql, parameter);
//     }
// 
//     @Override
//     public int insert(String sql, Object... parameter) {
//         return update(sql, parameter);
//     }
// 
//     @Override
//     public <T> T getMapper(Class<T> clazz) {
//         ProxyCache proxyCache = factory.createCache(configuration.getCacheEntity());
//         if (proxyCache.isHit(clazz)){
//             return (T) proxyCache.get(clazz);
//         }
//         MapperProxyFactory<T> mapperProxyFactory = new MapperProxyFactory(configuration,clazz);
//         return mapperProxyFactory.newInstance(this);
//     }
// 
//     @Override
//     public Configuration getConfiguration() {
//         return configuration;
//     }
// 
//     @Override
//     public void close() {
//         executor.close();
//     }
// 
//     @Override
//     public void rollback() {
//         executor.rollback();
//     }
// }


// Path: src/main/java/org/easyarch/slardar/mapping/MapperProxy.java
import org.easyarch.slardar.annotation.sql.Mapper;
import org.easyarch.slardar.cache.InterfaceCache;
import org.easyarch.slardar.cache.factory.InterfaceCacheFactory;
import org.easyarch.slardar.session.impl.MapperDBSession;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

package org.easyarch.slardar.mapping;



/**
 * Description :
 * Created by xingtianyu on 17-1-24
 * 下午8:17
 * description:
 */

public class MapperProxy<T> implements InvocationHandler {

    private MapperDBSession session;

    private Class<T> interfaceClass;

    private InterfaceCache interfaceCache;

    public MapperProxy(MapperDBSession session, Class<T> interfaceClass){
        this.session = session;
        this.interfaceClass = interfaceClass;
        this.interfaceCache = InterfaceCacheFactory.getInstance()