常用的后端工具集

一、LinkedBlockingQueue的增强版

import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.LinkedBlockingQueue;


/**
 * LinkedBlockingQueue的增强版(队伍内未消费的元素保证是不重复的)
 */
public class BlockingUniqueQueue<E> extends LinkedBlockingQueue<E> {

    private static final long serialVersionUID = 8351632564634804122L;

    private Set<E> datas = new HashSet<>();

    @Override
    public boolean contains(Object o) {
        return datas.contains(o);
    }

    @Override
    public boolean containsAll(Collection<?> c) {
        return datas.containsAll(c);
    }

    @Override
    public E take() {
        //该方法千万不要用 synchronized 修饰,不然一旦take()方法被阻塞了,另外一条线程就永远不能add了
        E head = null;
        try{
            head = super.take();
        }catch(Exception e){

        }
        datas.remove(head);
        return head;

    }

    @Override
    public synchronized boolean add(E e) {
        if (contains(e)) {
            return false;
        }
        datas.add(e);
        return super.add(e);
    }

    @Override
    public synchronized boolean addAll(Collection<? extends E> c) {
        boolean modified = false;
        for (E e : c) {
            if (add(e)) {
                modified = true;
            }
        }
        return modified;
    }

    @Override
    public synchronized boolean remove(Object o) {
        datas.remove(o);
        return super.remove(o);
    }

    @Override
    public synchronized boolean removeAll(Collection<?> c) {
        for (Object e:c) {
            datas.remove(e);
        }
        return super.removeAll(c);
    }

    @Override
    public Iterator<E> iterator() {
        return new Itr(super.iterator());
    }

    private class Itr implements Iterator<E> {

        private Iterator<E> it;

        private E curr;

        Itr(Iterator<E> it) {
            this.it = it;
        }

        @Override
        public boolean hasNext() {
            return this.it.hasNext();
        }

        @Override
        public E next() {
            this.curr = this.it.next();
            return this.curr;
        }

        @Override
        public void remove() {
            synchronized(BlockingUniqueQueue.this) {
                this.it.remove();
                BlockingUniqueQueue.this.datas.remove(this.curr);
            }
        }
    }

}

二、Jvm工具类

import java.io.OutputStream;
import java.lang.management.*;
import java.nio.charset.StandardCharsets;

/**
 * JvmUtils
 */
public class JvmUtils {

    /**
     * The java stack
     *
     * @param stream {@link OutputStream}
     * @throws Exception exception
     */
    public static void jStack(OutputStream stream) throws Exception {
        ThreadMXBean threadMxBean = ManagementFactory.getThreadMXBean();
        for (ThreadInfo threadInfo : threadMxBean.dumpAllThreads(true, true)) {
            stream.write(getThreadDumpString(threadInfo).getBytes(StandardCharsets.UTF_8));
        }
    }

    private static String getThreadDumpString(ThreadInfo threadInfo) {
        StringBuilder sb = new StringBuilder("\"" + threadInfo.getThreadName() + "\""
                + " Id=" + threadInfo.getThreadId() + " " + threadInfo.getThreadState());
        if (threadInfo.getLockName() != null) {
            sb.append(" on ").append(threadInfo.getLockName());
        }
        if (threadInfo.getLockOwnerName() != null) {
            sb.append(" owned by \"").append(threadInfo.getLockOwnerName())
                    .append("\" Id=").append(threadInfo.getLockOwnerId());
        }
        if (threadInfo.isSuspended()) {
            sb.append(" (suspended)");
        }
        if (threadInfo.isInNative()) {
            sb.append(" (in native)");
        }
        sb.append('\n');
        int i = 0;

        StackTraceElement[] stackTrace = threadInfo.getStackTrace();
        MonitorInfo[] lockedMonitors = threadInfo.getLockedMonitors();
        for (; i < stackTrace.length && i < 32; i++) {
            StackTraceElement ste = stackTrace[i];
            sb.append("\tat ").append(ste.toString());
            sb.append('\n');
            if (i == 0 && threadInfo.getLockInfo() != null) {
                Thread.State ts = threadInfo.getThreadState();
                switch (ts) {
                    case BLOCKED:
                        sb.append("\t-  blocked on ").append(threadInfo.getLockInfo());
                        sb.append('\n');
                        break;
                    case WAITING:
                        sb.append("\t-  waiting on ").append(threadInfo.getLockInfo());
                        sb.append('\n');
                        break;
                    case TIMED_WAITING:
                        sb.append("\t-  waiting on ").append(threadInfo.getLockInfo());
                        sb.append('\n');
                        break;
                    default:
                }
            }

            for (MonitorInfo mi : lockedMonitors) {
                if (mi.getLockedStackDepth() == i) {
                    sb.append("\t-  locked ").append(mi);
                    sb.append('\n');
                }
            }
        }
        if (i < stackTrace.length) {
            sb.append("\t...");
            sb.append('\n');
        }

        LockInfo[] locks = threadInfo.getLockedSynchronizers();
        if (locks.length > 0) {
            sb.append("\n\tNumber of locked synchronizers = ").append(locks.length);
            sb.append('\n');
            for (LockInfo li : locks) {
                sb.append("\t- ").append(li);
                sb.append('\n');
            }
        }
        sb.append('\n');

        return sb.toString();
    }

}

三、基于LinkedHashMap实现的一个有限队列缓存 有时间及大小的限制

/**
 * 基于LinkedHashMap实现的一个有限队列缓存 有时间及大小的限制
 * aliveTime参数为true时为模拟lru规则
 */
public class LimitedCacheMap<K, V> {

    private LinkedHashMap<K, Element<V>> data;

    /**
     * 缓存最大容量,添加新元素时,若当前长度超过容量,则会删除队首元素
     */
    private int capacity;

    /** 生存时长(毫秒数) */
    private long aliveTime;

    /**
     * 是否使用lru规则,为true时表示当元素被查找命中时被重放到队尾
     *  {@link LinkedHashMap#accessOrder}}
     */
    private boolean useLru;

    /** 读写锁 */
    private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
    private ReentrantReadWriteLock.ReadLock readLock = lock.readLock();
    private ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock();

    public LimitedCacheMap(int capacity, long aliveTime) {
        this(capacity, aliveTime, Boolean.FALSE);
    }

    public LimitedCacheMap(int capacity, long aliveTime, boolean useLru) {
        this.capacity = capacity;
        this.aliveTime = aliveTime;
        this.useLru = useLru;
        this.data = new LinkedHashMap<K, Element<V>>(capacity, 1.0f, useLru) {
            private static final long serialVersionUID = 1L;

            @Override
            protected boolean removeEldestEntry(Map.Entry<K, Element<V>> eldest) {
                if (size() > capacity) {
                    return true;
                }
                long eleAliveTime = System.currentTimeMillis() - eldest.getValue().bornTime;
                return (eleAliveTime > aliveTime);
            }
        };
    }

    public V put(K key, V value) {
        V preValue = null;
        Element<V> newValue = new Element<V>(value);

        readLock.lock();
        try {
            if (data.containsKey(key)) {
                preValue = data.get(key).value;
            }
            data.put(key, newValue);
            return preValue;
        } finally {
            readLock.unlock();
        }
    }

    public V get(K key) {
        // 当使用lru,元素重放回队尾涉及到写操作,所以用写锁
        Lock lock = this.useLru ? this.writeLock : this.readLock;
        lock.lock();
        Element<V> target = null;
        try {
            target = this.data.get(key);
            if (target == null) {
                return null;
            }
        } finally {
            lock.unlock();
        }
        long eleAlive = System.currentTimeMillis() - target.bornTime;
        if (eleAlive < aliveTime) {
            return target.value;
        }
        remove(key);
        return null;
    }

    public int size() {
        this.readLock.lock();
        try {
            return this.data.size();
        } finally {
            this.readLock.unlock();
        }
    }

    public void remove(K key) {
        this.writeLock.lock();
        try {
            this.data.remove(key);
        } finally {
            this.writeLock.unlock();
        }
    }

    public void clear() {
        this.writeLock.lock();
        try {
            this.data.clear();
        } finally {
            this.writeLock.unlock();
        }
    }

    @Override
    public String toString() {
        return "LinkedCacheMap{data=" + data + ", capacity=" + capacity + ", aliveTime=" + aliveTime + ", useLru="
                + useLru + "}";
    }

    @SuppressWarnings("hiding")
    class Element<V> {
        V value;
        /** 元素添加时的时间戳 */
        long bornTime;

        Element(V v) {
            this.value = v;
            this.bornTime = System.currentTimeMillis();
        }

        @Override
        public String toString() {
            return "Element{" +
                    "value=" + value +
                    ", bornTime=" + bornTime +
                    '}';
        }
    }

}

四、基于Lru算法的HashMap

import java.util.LinkedHashMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


/**
 * LruHashMap is an extension of Java's HashMap, which has a bounded size();
 * When it reaches that size, each time a new element is added, the least recently used (LRU) entry is removed.
 * Java makes it very easy to implement LruHashMap - all its functionality is already available from LinkedHashMap,
 * and we just need to configure that properly.
 * Note that LruHashMap is thread safe
 */
public class LruHashMap<K, V> extends LinkedHashMap<K, V> {

    private static final long serialVersionUID = -5167631809472116969L;

    private static final float DEFAULT_LOAD_FACTOR = 0.75f;

    private static final int DEFAULT_MAX_CAPACITY = 1000;
    private final Lock lock = new ReentrantLock();
    private volatile int maxCapacity;

    public LruHashMap() {
        this(DEFAULT_MAX_CAPACITY);
    }

    public LruHashMap(int maxCapacity) {
        super(16, DEFAULT_LOAD_FACTOR, true);
        this.maxCapacity = maxCapacity;
    }

    @Override
    protected boolean removeEldestEntry(java.util.Map.Entry<K, V> eldest) {
        return size() > maxCapacity;
    }

    @Override
    public boolean containsKey(Object key) {
        try {
            lock.lock();
            return super.containsKey(key);
        } finally {
            lock.unlock();
        }
    }

    @Override
    public V get(Object key) {
        try {
            lock.lock();
            return super.get(key);
        } finally {
            lock.unlock();
        }
    }

    @Override
    public V put(K key, V value) {
        try {
            lock.lock();
            return super.put(key, value);
        } finally {
            lock.unlock();
        }
    }

    @Override
    public V remove(Object key) {
        try {
            lock.lock();
            return super.remove(key);
        } finally {
            lock.unlock();
        }
    }

    @Override
    public int size() {
        try {
            lock.lock();
            return super.size();
        } finally {
            lock.unlock();
        }
    }

    @Override
    public void clear() {
        try {
            lock.lock();
            super.clear();
        } finally {
            lock.unlock();
        }
    }

    public int getMaxCapacity() {
        return maxCapacity;
    }

    public void setMaxCapacity(int maxCapacity) {
        this.maxCapacity = maxCapacity;
    }

}

package com.xxxx.faceadd.jetcache;

import com.google.common.collect.Lists;

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.ReentrantLock;

public class LRUCache<K, V> {

    private final int limit;
    private final Map<K, V> cache;
    private final Deque<K> deque;
    private final ReentrantLock reentrantLock = new ReentrantLock();
    private static final int DEFAULT_CAPACITY = 16;
    private static final float DEFAULT_LOAD_FACTOR = 0.75f;

    public LRUCache(int limit) {
        this.limit = limit;
        deque = new ArrayDeque<>(limit);
        cache = new ConcurrentHashMap<>(DEFAULT_CAPACITY, DEFAULT_LOAD_FACTOR);
    }
    public LRUCache(int limit, int capacity, float loadFactor) {
        this.limit = limit;
        deque = new ArrayDeque<>(limit);
        cache = new ConcurrentHashMap<>(capacity, loadFactor);
    }
    public void put(K key, V value) {
        V v = cache.get(key);
        reentrantLock.lock();
        try {
            if(v == null){
                cache.put(key, value);
                deque.removeFirstOccurrence(key);
                deque.addFirst(key);
            } else {
                deque.removeFirstOccurrence(key);
                deque.addFirst(key);
            }
            if(size() > limit){
                K keys = deque.removeLast();
                if(keys != null){
                    cache.remove(keys);
                }
            }
        }finally {
            reentrantLock.unlock();
        }
    }
    public V get(K key) {
        V v = cache.get(key);
        if(v != null){
            reentrantLock.lock();
            try {
                deque.removeFirstOccurrence(key);
                deque.addFirst(key);
            } finally {
                reentrantLock.unlock();
            }
        }
        return v;
    }

    public int size() {
        return cache.size();
    }

    
    @Override
    public String toString() {
        List<String> values = Lists.newArrayListWithExpectedSize(limit);
        reentrantLock.lock();
        try {
            for (K k : this.deque) {
                 V v = cache.get(k);
                 values.add(k.toString() + " -> " + v.toString());
            }
        } finally {
            reentrantLock.unlock();
        }
        return values.toString();
    }
}

五、网络相关工具类

import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.net.*;
import java.util.Enumeration;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Random;
import java.util.regex.Pattern;

/**
 * NetUtils
 */
@Slf4j
public class NetUtils {

    public static final String LOCALHOST = "127.0.0.1";
    public static final String ANY_HOST = "0.0.0.0";
    private static final int RND_PORT_START = 30000;
    private static final int RND_PORT_RANGE = 10000;

    private static final Random RANDOM = new Random(System.currentTimeMillis());
    private static final int MIN_PORT = 0;
    private static final int MAX_PORT = 65535;
    private static final Pattern ADDRESS_PATTERN = Pattern.compile("^\\d{1,3}(\\.\\d{1,3}){3}\\:\\d{1,5}$");
    private static final Pattern LOCAL_IP_PATTERN = Pattern.compile("127(\\.\\d{1,3}){3}$");
    private static final Pattern IP_PATTERN = Pattern.compile("\\d{1,3}(\\.\\d{1,3}){3,5}$");
    private static final Map<String, String> HOST_NAME_CACHE = new LinkedHashMap<>();
    private static volatile InetAddress LOCAL_ADDRESS = null;
    private static volatile String PROCESS_ID = null;

    public static int getAvailablePort() {
        try (ServerSocket ss = new ServerSocket()) {
            ss.bind(null);
            return ss.getLocalPort();
        } catch (IOException e) {
            return RND_PORT_START + RANDOM.nextInt(RND_PORT_RANGE);
        }
    }

    public static int getAvailablePort(int port) {
        if (port <= 0) {
            return getAvailablePort();
        }
        for (int i = port; i < MAX_PORT; i++) {
            try (ServerSocket ss = new ServerSocket(i)) {
                return i;
            } catch (IOException e) {
                // continue
            }
        }
        return port;
    }

    public static boolean isInvalidPort(int port) {
        return port <= MIN_PORT || port > MAX_PORT;
    }

    public static boolean isValidAddress(String address) {
        return ADDRESS_PATTERN.matcher(address).matches();
    }

    public static boolean isLocalHost(String host) {
        return host != null
                && (LOCAL_IP_PATTERN.matcher(host).matches()
                || "localhost".equalsIgnoreCase(host));
    }

    public static boolean isAnyHost(String host) {
        return "0.0.0.0".equals(host);
    }

    public static boolean isInvalidLocalHost(String host) {
        return host == null
                || host.length() == 0
                || "localhost".equalsIgnoreCase(host)
                || "0.0.0.0".equals(host)
                || (LOCAL_IP_PATTERN.matcher(host).matches());
    }

    public static boolean isValidLocalHost(String host) {
        return !isInvalidLocalHost(host);
    }

    public static InetSocketAddress getLocalSocketAddress(String host, int port) {
        return isInvalidLocalHost(host) ?
                new InetSocketAddress(port) : new InetSocketAddress(host, port);
    }

    private static boolean isValidAddress(InetAddress address) {
        if (address == null || address.isLoopbackAddress()) {
            return false;
        }
        String name = address.getHostAddress();
        return (name != null
                && !ANY_HOST.equals(name)
                && !LOCALHOST.equals(name)
                && IP_PATTERN.matcher(name).matches());
    }

    public static String getLocalHost() {
        InetAddress address = getLocalAddress();
        return address == null ? LOCALHOST : address.getHostAddress();
    }

    /**
     * Find first valid IP from local network card
     *
     * @return first valid local IP
     */
    public static InetAddress getLocalAddress() {
        if (LOCAL_ADDRESS != null) {
            return LOCAL_ADDRESS;
        }
        InetAddress localAddress = getLocalAddress0();
        LOCAL_ADDRESS = localAddress;
        return localAddress;
    }

    private static InetAddress getLocalAddress0() {
        InetAddress localAddress = null;
        try {
            localAddress = InetAddress.getLocalHost();
            if (isValidAddress(localAddress)) {
                return localAddress;
            }
        } catch (Throwable e) {
            log.warn("Failed to retrieving ip address, " + e.getMessage(), e);
        }

        try {
            Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
            if (interfaces != null) {
                while (interfaces.hasMoreElements()) {
                    try {
                        NetworkInterface network = interfaces.nextElement();
                        Enumeration<InetAddress> addresses = network.getInetAddresses();
                        while (addresses.hasMoreElements()) {
                            try {
                                InetAddress address = addresses.nextElement();
                                if (isValidAddress(address)) {
                                    return address;
                                }
                            } catch (Throwable e) {
                                log.warn("Failed to retrieving ip address, " + e.getMessage(), e);
                            }
                        }
                    } catch (Throwable e) {
                        log.warn("Failed to retrieving ip address, " + e.getMessage(), e);
                    }
                }
            }
        } catch (Throwable e) {
            log.warn("Failed to retrieving ip address, " + e.getMessage(), e);
        }

        log.error("Could not get local host ip address, will use 127.0.0.1 instead.");
        return localAddress;
    }

    public static String getHostName(String address) {
        try {
            int i = address.indexOf(':');
            if (i > -1) {
                address = address.substring(0, i);
            }
            String hostname = HOST_NAME_CACHE.get(address);
            if (hostname != null && hostname.length() > 0) {
                return hostname;
            }
            InetAddress inetAddress = InetAddress.getByName(address);
            if (inetAddress != null) {
                hostname = inetAddress.getHostName();
                HOST_NAME_CACHE.put(address, hostname);
                return hostname;
            }
        } catch (Throwable e) {
            // ignore
        }

        return address;
    }

    public static String getIpByHost(String hostName) {
        try {
            return InetAddress.getByName(hostName).getHostAddress();
        } catch (UnknownHostException e) {
            return hostName;
        }
    }

    public static String toAddressString(InetSocketAddress address) {
        return address.getAddress().getHostAddress() + ":" + address.getPort();
    }

    public static InetSocketAddress toAddress(String address) {
        int i = address.indexOf(':');
        String host;
        int port;
        if (i > -1) {
            host = address.substring(0, i);
            port = Integer.parseInt(address.substring(i + 1));
        } else {
            host = address;
            port = 0;
        }

        return new InetSocketAddress(host, port);
    }

    public static String getProcessId() {
        if (PROCESS_ID != null) {
            return PROCESS_ID;
        }

        return PROCESS_ID = ManagementFactory.getRuntimeMXBean().getName().split("@")[0];
    }

}

六、防sql注入参数校验

import lombok.extern.slf4j.Slf4j;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *  防sql注入参数校验
 * */
@Slf4j
public class ParamCheck {

    static String reg = "(?:')|(?:--)|(/\\*(?:.|[\\n\\r])*?\\*/)|"

            + "(\\b(select|update|and|or|delete|insert|trancate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute)\\b)";


    /**
     * 表示忽略大小写
     */
    static Pattern sqlPattern = Pattern.compile(reg, Pattern.CASE_INSENSITIVE);



    /***************************************************************************
     * 参数校验
     * @param str ep: "or 1=1"
     */
    public static boolean isSqlValid(String str) {
        Matcher matcher = sqlPattern.matcher(str);
        if (matcher.find()) {
            //获取非法字符:or
            log.info("参数存在非法字符,请确认:"+matcher.group());
            return false;
        }
        return true;
    }

}

七、对象池

import java.util.concurrent.LinkedBlockingQueue;


public class SimplyObjectPool<E extends MemoryObject> {

    private int capacity;

    private LinkedBlockingQueue<E> queue = new LinkedBlockingQueue<>();

    public SimplyObjectPool(int capacity) {
        this.capacity = capacity;
    }

    @SuppressWarnings("unchecked")
    public E borrowObject(Class<? extends MemoryObject> prototype) throws InstantiationException, IllegalAccessException {
        E object = queue.poll();
        if (object != null) {
            return object;
        }
        return (E) prototype.newInstance();
    }

    public void returnObject(E object) {
        if (this.queue.size() < capacity) {
            object.release();
            this.queue.offer(object);
        }
    }


}


public interface MemoryObject {

	/** 
	 * 释放相关引用
	 */
	void release();
}


八、流处理工具类

import com.google.common.base.Charsets;
import com.google.common.io.CharStreams;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.io.InputStreamReader;

/**
 * Stream Utils
 */
@Slf4j
public class StreamUtils {

    public static String loadScript(String name) {
        try {
            return CharStreams.toString(new InputStreamReader(
                    StreamUtils.class.getResourceAsStream(name), Charsets.UTF_8));
        } catch (IOException e) {
            log.error(e.getMessage(), e);
            return null;
        }
    }

}

九、list集合转String

import com.google.common.base.Joiner;
import java.util.List;

public class StringUtils {

    /**
     * list 转 String
     * @param list
     * @return
     */
    public static String listToJoiner(List<String> list) {
        return Joiner.on(",").join(list);
    }

    /**
     * list 转 String
     * @param list
     * @return
     */
    public static String listToString(List<String> list) {
        return String.join(",", list);
    }


}

十、利用ScheduledExecutorService实现高并发场景下System.currentTimeMillis()的性能问题的优化

import java.sql.Timestamp;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;

/**
 * ClockUtils
 * <p>
 * 利用ScheduledExecutorService实现高并发场景下System.currentTimeMillis()的性能问题的优化.
 */
public class SystemClock {

    private static AtomicLong nowTime;
    private static volatile boolean started = false;

    /**
     * The get string current time
     *
     * @return string time
     */
    public static String currentTimeMillisStr() {
        return new Timestamp(currentTimeMillis()).toString();
    }

    /**
     * The get current time milliseconds
     *
     * @return long time
     */
    public static long currentTimeMillis() {
        if (!started) {
            synchronized (SystemClock.class) {
                if (!started) {
                    nowTime = new AtomicLong(System.currentTimeMillis());
                    ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(
                            1, r -> {
                        Thread thread = new Thread(r, "system-clock");
                        thread.setDaemon(true);
                        return thread;
                    });
                    executorService.scheduleAtFixedRate(() ->
                            nowTime.set(System.currentTimeMillis()), 1, 1, TimeUnit.MILLISECONDS);
                    Runtime.getRuntime().addShutdownHook(new Thread(executorService::shutdown));
                    started = true;
                }
            }
        }
        return nowTime.get();
    }
}

十一、获取系统内存与版本等工具类

import com.sun.management.OperatingSystemMXBean;
import lombok.Data;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;

import javax.management.MBeanServer;
import javax.management.ObjectName;
import java.io.File;
import java.io.Serializable;
import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.ManagementFactory;
import java.math.BigDecimal;
import java.net.NetworkInterface;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

/**
 * SystemUtils
 * <p>
 * 1.EnvironmentInfo
 * 2.MemoryInfo
 * 3.CpuLoadInfo
 * 4.DiskInfo
 * 5.GarbageCollectorInfo
 */
@Slf4j
public class SystemUtils {

    /**
     * The collect
     *
     * @return {@link MetricCollect}
     */
    public static MetricCollect collect() {
        MetricCollect metricCollect = new MetricCollect();
        metricCollect.setMemoryInfo(SystemUtils.getMemory());
        metricCollect.setCpuLoadInfo(SystemUtils.getCpuLoadInfo());
        metricCollect.setDiskInfo(SystemUtils.getDiskInfo());
        metricCollect.setGarbageCollectorInfos(SystemUtils.getGarbageCollectorInfo());
        return metricCollect;
    }

    @Data
    public static class MetricCollect implements Serializable {
        private static final long serialVersionUID = 3465584618686630943L;
        private SystemUtils.MemoryInfo memoryInfo;
        private SystemUtils.CpuLoadInfo cpuLoadInfo;
        private List<DiskInfo> diskInfo;
        private List<GarbageCollectorInfo> garbageCollectorInfos;
    }

    /**
     * The get environment info
     *
     * @return {@link EnvironmentInfo}
     */
    public static EnvironmentInfo getEnvironment() {
        EnvironmentInfo info = new EnvironmentInfo();
        info.setOsName(System.getProperty("os.name"));
        info.setOsVersion(System.getProperty("os.version"));
        info.setOsArch(System.getProperty("os.arch"));
        info.setJvmName(System.getProperty("java.vm.name"));
        info.setJvmVersion(System.getProperty("java.runtime.version"));
        info.setCpuCore(Runtime.getRuntime().availableProcessors());

        try {
            Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
            if (interfaces != null) {
                while (interfaces.hasMoreElements()) {
                    try {
                        NetworkInterface network = interfaces.nextElement();
                        if (network != null) {
                            info.setNetworkName(network.getName());
                            info.setNetworkDisplayName(network.getDisplayName());
                        }
                    } catch (Throwable e) {
                        log.warn("Failed to retrieving ip address, " + e.getMessage(), e);
                    }
                }
            }
        } catch (Throwable e) {
            log.warn("Failed to retrieving ip address, " + e.getMessage(), e);
        }

        return info;
    }


    /**
     * The get memory info
     *
     * @return {@link MemoryInfo}
     */
    public static MemoryInfo getMemory() {
        int mb = 1024 * 1024;
        Runtime runtime = Runtime.getRuntime();
        MemoryInfo memoryInfo = new MemoryInfo();

        // JVM
        double freeMemory = (double) runtime.freeMemory() / mb;
        double maxMemory = (double) runtime.maxMemory() / mb;
        double totalMemory = (double) runtime.totalMemory() / mb;
        double usedMemory = totalMemory - freeMemory;
        double percentUsed = (usedMemory / maxMemory) * 100.0;
        usedMemory = new BigDecimal(usedMemory).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        maxMemory = new BigDecimal(maxMemory).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        percentUsed = new BigDecimal(percentUsed).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        memoryInfo.setUsedMemory(usedMemory);
        memoryInfo.setMaxMemory(maxMemory);
        memoryInfo.setPercentUsed(percentUsed);

        // System
        OperatingSystemMXBean osBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
        double totalPhysicalMemory = (double) osBean.getTotalPhysicalMemorySize() / mb;
        double freePhysicalMemory = (double) osBean.getFreePhysicalMemorySize() / mb;
        double committedVirtualMemory = (double) osBean.getCommittedVirtualMemorySize() / mb;
        totalPhysicalMemory = new BigDecimal(totalPhysicalMemory).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        freePhysicalMemory = new BigDecimal(freePhysicalMemory).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        committedVirtualMemory = new BigDecimal(committedVirtualMemory).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        memoryInfo.setTotalPhysicalMemory(totalPhysicalMemory);
        memoryInfo.setFreePhysicalMemory(freePhysicalMemory);
        memoryInfo.setCommittedVirtualMemory(committedVirtualMemory);

        return memoryInfo;
    }

    /**
     * The get cpu load info
     *
     * @return {@link CpuLoadInfo}
     */
    public static CpuLoadInfo getCpuLoadInfo() {
        try {
            MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer();
            ObjectName objectName = ObjectName.getInstance("java.lang:type=OperatingSystem");

            // read process cpu load
            Double processCpuLoad = getAttributeValue(beanServer, objectName, "ProcessCpuLoad");
            // read system cpu load
            Double systemCpuLoad = getAttributeValue(beanServer, objectName, "SystemCpuLoad");
            if (processCpuLoad != null || systemCpuLoad != null) {
                CpuLoadInfo cpuLoadInfo = new CpuLoadInfo();
                cpuLoadInfo.setProcessCpuLoad(processCpuLoad);
                cpuLoadInfo.setSystemCpuLoad(systemCpuLoad);
                return cpuLoadInfo;
            }
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }

        return null;
    }

    /**
     * The get disk info
     *
     * @return {@link DiskInfo}
     */
    public static List<DiskInfo> getDiskInfo() {
        double mb = 1024 * 1024;

        List<DiskInfo> diskInfoList = new ArrayList<>();
        File[] disks = File.listRoots();
        for (File file : disks) {
            DiskInfo diskInfo = new DiskInfo();
            diskInfo.setPath(file.getPath());
            // 空闲空间
            diskInfo.setFreeSpace(new BigDecimal(
                    file.getFreeSpace() / mb).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
            // 可用空间
            diskInfo.setUsableSpace(new BigDecimal(
                    file.getUsableSpace() / mb).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
            // 总空间
            diskInfo.setTotalSpace(new BigDecimal(
                    file.getTotalSpace() / mb).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
            diskInfoList.add(diskInfo);
        }

        return diskInfoList;
    }

    /**
     * The get garbage collector info
     *
     * @return {@link GarbageCollectorInfo}
     */
    public static List<GarbageCollectorInfo> getGarbageCollectorInfo() {
        List<GarbageCollectorInfo> garbageCollectorInfoList = new ArrayList<>();
        List<GarbageCollectorMXBean> gcBeans = ManagementFactory.getGarbageCollectorMXBeans();
        for (GarbageCollectorMXBean gcBean : gcBeans) {
            GarbageCollectorInfo garbageCollectorInfo = new GarbageCollectorInfo();
            garbageCollectorInfo.setName(gcBean.getName());
            garbageCollectorInfo.setCollectionTime(gcBean.getCollectionTime());
            garbageCollectorInfo.setCollectionCount(gcBean.getCollectionCount());
            garbageCollectorInfoList.add(garbageCollectorInfo);
        }

        return garbageCollectorInfoList;
    }

    private static Double getAttributeValue(MBeanServer beanServer, ObjectName objectName, String attribute) throws Exception {
        Object cpuLoadObject = beanServer.getAttribute(objectName, attribute);
        if (cpuLoadObject == null) {
            return null;
        }

        double cpuLoadValue = (double) cpuLoadObject;
        if (cpuLoadValue < 0) {
            // usually takes a couple of seconds before we get real values
            return 0.00;
        }

        // returns a percentage value with 1 decimal point precision
        return new BigDecimal(cpuLoadValue * 100).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * EnvironmentInfo
     */
    @Data
    @ToString
    public static class EnvironmentInfo implements Serializable {

        private static final long serialVersionUID = -9055644935967288508L;

        private String osName;
        private String osVersion;
        private String osArch;
        private String jvmName;
        private String jvmVersion;
        private Integer cpuCore;
        private String networkName;
        private String networkDisplayName;
    }

    /**
     * MemoryInfo
     */
    @Data
    @ToString
    public static class MemoryInfo implements Serializable {

        private static final long serialVersionUID = -6078242692181489693L;

        // === JVM
        /**
         * Used memory(MB)
         */
        private double usedMemory;
        /**
         * Max memory(MB)
         */
        private double maxMemory;
        /**
         * Percent used(%)
         */
        private double percentUsed;

        // === System

        private double totalPhysicalMemory;
        private double freePhysicalMemory;
        private double committedVirtualMemory;

    }

    /**
     * CpuLoadInfo
     */
    @Data
    @ToString
    public static class CpuLoadInfo implements Serializable {

        private static final long serialVersionUID = -7983527685877649306L;

        /**
         * Process CPU load
         */
        private Double processCpuLoad;
        /**
         * System CPU load
         */
        private Double systemCpuLoad;

    }

    /**
     * DiskInfo
     */
    @Data
    @ToString
    public static class DiskInfo implements Serializable {

        private static final long serialVersionUID = 1486150261930978720L;

        private String path;
        private Double freeSpace;
        private Double usableSpace;
        private Double totalSpace;
    }

    /**
     * GarbageCollectorInfo
     */
    @Data
    @ToString
    public static class GarbageCollectorInfo implements Serializable {

        private static final long serialVersionUID = -6536126923166050353L;

        private String name;
        private Long collectionTime;
        private Long collectionCount;
    }

}

十二、三元结构体

/**
 * 三元结构体
 *
 * @param <F>
 * @param <S>
 * @param <T>
 */
public class Triple<F, S, T> {

	private F first;
	
	private S second;
	
	private T third;
	
	public Triple(F first, S second, T third) {
		this.first = first;
		this.second = second;
		this.third = third;
	}

	public F getFirst() {
		return first;
	}

	public void setFirst(F first) {
		this.first = first;
	}

	public S getSecond() {
		return second;
	}

	public void setSecond(S second) {
		this.second = second;
	}

	public T getThird() {
		return third;
	}

	public void setThird(T third) {
		this.third = third;
	}

	@Override
	public String toString() {
		return "Triple{" +
				"first=" + first +
				", second=" + second +
				", third=" + third +
				'}';
	}
}

十三、二元体结构

/**
 * 二元体结构
 */
public class Pair<F, S> {

    private final  F first;

    private final S second;

    public Pair(F first, S second) {
        this.first = first;
        this.second = second;
    }

    public F getFirst() {
        return first;
    }

    public S getSecond() {
        return second;
    }

    @Override
    public String toString() {
        return "Pair{" +
                "first=" + first +
                ", second=" + second +
                '}';
    }
}

十四、使用PriorityQueue作为任务工作队列 实现Timer工具

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Date;
import java.util.PriorityQueue;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * jdk Timer工具的另一个实现
 * 区别:
 * 内部直接使用PriorityQueue作为任务工作队列
 * 运行过程中,若有一个task发生异常,整个Timer定时器不会关闭(jdk自带的timer会关闭)
 * 任务单元直接使用Runnable接口
 */
public class Timer {

    final static Logger logger = LoggerFactory.getLogger(Timer.class);

    private PriorityQueue<TimerTask> queue;

    private final TimerThread thread;

    private static final AtomicInteger nextSerialNumber = new AtomicInteger(0);

    private static int serialNumber() {
        return nextSerialNumber.getAndIncrement();
    }

    public Timer() {
        this("Timer-" + serialNumber());
    }

    public Timer(boolean daemon) {
        this("Timer-" + serialNumber(), daemon);
    }

    public Timer(String threadName) {
        this.queue = new PriorityQueue<>();
        this.thread = new TimerThread(this.queue);
        this.thread.setName(threadName);
        this.thread.start();
    }

    public Timer(String threadName, boolean daemon) {
        this.queue = new PriorityQueue();
        this.thread = new TimerThread(this.queue);
        this.thread.setName(threadName);
        this.thread.setDaemon(daemon);
        this.thread.start();
    }

    public void schedule(Runnable task, long delay) {
        if (delay < 0L) {
            throw new IllegalArgumentException("Negative delay.");
        } else {
            this.schedule(task, System.currentTimeMillis() + delay, 0L);
        }
    }

    public void schedule(Runnable task, Date start) {
        this.schedule(task, start.getTime(), 0L);
    }

    public void scheduleAtFixedRate(Runnable task, long delay, long period) {
        if (delay < 0L) {
            throw new IllegalArgumentException("Negative delay.");
        } else if (period <= 0L) {
            throw new IllegalArgumentException("Non-positive period.");
        } else {
            this.schedule(task, System.currentTimeMillis() + delay, period);
        }
    }

    public void scheduleAtFixedRate(Runnable task, Date start, long period) {
        if (period <= 0L) {
            throw new IllegalArgumentException("Non-positive period.");
        } else {
            this.schedule(task, start.getTime(), period);
        }
    }

    private void schedule(Runnable task, long time, long period) {
        if (time < 0L) {
            throw new IllegalArgumentException("Illegal execution time.");
        } else {
            if (Math.abs(period) > 4611686018427387903L) {
                period >>= 1;
            }

            TimerTask timerTask = new TimerTask(task);
            synchronized(this.queue) {
                if (!this.thread.run) {
                    throw new IllegalStateException("Timer already cancelled.");
                } else {
                    synchronized(timerTask.lock) {
                        if (timerTask.state != 0) {
                            throw new IllegalStateException("Task already scheduled or cancelled");
                        }

                        timerTask.nextExecutionTime = time;
                        timerTask.period = period;
                        timerTask.state = TimerTask.SCHEDULED;
                    }

                    this.queue.add(timerTask);
                    if (this.queue.peek() == timerTask) {
                        this.queue.notify();
                    }
                }
            }
        }
    }

    public void cancel() {
        PriorityQueue<TimerTask> vars = this.queue;
        synchronized(this.queue) {
            this.thread.run = false;
            this.queue.clear();
            this.queue.notify();
        }
    }

}

class TimerThread extends Thread {

    boolean run = true;
    private PriorityQueue<TimerTask> queue;

    public TimerThread(PriorityQueue<TimerTask> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        try {
            mainLoop();
        } finally {
            // Someone killed this Thread, behave as if Timer cancelled
            synchronized(queue) {
                run = false;
                // Eliminate obsolete references
                queue.clear();
            }
        }
    }

    /**
     * The main timer loop.  (See class comment.)
     */
    private void mainLoop() {
        while (true) {
            try {
                TimerTask task;
                boolean taskFired;
                synchronized(queue) {
                    // Wait for queue to become non-empty
                    while (queue.isEmpty() && run) {
                        queue.wait();
                    }
                    if (queue.isEmpty()) {
                        break; // Queue is empty and will forever remain; die
                    }
                    // Queue nonempty; look at first evt and do the right thing
                    long currentTime, executionTime;
                    task = queue.peek();
                    synchronized(task.lock) {
                        if (task.state == TimerTask.CANCELLED) {
                            queue.poll();
                            continue;  // No action required, poll queue again
                        }
                        currentTime = System.currentTimeMillis();
                        executionTime = task.nextExecutionTime;
                        if (taskFired = (executionTime<=currentTime)) {
                            task = queue.poll();
                            // Non-repeating, remove
                            if (task.period == 0) {
                                task.state = TimerTask.EXECUTED;
                            } else { // Repeating task, reschedule
                                long nextExecTime = task.period < 0 ?
                                        currentTime - task.period
                                        : executionTime + task.period;
                                task.nextExecutionTime = nextExecTime;
                                queue.add(task);
                            }
                        }
                    }
                    // Task hasn't yet fired; wait
                    if (!taskFired) {
                        queue.wait(executionTime - currentTime);
                    }
                }
                // Task fired; run it, holding no locks
                if (taskFired) {
                    try {
                        task.run();
                    }catch (Exception e) {
                        Timer.logger.error("timer任务执行异常", e);
                    }
                }
            } catch(InterruptedException e) {
                // ignore it
            }
        }
    }

}

class TimerTask implements Runnable, Comparable<TimerTask> {

    private Runnable task;

    final Object lock = new Object();

    int state = VIRGIN;

    static final int VIRGIN = 0;

    static final int SCHEDULED   = 1;

    static final int EXECUTED    = 2;

    static final int CANCELLED   = 3;

    long nextExecutionTime;

    long period = 0;

    TimerTask(Runnable task) {
        this.task = task;
    }

    @Override
    public int compareTo(TimerTask timerTask) {
       if (timerTask.nextExecutionTime > this.nextExecutionTime) {
           return -1;
       }
        if (timerTask.nextExecutionTime < this.nextExecutionTime) {
            return 1;
        }
        return 0;
    }

    @Override
    public void run() {
        task.run();
    }
}

十五、线程设置名称

import com.google.common.util.concurrent.ThreadFactoryBuilder;
import lombok.extern.slf4j.Slf4j;
import org.apache.beam.repackaged.beam_sdks_java_core.org.apache.commons.lang3.concurrent.BasicThreadFactory;
import org.springframework.scheduling.concurrent.CustomizableThreadFactory;

import java.util.concurrent.*;

/**
 * 给线程取名称
 * @author nick
 */
@Slf4j
public class ThreadTools {


    /**
     * Spring 框架提供的 CustomizableThreadFactory
     * 本质 :
     * final Thread thread = new Thread();
     * thread.setName(name);
     */
    private void test1(){
        ThreadFactory springThreadFactory = new CustomizableThreadFactory("springThread-pool-");
        ExecutorService exec = new ThreadPoolExecutor(1, 1,
                0L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<>(10),springThreadFactory);
        exec.submit(() -> log.info("-----"));
    }

    /**
     * Google guava 工具类 提供的 ThreadFactoryBuilder ,使用链式方法创建。
     * 本质 :
     * final Thread thread = new Thread();
     * thread.setName(name);
     */
    private void test2(){
        ThreadFactory guavaThreadFactory = new ThreadFactoryBuilder().setNameFormat("retryClient-pool-").build();
        ExecutorService exec = new ThreadPoolExecutor(1, 1,
                0L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<>(10),guavaThreadFactory);
        exec.submit(() -> log.info("-----"));
    }


    /**
     * Apache commons-lang3 提供的 BasicThreadFactory
     * 本质 :
     * final Thread thread = new Thread();
     * thread.setName(name);
      */
    private void test3(){
        ThreadFactory basicThreadFactory = new BasicThreadFactory.Builder()
                .namingPattern("basicThreadFactory-").build();
        ExecutorService exec = new ThreadPoolExecutor(1, 1,
                0L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<>(10),basicThreadFactory);
        exec.submit(() -> log.info("-----"));
    }
}

十六、Gzip

import ch.qos.logback.classic.pattern.TargetLengthBasedClassNameAbbreviator;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.StringTokenizer;
import java.util.concurrent.*;
import java.util.zip.GZIPOutputStream;

public class gzipOutputStreamUtils {

    public static ObjectMapper mapper = new ObjectMapper();

    static {
        // 转换为格式化的json
        mapper.enable(SerializationFeature.INDENT_OUTPUT);
        // 如果json中有新增的字段并且是实体类类中不存在的,不报错
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    }

    /**
     * 压缩请求日志
     * @param logger
     * @return
     */
    private byte[] buildRequestBody1(List<String> logger) {
        try {

            try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                 GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream)) {
                 gzipOutputStream.write(JSON.toJSONBytes(logger));
                 gzipOutputStream.finish();
                 gzipOutputStream.close();
                return byteArrayOutputStream.toByteArray();
            }
        }
        catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 压缩请求日志
     * @param logger
     * @return
     */
    private byte[] buildRequestBody2(List<String> logger) {
        try {
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            try (GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream)) {
                gzipOutputStream.write(mapper.writeValueAsBytes(logger));
            }
            return byteArrayOutputStream.toByteArray();
        }
        catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 缩短包名
     * @param NameType
     * @param size
     * @return
     */
    private String getNameCurtali(String NameType, int size){
        TargetLengthBasedClassNameAbbreviator className = new TargetLengthBasedClassNameAbbreviator(size);
        return className.abbreviate(NameType);
    }



    private static final ExecutorService executorService = Executors.newSingleThreadExecutor();

    public FutureTask<String> getFutureTask() {
        return new FutureTask<>(() -> {
            System.out.println("hello");
            return "ok";
        });
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        gzipOutputStreamUtils futureTaskDemo = new gzipOutputStreamUtils();
        FutureTask<String> futureTask = futureTaskDemo.getFutureTask();
        executorService.execute(futureTask);

        Thread.sleep(100);
        if (futureTask.isDone()) {
            System.out.println(futureTask.get());
        }
        executorService.shutdown();
    }


    /**
     * ExtClassLoader类中获取路径的代码
     * @return
     */
    private static File[] getExtDirs() {
        //加载<JAVA_HOME>/lib/ext目录中的类库
        String string = System.getProperty("java.ext.dirs");
        File[] dirs;
        if (string != null) {
            StringTokenizer st = new StringTokenizer(string, File.pathSeparator);
            int count = st.countTokens();
            dirs = new File[count];
            for (int i = 0; i < count; i++) {
                dirs[i] = new File(st.nextToken());
            }
        } else {
            dirs = new File[0];
        }
        return dirs;
    }
    
}
卷 文档 的文件夹 PATH 列表 卷序列号为 000C-BB91 E:. │ config.properties │ Dao.java │ GeneratorDemo.java │ hibernate.cfg.xml │ HibernateDaoImpl.java │ HibernateSessionFactory.java │ HibernateUtil.java │ JsonUtil.java │ list.txt │ log4j.properties │ messageResource_zh_CN.properties │ spring.xml │ struts.xml │ ├─28个java常用工具类 │ │ Base64.java │ │ Base64DecodingException.java │ │ CConst.java │ │ CharTools.java │ │ ConfigHelper.java │ │ Counter.java │ │ CTool.java │ │ DateHandler.java │ │ DateUtil.java │ │ DealString.java │ │ DebugOut.java │ │ Dom4jHelper.java │ │ Escape.java │ │ ExecHelper.java │ │ FileHelper.java │ │ FileUploadUtil.java │ │ FileUtil.java │ │ ftp二进制与ascii传输方式区别.txt │ │ IPDeal.java │ │ Md5.java │ │ MD5Encrypt.java │ │ MyFileFilter.java │ │ PropsUtil.java │ │ RegExUtil.java │ │ SimpleConfig.java │ │ StringHelper.java │ │ ThumbnailGenerator.java │ │ TradePortalUtil.java │ │ UploadHelper.java │ │ │ └─LogUtil │ │ .classpath │ │ .project │ │ logutil-1.0.6.jar │ │ MANIFEST.MF │ │ │ ├─.settings │ │ org.eclipse.jdt.core.prefs │ │ │ └─src │ │ logging.properties │ │ │ └─com │ └─mine │ │ BigMap.java │ │ LogPack.java │ │ │ └─logging │ ConsoleHandler.java │ ErrorManager.java │ FileHandler.java │ Filter.java │ Formatter.java │ Handler.java │ Level.java │ Logging.java │ LoggingMXBean.java │ LoggingPermission.java │ LogManager.java │ LogRecord.java │ LogUtil.java │ LogUtil2.java │ MemoryHandler.java │ PropertiesFactory.java │ PropertiesMachining.java │ RemoteHandler.java │ Simple0Formatter.java │ Simple1Formatter.java │ Simple2Formatter.java │ Simple3Formatter.java │ SimpleFormatter.java │ SocketHandler.java │ StreamHandler.java │ Test.java │ XMLFormatter.java │ ├─Android快速开发不可或缺的11个辅助类 │ AppUtils.java │ DensityUtils.java │ HttpUtils.java │ KeyBoardUtils.java │ L.java │ NetUtils.java │ ScreenUtils.java │ SDCardUtils.java │ SPUtils.java │ T.java │ ToolFor9Ge.java │ ├─css │ bootstrap.css │ bootstrap.min.css │ component.css │ cylater.css │ global.css │ login.css │ reset.css │ ├─js │ │ avalon.js │ │ components.js │ │ cylater.min.js │ │ global.js │ │ jquery-1.7.1.min.js │ │ jquery-1.8.2.min.js │ │ jquery.cookie.js │ │ jquery.metadata.js │ │ jquery.min.js │ │ jquery.nicescroll.min.js │ │ jquery.validate.js │ │ jquery.validate.message_cn.js │ │ login.js │ │ md5.js │ │ mgTextWidth.js │ │ tinybox.js │ │ │ ├─bootstrap │ │ │ │ │ ├─css │ │ │ bootstrap-responsive.css │ │ │ bootstrap-responsive.min.css │ │ │ bootstrap.css │ │ │ bootstrap.min.css │ │ │ │ │ ├─img │ │ │ glyphicons-halflings-white.png │ │ │ glyphicons-halflings.png │ │ │ │ │ └─js │ │ bootstrap.js │ │ bootstrap.min.js │ │ │ ├─doubanAPI_Demo │ │ dbapi_beta1_20120316.js │ │ doubanapi.html │ │ jquery-1.4.2.js │ │ │ └─jQuery │ jquery-1.11.3.min.js │ jquery-1.7.2.js │ jquery-1.7.2.min.js │ ├─MyBatis-zh │ │ clirr-report.html │ │ configuration.html │ │ cpd.html │ │ cpd.xml │ │ dependencies.html │ │ dependency-info.html │ │ distribution-management.html │ │ dynamic-sql.html │ │ findbugs.html │ │ getting-started.html │ │ index.html │ │ integration.html │ │ issue-tracking.html │ │ java-api.html │ │ jdepend-report.html │ │ license.html │ │ logging.html │ │ mail-lists.html │ │ Mybatis.htm │ │ plugin-management.html │ │ plugins.html │ │ pmd.html │ │ pmd.xml │ │ project-info.html │ │ project-reports.html │ │ project-summary.html │ │ source-repository.html │ │ sqlmap-xml.html │ │ statement-builders.html │ │ surefire-report.html │ │ taglist.html │ │ team-list.html │ │ │ ├─apidocs │ │ index.html │ │ │ ├─cobertura │ │ │ coverage.xml │ │ │ frame-packages.html │ │ │ frame-sourcefiles-org.apache.ibatis.annotations.html │ │ │ frame-sourcefiles-org.apache.ibatis.binding.html │ │ │ frame-sourcefiles-org.apache.ibatis.builder.annotation.html │ │ │ frame-sourcefiles-org.apache.ibatis.builder.html │ │ │ frame-sourcefiles-org.apache.ibatis.builder.xml.html │ │ │ frame-sourcefiles-org.apache.ibatis.cache.decorators.html │ │ │ frame-sourcefiles-org.apache.ibatis.cache.html │ │ │ frame-sourcefiles-org.apache.ibatis.cache.impl.html │ │ │ frame-sourcefiles-org.apache.ibatis.datasource.html │ │ │ frame-sourcefiles-org.apache.ibatis.datasource.jndi.html │ │ │ frame-sourcefiles-org.apache.ibatis.datasource.pooled.html │ │ │ frame-sourcefiles-org.apache.ibatis.datasource.unpooled.html │ │ │ frame-sourcefiles-org.apache.ibatis.exceptions.html │ │ │ frame-sourcefiles-org.apache.ibatis.executor.html │ │ │ frame-sourcefiles-org.apache.ibatis.executor.keygen.html │ │ │ frame-sourcefiles-org.apache.ibatis.executor.loader.cglib.html │ │ │ frame-sourcefiles-org.apache.ibatis.executor.loader.html │ │ │ frame-sourcefiles- org.apache.ibatis.executor.loader.javassist.html │ │ │ frame-sourcefiles-org.apache.ibatis.executor.parameter.html │ │ │ frame-sourcefiles-org.apache.ibatis.executor.result.html │ │ │ frame-sourcefiles-org.apache.ibatis.executor.resultset.html │ │ │ frame-sourcefiles-org.apache.ibatis.executor.statement.html │ │ │ frame-sourcefiles-org.apache.ibatis.io.html │ │ │ frame-sourcefiles-org.apache.ibatis.jdbc.html │ │ │ frame-sourcefiles-org.apache.ibatis.logging.commons.html │ │ │ frame-sourcefiles-org.apache.ibatis.logging.html │ │ │ frame-sourcefiles-org.apache.ibatis.logging.jdbc.html │ │ │ frame-sourcefiles-org.apache.ibatis.logging.jdk14.html │ │ │ frame-sourcefiles-org.apache.ibatis.logging.log4j.html │ │ │ frame-sourcefiles-org.apache.ibatis.logging.log4j2.html │ │ │ frame-sourcefiles-org.apache.ibatis.logging.nologging.html │ │ │ frame-sourcefiles-org.apache.ibatis.logging.slf4j.html │ │ │ frame-sourcefiles-org.apache.ibatis.logging.stdout.html │ │ │ frame-sourcefiles-org.apache.ibatis.mapping.html │ │ │ frame-sourcefiles-org.apache.ibatis.metadata.html │ │ │ frame-sourcefiles-org.apache.ibatis.parsing.html │ │ │ frame-sourcefiles-org.apache.ibatis.plugin.html │ │ │ frame-sourcefiles-org.apache.ibatis.reflection.factory.html │ │ │ frame-sourcefiles-org.apache.ibatis.reflection.html │ │ │ frame-sourcefiles-org.apache.ibatis.reflection.invoker.html │ │ │ frame-sourcefiles-org.apache.ibatis.reflection.property.html │ │ │ frame-sourcefiles-org.apache.ibatis.reflection.wrapper.html │ │ │ frame-sourcefiles-org.apache.ibatis.scripting.defaults.html │ │ │ frame-sourcefiles-org.apache.ibatis.scripting.html │ │ │ frame-sourcefiles-org.apache.ibatis.scripting.xmltags.html │ │ │ frame-sourcefiles-org.apache.ibatis.session.defaults.html │ │ │ frame-sourcefiles-org.apache.ibatis.session.html │ │ │ frame-sourcefiles-org.apache.ibatis.transaction.html │ │ │ frame-sourcefiles-org.apache.ibatis.transaction.jdbc.html │ │ │ frame-sourcefiles-org.apache.ibatis.transaction.managed.html │ │ │ frame-sourcefiles-org.apache.ibatis.type.html │ │ │ frame-sourcefiles.html │ │ │ frame-summary-org.apache.ibatis.annotations.html │ │ │ frame-summary-org.apache.ibatis.binding.html │ │ │ frame-summary-org.apache.ibatis.builder.annotation.html │ │ │ frame-summary-org.apache.ibatis.builder.html │ │ │ frame-summary-org.apache.ibatis.builder.xml.html │ │ │ frame-summary-org.apache.ibatis.cache.decorators.html │ │ │ frame-summary-org.apache.ibatis.cache.html │ │ │ frame-summary-org.apache.ibatis.cache.impl.html │ │ │ frame-summary-org.apache.ibatis.datasource.html │ │ │ frame-summary-org.apache.ibatis.datasource.jndi.html │ │ │ frame-summary-org.apache.ibatis.datasource.pooled.html │ │ │ frame-summary-org.apache.ibatis.datasource.unpooled.html │ │ │ frame-summary-org.apache.ibatis.exceptions.html │ │ │ frame-summary-org.apache.ibatis.executor.html │ │ │ frame-summary-org.apache.ibatis.executor.keygen.html │ │ │ frame-summary-org.apache.ibatis.executor.loader.cglib.html │ │ │ frame-summary-org.apache.ibatis.executor.loader.html │ │ │ frame-summary-org.apache.ibatis.executor.loader.javassist.html │ │ │ frame-summary-org.apache.ibatis.executor.parameter.html │ │ │ frame-summary-org.apache.ibatis.executor.result.html │ │ │ frame-summary-org.apache.ibatis.executor.resultset.html │ │ │ frame-summary-org.apache.ibatis.executor.statement.html │ │ │ frame-summary-org.apache.ibatis.io.html │ │ │ frame-summary-org.apache.ibatis.jdbc.html │ │ │ frame-summary-org.apache.ibatis.logging.commons.html │ │ │ frame-summary-org.apache.ibatis.logging.html │ │ │ frame-summary-org.apache.ibatis.logging.jdbc.html │ │ │ frame-summary-org.apache.ibatis.logging.jdk14.html │ │ │ frame-summary-org.apache.ibatis.logging.log4j.html │ │ │ frame-summary-org.apache.ibatis.logging.log4j2.html │ │ │ frame-summary-org.apache.ibatis.logging.nologging.html │ │ │ frame-summary-org.apache.ibatis.logging.slf4j.html │ │ │ frame-summary-org.apache.ibatis.logging.stdout.html │ │ │ frame-summary-org.apache.ibatis.mapping.html │ │ │ frame-summary-org.apache.ibatis.metadata.html │ │ │ frame-summary-org.apache.ibatis.parsing.html │ │ │ frame-summary-org.apache.ibatis.plugin.html │ │ │ frame-summary-org.apache.ibatis.reflection.factory.html │ │ │ frame-summary-org.apache.ibatis.reflection.html │ │ │ frame-summary-org.apache.ibatis.reflection.invoker.html │ │ │ frame-summary-org.apache.ibatis.reflection.property.html │ │ │ frame-summary-org.apache.ibatis.reflection.wrapper.html │ │ │ frame-summary-org.apache.ibatis.scripting.defaults.html │ │ │ frame-summary-org.apache.ibatis.scripting.html │ │ │ frame-summary-org.apache.ibatis.scripting.xmltags.html │ │ │ frame-summary-org.apache.ibatis.session.defaults.html │ │ │ frame-summary-org.apache.ibatis.session.html │ │ │ frame-summary-org.apache.ibatis.transaction.html │ │ │ frame-summary-org.apache.ibatis.transaction.jdbc.html │ │ │ frame-summary-org.apache.ibatis.transaction.managed.html │ │ │ frame-summary-org.apache.ibatis.type.html │ │ │ frame-summary.html │ │ │ help.html │ │ │ index.html │ │ │ org.apache.ibatis.annotations.Arg.html │ │ │ org.apache.ibatis.annotations.CacheNamespace.html │ │ │ org.apache.ibatis.annotations.CacheNamespaceRef.html │ │ │ org.apache.ibatis.annotations.Case.html │ │ │ org.apache.ibatis.annotations.ConstructorArgs.html │ │ │ org.apache.ibatis.annotations.Delete.html │ │ │ org.apache.ibatis.annotations.DeleteProvider.html │ │ │ org.apache.ibatis.annotations.Insert.html │ │ │ org.apache.ibatis.annotations.InsertProvider.html │ │ │ org.apache.ibatis.annotations.Lang.html │ │ │ org.apache.ibatis.annotations.Many.html │ │ │ org.apache.ibatis.annotations.MapKey.html │ │ │ org.apache.ibatis.annotations.One.html │ │ │ org.apache.ibatis.annotations.Options.html │ │ │ org.apache.ibatis.annotations.Param.html │ │ │ org.apache.ibatis.annotations.Result.html │ │ │ org.apache.ibatis.annotations.ResultMap.html │ │ │ org.apache.ibatis.annotations.Results.html │ │ │ org.apache.ibatis.annotations.ResultType.html │ │ │ org.apache.ibatis.annotations.Select.html │ │ │ org.apache.ibatis.annotations.SelectKey.html │ │ │ org.apache.ibatis.annotations.SelectProvider.html │ │ │ org.apache.ibatis.annotations.TypeDiscriminator.html │ │ │ org.apache.ibatis.annotations.Update.html │ │ │ org.apache.ibatis.annotations.UpdateProvider.html │ │ │ org.apache.ibatis.binding.BindingException.html │ │ │ org.apache.ibatis.binding.MapperMethod.html │ │ │ org.apache.ibatis.binding.MapperProxy.html │ │ │ org.apache.ibatis.binding.MapperProxyFactory.html │ │ │ org.apache.ibatis.binding.MapperRegistry.html │ │ │ org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.html │ │ │ org.apache.ibatis.builder.annotation.MethodResolver.html │ │ │ org.apache.ibatis.builder.annotation.ProviderSqlSource.html │ │ │ org.apache.ibatis.builder.BaseBuilder.html │ │ │ org.apache.ibatis.builder.BuilderException.html │ │ │ org.apache.ibatis.builder.CacheRefResolver.html │ │ │ org.apache.ibatis.builder.IncompleteElementException.html │ │ │ org.apache.ibatis.builder.MapperBuilderAssistant.html │ │ │ org.apache.ibatis.builder.ParameterExpression.html │ │ │ org.apache.ibatis.builder.ResultMapResolver.html │ │ │ org.apache.ibatis.builder.SqlSourceBuilder.html │ │ │ org.apache.ibatis.builder.StaticSqlSource.html │ │ │ org.apache.ibatis.builder.xml.XMLConfigBuilder.html │ │ │ org.apache.ibatis.builder.xml.XMLIncludeTransformer.html │ │ │ org.apache.ibatis.builder.xml.XMLMapperBuilder.html │ │ │ org.apache.ibatis.builder.xml.XMLMapperEntityResolver.html │ │ │ org.apache.ibatis.builder.xml.XMLStatementBuilder.html │ │ │ org.apache.ibatis.cache.Cache.html │ │ │ org.apache.ibatis.cache.CacheException.html │ │ │ org.apache.ibatis.cache.CacheKey.html │ │ │ org.apache.ibatis.cache.decorators.FifoCache.html │ │ │ org.apache.ibatis.cache.decorators.LoggingCache.html │ │ │ org.apache.ibatis.cache.decorators.LruCache.html │ │ │ org.apache.ibatis.cache.decorators.ScheduledCache.html │ │ │ org.apache.ibatis.cache.decorators.SerializedCache.html │ │ │ org.apache.ibatis.cache.decorators.SoftCache.html │ │ │ org.apache.ibatis.cache.decorators.SynchronizedCache.html │ │ │ org.apache.ibatis.cache.decorators.TransactionalCache.html │ │ │ org.apache.ibatis.cache.decorators.WeakCache.html │ │ │ org.apache.ibatis.cache.impl.PerpetualCache.html │ │ │ org.apache.ibatis.cache.NullCacheKey.html │ │ │ org.apache.ibatis.cache.TransactionalCacheManager.html │ │ │ org.apache.ibatis.datasource.DataSourceException.html │ │ │ org.apache.ibatis.datasource.DataSourceFactory.html │ │ │ org.apache.ibatis.datasource.jndi.JndiDataSourceFactory.html │ │ │ org.apache.ibatis.datasource.pooled.PooledConnection.html │ │ │ org.apache.ibatis.datasource.pooled.PooledDataSource.html │ │ │ org.apache.ibatis.datasource.pooled.PooledDataSourceFactory.html │ │ │ org.apache.ibatis.datasource.pooled.PoolState.html │ │ │ org.apache.ibatis.datasource.unpooled.UnpooledDataSource.html │ │ │ org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory.html │ │ │ org.apache.ibatis.exceptions.ExceptionFactory.html │ │ │ org.apache.ibatis.exceptions.IbatisException.html │ │ │ org.apache.ibatis.exceptions.PersistenceException.html │ │ │ org.apache.ibatis.exceptions.TooManyResultsException.html │ │ │ org.apache.ibatis.executor.BaseExecutor.html │ │ │ org.apache.ibatis.executor.BatchExecutor.html │ │ │ org.apache.ibatis.executor.BatchExecutorException.html │ │ │ org.apache.ibatis.executor.BatchResult.html │ │ │ org.apache.ibatis.executor.CachingExecutor.html │ │ │ org.apache.ibatis.executor.ErrorContext.html │ │ │ org.apache.ibatis.executor.ExecutionPlaceholder.html │ │ │ org.apache.ibatis.executor.Executor.html │ │ │ org.apache.ibatis.executor.ExecutorException.html │ │ │ org.apache.ibatis.executor.keygen.Jdbc3KeyGenerator.html │ │ │ org.apache.ibatis.executor.keygen.KeyGenerator.html │ │ │ org.apache.ibatis.executor.keygen.NoKeyGenerator.html │ │ │ org.apache.ibatis.executor.keygen.SelectKeyGenerator.html │ │ │ org.apache.ibatis.executor.loader.AbstractEnhancedDeserializationProxy.html │ │ │ org.apache.ibatis.executor.loader.AbstractSerialStateHolder.html │ │ │ org.apache.ibatis.executor.loader.cglib.CglibProxyFactory.html │ │ │ org.apache.ibatis.executor.loader.cglib.CglibSerialStateHolder.html │ │ │ org.apache.ibatis.executor.loader.CglibProxyFactory.html │ │ │ org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory.html │ │ │ org.apache.ibatis.executor.loader.javassist.JavassistSerialStateHolder.html │ │ │ org.apache.ibatis.executor.loader.JavassistProxyFactory.html │ │ │ org.apache.ibatis.executor.loader.ProxyFactory.html │ │ │ org.apache.ibatis.executor.loader.ResultLoader.html │ │ │ org.apache.ibatis.executor.loader.ResultLoaderMap.html │ │ │ org.apache.ibatis.executor.loader.WriteReplaceInterface.html │ │ │ org.apache.ibatis.executor.parameter.ParameterHandler.html │ │ │ org.apache.ibatis.executor.result.DefaultMapResultHandler.html │ │ │ org.apache.ibatis.executor.result.DefaultResultContext.html │ │ │ org.apache.ibatis.executor.result.DefaultResultHandler.html │ │ │ org.apache.ibatis.executor.ResultExtractor.html │ │ │ org.apache.ibatis.executor.resultset.DefaultResultSetHandler.html │ │ │ org.apache.ibatis.executor.resultset.ResultSetHandler.html │ │ │ org.apache.ibatis.executor.resultset.ResultSetWrapper.html │ │ │ org.apache.ibatis.executor.ReuseExecutor.html │ │ │ org.apache.ibatis.executor.SimpleExecutor.html │ │ │ org.apache.ibatis.executor.statement.BaseStatementHandler.html │ │ │ org.apache.ibatis.executor.statement.CallableStatementHandler.html │ │ │ org.apache.ibatis.executor.statement.PreparedStatementHandler.html │ │ │ org.apache.ibatis.executor.statement.RoutingStatementHandler.html │ │ │ org.apache.ibatis.executor.statement.SimpleStatementHandler.html │ │ │ org.apache.ibatis.executor.statement.StatementHandler.html │ │ │ org.apache.ibatis.io.ClassLoaderWrapper.html │ │ │ org.apache.ibatis.io.DefaultVFS.html │ │ │ org.apache.ibatis.io.ExternalResources.html │ │ │ org.apache.ibatis.io.JBoss6VFS.html │ │ │ org.apache.ibatis.io.ResolverUtil.html │ │ │ org.apache.ibatis.io.Resources.html │ │ │ org.apache.ibatis.io.VFS.html │ │ │ org.apache.ibatis.jdbc.AbstractSQL.html │ │ │ org.apache.ibatis.jdbc.Null.html │ │ │ org.apache.ibatis.jdbc.RuntimeSqlException.html │ │ │ org.apache.ibatis.jdbc.ScriptRunner.html │ │ │ org.apache.ibatis.jdbc.SelectBuilder.html │ │ │ org.apache.ibatis.jdbc.SQL.html │ │ │ org.apache.ibatis.jdbc.SqlBuilder.html │ │ │ org.apache.ibatis.jdbc.SqlRunner.html │ │ │ org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl.html │ │ │ org.apache.ibatis.logging.jdbc.BaseJdbcLogger.html │ │ │ org.apache.ibatis.logging.jdbc.ConnectionLogger.html │ │ │ org.apache.ibatis.logging.jdbc.PreparedStatementLogger.html │ │ │ org.apache.ibatis.logging.jdbc.ResultSetLogger.html │ │ │ org.apache.ibatis.logging.jdbc.StatementLogger.html │ │ │ org.apache.ibatis.logging.jdk14.Jdk14LoggingImpl.html │ │ │ org.apache.ibatis.logging.Log.html │ │ │ org.apache.ibatis.logging.log4j.Log4jImpl.html │ │ │ org.apache.ibatis.logging.log4j2.Log4j2AbstractLoggerImpl.html │ │ │ org.apache.ibatis.logging.log4j2.Log4j2Impl.html │ │ │ org.apache.ibatis.logging.log4j2.Log4j2LoggerImpl.html │ │ │ org.apache.ibatis.logging.LogException.html │ │ │ org.apache.ibatis.logging.LogFactory.html │ │ │ org.apache.ibatis.logging.nologging.NoLoggingImpl.html │ │ │ org.apache.ibatis.logging.slf4j.Slf4jImpl.html │ │ │ org.apache.ibatis.logging.slf4j.Slf4jLocationAwareLoggerImpl.html │ │ │ org.apache.ibatis.logging.slf4j.Slf4jLoggerImpl.html │ │ │ org.apache.ibatis.logging.stdout.StdOutImpl.html │ │ │ org.apache.ibatis.mapping.BoundSql.html │ │ │ org.apache.ibatis.mapping.CacheBuilder.html │ │ │ org.apache.ibatis.mapping.DatabaseIdProvider.html │ │ │ org.apache.ibatis.mapping.DefaultDatabaseIdProvider.html │ │ │ org.apache.ibatis.mapping.Discriminator.html │ │ │ org.apache.ibatis.mapping.Environment.html │ │ │ org.apache.ibatis.mapping.MappedStatement.html │ │ │ org.apache.ibatis.mapping.ParameterMap.html │ │ │ org.apache.ibatis.mapping.ParameterMapping.html │ │ │ org.apache.ibatis.mapping.ParameterMode.html │ │ │ org.apache.ibatis.mapping.ResultFlag.html │ │ │ org.apache.ibatis.mapping.ResultMap.html │ │ │ org.apache.ibatis.mapping.ResultMapping.html │ │ │ org.apache.ibatis.mapping.ResultSetType.html │ │ │ org.apache.ibatis.mapping.SqlCommandType.html │ │ │ org.apache.ibatis.mapping.SqlSource.html │ │ │ org.apache.ibatis.mapping.StatementType.html │ │ │ org.apache.ibatis.mapping.VendorDatabaseIdProvider.html │ │ │ org.apache.ibatis.metadata.Column.html │ │ │ org.apache.ibatis.metadata.Database.html │ │ │ org.apache.ibatis.metadata.DatabaseFactory.html │ │ │ org.apache.ibatis.metadata.Table.html │ │ │ org.apache.ibatis.parsing.GenericTokenParser.html │ │ │ org.apache.ibatis.parsing.ParsingException.html │ │ │ org.apache.ibatis.parsing.PropertyParser.html │ │ │ org.apache.ibatis.parsing.TokenHandler.html │ │ │ org.apache.ibatis.parsing.XNode.html │ │ │ org.apache.ibatis.parsing.XPathParser.html │ │ │ org.apache.ibatis.plugin.Interceptor.html │ │ │ org.apache.ibatis.plugin.InterceptorChain.html │ │ │ org.apache.ibatis.plugin.Intercepts.html │ │ │ org.apache.ibatis.plugin.Invocation.html │ │ │ org.apache.ibatis.plugin.Plugin.html │ │ │ org.apache.ibatis.plugin.PluginException.html │ │ │ org.apache.ibatis.plugin.Signature.html │ │ │ org.apache.ibatis.reflection.ExceptionUtil.html │ │ │ org.apache.ibatis.reflection.factory.DefaultObjectFactory.html │ │ │ org.apache.ibatis.reflection.factory.ObjectFactory.html │ │ │ org.apache.ibatis.reflection.invoker.GetFieldInvoker.html │ │ │ org.apache.ibatis.reflection.invoker.Invoker.html │ │ │ org.apache.ibatis.reflection.invoker.MethodInvoker.html │ │ │ org.apache.ibatis.reflection.invoker.SetFieldInvoker.html │ │ │ org.apache.ibatis.reflection.MetaClass.html │ │ │ org.apache.ibatis.reflection.MetaObject.html │ │ │ org.apache.ibatis.reflection.property.PropertyCopier.html │ │ │ org.apache.ibatis.reflection.property.PropertyNamer.html │ │ │ org.apache.ibatis.reflection.property.PropertyTokenizer.html │ │ │ org.apache.ibatis.reflection.ReflectionException.html │ │ │ org.apache.ibatis.reflection.Reflector.html │ │ │ org.apache.ibatis.reflection.SystemMetaObject.html │ │ │ org.apache.ibatis.reflection.wrapper.BaseWrapper.html │ │ │ org.apache.ibatis.reflection.wrapper.BeanWrapper.html │ │ │ org.apache.ibatis.reflection.wrapper.CollectionWrapper.html │ │ │ org.apache.ibatis.reflection.wrapper.DefaultObjectWrapperFactory.html │ │ │ org.apache.ibatis.reflection.wrapper.MapWrapper.html │ │ │ org.apache.ibatis.reflection.wrapper.ObjectWrapper.html │ │ │ org.apache.ibatis.reflection.wrapper.ObjectWrapperFactory.html │ │ │ org.apache.ibatis.scripting.defaults.DefaultParameterHandler.html │ │ │ org.apache.ibatis.scripting.defaults.RawLanguageDriver.html │ │ │ org.apache.ibatis.scripting.defaults.RawSqlSource.html │ │ │ org.apache.ibatis.scripting.LanguageDriver.html │ │ │ org.apache.ibatis.scripting.LanguageDriverRegistry.html │ │ │ org.apache.ibatis.scripting.ScriptingException.html │ │ │ org.apache.ibatis.scripting.xmltags.ChooseSqlNode.html │ │ │ org.apache.ibatis.scripting.xmltags.DynamicContext.html │ │ │ org.apache.ibatis.scripting.xmltags.DynamicSqlSource.html │ │ │ org.apache.ibatis.scripting.xmltags.ExpressionEvaluator.html │ │ │ org.apache.ibatis.scripting.xmltags.ForEachSqlNode.html │ │ │ org.apache.ibatis.scripting.xmltags.IfSqlNode.html │ │ │ org.apache.ibatis.scripting.xmltags.MixedSqlNode.html │ │ │ org.apache.ibatis.scripting.xmltags.OgnlCache.html │ │ │ org.apache.ibatis.scripting.xmltags.SetSqlNode.html │ │ │ org.apache.ibatis.scripting.xmltags.SqlNode.html │ │ │ org.apache.ibatis.scripting.xmltags.TextSqlNode.html │ │ │ org.apache.ibatis.scripting.xmltags.TrimSqlNode.html │ │ │ org.apache.ibatis.scripting.xmltags.VarDeclSqlNode.html │ │ │ org.apache.ibatis.scripting.xmltags.WhereSqlNode.html │ │ │ org.apache.ibatis.scripting.xmltags.XMLLanguageDriver.html │ │ │ org.apache.ibatis.scripting.xmltags.XMLScriptBuilder.html │ │ │ org.apache.ibatis.session.AutoMappingBehavior.html │ │ │ org.apache.ibatis.session.Configuration.html │ │ │ org.apache.ibatis.session.defaults.DefaultSqlSession.html │ │ │ org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.html │ │ │ org.apache.ibatis.session.ExecutorType.html │ │ │ org.apache.ibatis.session.LocalCacheScope.html │ │ │ org.apache.ibatis.session.ResultContext.html │ │ │ org.apache.ibatis.session.ResultHandler.html │ │ │ org.apache.ibatis.session.RowBounds.html │ │ │ org.apache.ibatis.session.SqlSession.html │ │ │ org.apache.ibatis.session.SqlSessionException.html │ │ │ org.apache.ibatis.session.SqlSessionFactory.html │ │ │ org.apache.ibatis.session.SqlSessionFactoryBuilder.html │ │ │ org.apache.ibatis.session.SqlSessionManager.html │ │ │ org.apache.ibatis.session.TransactionIsolationLevel.html │ │ │ org.apache.ibatis.transaction.jdbc.JdbcTransaction.html │ │ │ org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory.html │ │ │ org.apache.ibatis.transaction.managed.ManagedTransaction.html │ │ │ org.apache.ibatis.transaction.managed.ManagedTransactionFactory.html │ │ │ org.apache.ibatis.transaction.Transaction.html │ │ │ org.apache.ibatis.transaction.TransactionException.html │ │ │ org.apache.ibatis.transaction.TransactionFactory.html │ │ │ org.apache.ibatis.type.Alias.html │ │ │ org.apache.ibatis.type.ArrayTypeHandler.html │ │ │ org.apache.ibatis.type.BaseTypeHandler.html │ │ │ org.apache.ibatis.type.BigDecimalTypeHandler.html │ │ │ org.apache.ibatis.type.BigIntegerTypeHandler.html │ │ │ org.apache.ibatis.type.BlobByteObjectArrayTypeHandler.html │ │ │ org.apache.ibatis.type.BlobTypeHandler.html │ │ │ org.apache.ibatis.type.BooleanTypeHandler.html │ │ │ org.apache.ibatis.type.ByteArrayTypeHandler.html │ │ │ org.apache.ibatis.type.ByteArrayUtils.html │ │ │ org.apache.ibatis.type.ByteObjectArrayTypeHandler.html │ │ │ org.apache.ibatis.type.ByteTypeHandler.html │ │ │ org.apache.ibatis.type.CharacterTypeHandler.html │ │ │ org.apache.ibatis.type.ClobTypeHandler.html │ │ │ org.apache.ibatis.type.DateOnlyTypeHandler.html │ │ │ org.apache.ibatis.type.DateTypeHandler.html │ │ │ org.apache.ibatis.type.DoubleTypeHandler.html │ │ │ org.apache.ibatis.type.EnumOrdinalTypeHandler.html │ │ │ org.apache.ibatis.type.EnumTypeHandler.html │ │ │ org.apache.ibatis.type.FloatTypeHandler.html │ │ │ org.apache.ibatis.type.IntegerTypeHandler.html │ │ │ org.apache.ibatis.type.JdbcType.html │ │ │ org.apache.ibatis.type.LongTypeHandler.html │ │ │ org.apache.ibatis.type.MappedJdbcTypes.html │ │ │ org.apache.ibatis.type.MappedTypes.html │ │ │ org.apache.ibatis.type.NClobTypeHandler.html │ │ │ org.apache.ibatis.type.NStringTypeHandler.html │ │ │ org.apache.ibatis.type.ObjectTypeHandler.html │ │ │ org.apache.ibatis.type.ShortTypeHandler.html │ │ │ org.apache.ibatis.type.SimpleTypeRegistry.html │ │ │ org.apache.ibatis.type.SqlDateTypeHandler.html │ │ │ org.apache.ibatis.type.SqlTimestampTypeHandler.html │ │ │ org.apache.ibatis.type.SqlTimeTypeHandler.html │ │ │ org.apache.ibatis.type.StringTypeHandler.html │ │ │ org.apache.ibatis.type.TimeOnlyTypeHandler.html │ │ │ org.apache.ibatis.type.TypeAliasRegistry.html │ │ │ org.apache.ibatis.type.TypeException.html │ │ │ org.apache.ibatis.type.TypeHandler.html │ │ │ org.apache.ibatis.type.TypeHandlerRegistry.html │ │ │ org.apache.ibatis.type.TypeReference.html │ │ │ org.apache.ibatis.type.UnknownTypeHandler.html │ │ │ │ │ ├─css │ │ │ help.css │ │ │ main.css │ │ │ sortabletable.css │ │ │ source-viewer.css │ │ │ tooltip.css │ │ │ │ │ ├─images │ │ └─js │ │ customsorttypes.js │ │ popup.js │ │ sortabletable.js │ │ stringbuilder.js │ │ │ ├─css │ │ apache-maven-fluido-1.3.0.min.css │ │ print.css │ │ site.css │ │ │ ├─images │ │ ├─logos │ │ └─profiles │ ├─img │ ├─js │ │ apache-maven-fluido-1.3.0.min.js │ │ │ ├─xref │ │ │ allclasses-frame.html │ │ │ index.html │ │ │ overview-frame.html │ │ │ overview-summary.html │ │ │ stylesheet.css │ │ │ │ │ └─org │ │ └─apache │ │ └─ibatis │ │ │ package-frame.html │ │ │ package-summary.html │ │ │ │ │ ├─annotations │ │ │ Arg.html │ │ │ CacheNamespace.html │ │ │ CacheNamespaceRef.html │ │ │ Case.html │ │ │ ConstructorArgs.html │ │ │ Delete.html │ │ │ DeleteProvider.html │ │ │ Insert.html │ │ │ InsertProvider.html │ │ │ Lang.html │ │ │ Many.html │ │ │ MapKey.html │ │ │ One.html │ │ │ Options.html │ │ │ package-frame.html │ │ │ package-summary.html │ │ │ Param.html │ │ │ Result.html │ │ │ ResultMap.html │ │ │ Results.html │ │ │ ResultType.html │ │ │ Select.html │ │ │ SelectKey.html │ │ │ SelectProvider.html │ │ │ TypeDiscriminator.html │ │ │ Update.html │ │ │ UpdateProvider.html │ │ │ │ │ ├─binding │ │ │ BindingException.html │ │ │ MapperMethod.html │ │ │ MapperProxy.html │ │ │ MapperProxyFactory.html │ │ │ MapperRegistry.html │ │ │ package-frame.html │ │ │ package-summary.html │ │ │ │ │ ├─builder │ │ │ │ BaseBuilder.html │ │ │ │ BuilderException.html │ │ │ │ CacheRefResolver.html │ │ │ │ IncompleteElementException.html │ │ │ │ MapperBuilderAssistant.html │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ ParameterExpression.html │ │ │ │ ResultMapResolver.html │ │ │ │ SqlSourceBuilder.html │ │ │ │ StaticSqlSource.html │ │ │ │ │ │ │ ├─annotation │ │ │ │ MapperAnnotationBuilder.html │ │ │ │ MethodResolver.html │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ ProviderSqlSource.html │ │ │ │ │ │ │ └─xml │ │ │ package-frame.html │ │ │ package-summary.html │ │ │ XMLConfigBuilder.html │ │ │ XMLIncludeTransformer.html │ │ │ XMLMapperBuilder.html │ │ │ XMLMapperEntityResolver.html │ │ │ XMLStatementBuilder.html │ │ │ │ │ ├─cache │ │ │ │ Cache.html │ │ │ │ CacheException.html │ │ │ │ CacheKey.html │ │ │ │ NullCacheKey.html │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ TransactionalCacheManager.html │ │ │ │ │ │ │ ├─decorators │ │ │ │ FifoCache.html │ │ │ │ LoggingCache.html │ │ │ │ LruCache.html │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ ScheduledCache.html │ │ │ │ SerializedCache.html │ │ │ │ SoftCache.html │ │ │ │ SynchronizedCache.html │ │ │ │ TransactionalCache.html │ │ │ │ WeakCache.html │ │ │ │ │ │ │ └─impl │ │ │ package-frame.html │ │ │ package-summary.html │ │ │ PerpetualCache.html │ │ │ │ │ ├─datasource │ │ │ │ DataSourceException.html │ │ │ │ DataSourceFactory.html │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ │ │ │ ├─jndi │ │ │ │ JndiDataSourceFactory.html │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ │ │ │ ├─pooled │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ PooledConnection.html │ │ │ │ PooledDataSource.html │ │ │ │ PooledDataSourceFactory.html │ │ │ │ PoolState.html │ │ │ │ │ │ │ └─unpooled │ │ │ package-frame.html │ │ │ package-summary.html │ │ │ UnpooledDataSource.html │ │ │ UnpooledDataSourceFactory.html │ │ │ │ │ ├─exceptions │ │ │ ExceptionFactory.html │ │ │ IbatisException.html │ │ │ package-frame.html │ │ │ package-summary.html │ │ │ PersistenceException.html │ │ │ TooManyResultsException.html │ │ │ │ │ ├─executor │ │ │ │ BaseExecutor.html │ │ │ │ BatchExecutor.html │ │ │ │ BatchExecutorException.html │ │ │ │ BatchResult.html │ │ │ │ CachingExecutor.html │ │ │ │ ErrorContext.html │ │ │ │ ExecutionPlaceholder.html │ │ │ │ Executor.html │ │ │ │ ExecutorException.html │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ ResultExtractor.html │ │ │ │ ReuseExecutor.html │ │ │ │ SimpleExecutor.html │ │ │ │ │ │ │ ├─keygen │ │ │ │ Jdbc3KeyGenerator.html │ │ │ │ KeyGenerator.html │ │ │ │ NoKeyGenerator.html │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ SelectKeyGenerator.html │ │ │ │ │ │ │ ├─loader │ │ │ │ │ AbstractEnhancedDeserializationProxy.html │ │ │ │ │ AbstractSerialStateHolder.html │ │ │ │ │ CglibProxyFactory.html │ │ │ │ │ JavassistProxyFactory.html │ │ │ │ │ package-frame.html │ │ │ │ │ package-summary.html │ │ │ │ │ ProxyFactory.html │ │ │ │ │ ResultLoader.html │ │ │ │ │ ResultLoaderMap.html │ │ │ │ │ WriteReplaceInterface.html │ │ │ │ │ │ │ │ │ ├─cglib │ │ │ │ │ CglibProxyFactory.html │ │ │ │ │ CglibSerialStateHolder.html │ │ │ │ │ package-frame.html │ │ │ │ │ package-summary.html │ │ │ │ │ │ │ │ │ └─javassist │ │ │ │ JavassistProxyFactory.html │ │ │ │ JavassistSerialStateHolder.html │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ │ │ │ ├─parameter │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ ParameterHandler.html │ │ │ │ │ │ │ ├─result │ │ │ │ DefaultMapResultHandler.html │ │ │ │ DefaultResultContext.html │ │ │ │ DefaultResultHandler.html │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ │ │ │ ├─resultset │ │ │ │ DefaultResultSetHandler.html │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ ResultSetHandler.html │ │ │ │ ResultSetWrapper.html │ │ │ │ │ │ │ └─statement │ │ │ BaseStatementHandler.html │ │ │ CallableStatementHandler.html │ │ │ package-frame.html │ │ │ package-summary.html │ │ │ PreparedStatementHandler.html │ │ │ RoutingStatementHandler.html │ │ │ SimpleStatementHandler.html │ │ │ StatementHandler.html │ │ │ │ │ ├─io │ │ │ ClassLoaderWrapper.html │ │ │ DefaultVFS.html │ │ │ ExternalResources.html │ │ │ JBoss6VFS.html │ │ │ package-frame.html │ │ │ package-summary.html │ │ │ ResolverUtil.html │ │ │ Resources.html │ │ │ VFS.html │ │ │ │ │ ├─jdbc │ │ │ AbstractSQL.html │ │ │ Null.html │ │ │ package-frame.html │ │ │ package-summary.html │ │ │ RuntimeSqlException.html │ │ │ ScriptRunner.html │ │ │ SelectBuilder.html │ │ │ SQL.html │ │ │ SqlBuilder.html │ │ │ SqlRunner.html │ │ │ │ │ ├─logging │ │ │ │ Log.html │ │ │ │ LogException.html │ │ │ │ LogFactory.html │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ │ │ │ ├─commons │ │ │ │ JakartaCommonsLoggingImpl.html │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ │ │ │ ├─jdbc │ │ │ │ BaseJdbcLogger.html │ │ │ │ ConnectionLogger.html │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ PreparedStatementLogger.html │ │ │ │ ResultSetLogger.html │ │ │ │ StatementLogger.html │ │ │ │ │ │ │ ├─jdk14 │ │ │ │ Jdk14LoggingImpl.html │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ │ │ │ ├─log4j │ │ │ │ Log4jImpl.html │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ │ │ │ ├─log4j2 │ │ │ │ Log4j2AbstractLoggerImpl.html │ │ │ │ Log4j2Impl.html │ │ │ │ Log4j2LoggerImpl.html │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ │ │ │ ├─nologging │ │ │ │ NoLoggingImpl.html │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ │ │ │ ├─slf4j │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ Slf4jImpl.html │ │ │ │ Slf4jLocationAwareLoggerImpl.html │ │ │ │ Slf4jLoggerImpl.html │ │ │ │ │ │ │ └─stdout │ │ │ package-frame.html │ │ │ package-summary.html │ │ │ StdOutImpl.html │ │ │ │ │ ├─mapping │ │ │ BoundSql.html │ │ │ CacheBuilder.html │ │ │ DatabaseIdProvider.html │ │ │ DefaultDatabaseIdProvider.html │ │ │ Discriminator.html │ │ │ Environment.html │ │ │ MappedStatement.html │ │ │ package-frame.html │ │ │ package-summary.html │ │ │ ParameterMap.html │ │ │ ParameterMapping.html │ │ │ ParameterMode.html │ │ │ ResultFlag.html │ │ │ ResultMap.html │ │ │ ResultMapping.html │ │ │ ResultSetType.html │ │ │ SqlCommandType.html │ │ │ SqlSource.html │ │ │ StatementType.html │ │ │ VendorDatabaseIdProvider.html │ │ │ │ │ ├─metadata │ │ │ Column.html │ │ │ Database.html │ │ │ DatabaseFactory.html │ │ │ package-frame.html │ │ │ package-summary.html │ │ │ Table.html │ │ │ │ │ ├─parsing │ │ │ GenericTokenParser.html │ │ │ package-frame.html │ │ │ package-summary.html │ │ │ ParsingException.html │ │ │ PropertyParser.html │ │ │ TokenHandler.html │ │ │ XNode.html │ │ │ XPathParser.html │ │ │ │ │ ├─plugin │ │ │ Interceptor.html │ │ │ InterceptorChain.html │ │ │ Intercepts.html │ │ │ Invocation.html │ │ │ package-frame.html │ │ │ package-summary.html │ │ │ Plugin.html │ │ │ PluginException.html │ │ │ Signature.html │ │ │ │ │ ├─reflection │ │ │ │ ExceptionUtil.html │ │ │ │ MetaClass.html │ │ │ │ MetaObject.html │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ ReflectionException.html │ │ │ │ Reflector.html │ │ │ │ SystemMetaObject.html │ │ │ │ │ │ │ ├─factory │ │ │ │ DefaultObjectFactory.html │ │ │ │ ObjectFactory.html │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ │ │ │ ├─invoker │ │ │ │ GetFieldInvoker.html │ │ │ │ Invoker.html │ │ │ │ MethodInvoker.html │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ SetFieldInvoker.html │ │ │ │ │ │ │ ├─property │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ PropertyCopier.html │ │ │ │ PropertyNamer.html │ │ │ │ PropertyTokenizer.html │ │ │ │ │ │ │ └─wrapper │ │ │ BaseWrapper.html │ │ │ BeanWrapper.html │ │ │ CollectionWrapper.html │ │ │ DefaultObjectWrapperFactory.html │ │ │ MapWrapper.html │ │ │ ObjectWrapper.html │ │ │ ObjectWrapperFactory.html │ │ │ package-frame.html │ │ │ package-summary.html │ │ │ │ │ ├─scripting │ │ │ │ LanguageDriver.html │ │ │ │ LanguageDriverRegistry.html │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ ScriptingException.html │ │ │ │ │ │ │ ├─defaults │ │ │ │ DefaultParameterHandler.html │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ RawLanguageDriver.html │ │ │ │ RawSqlSource.html │ │ │ │ │ │ │ └─xmltags │ │ │ ChooseSqlNode.html │ │ │ DynamicContext.html │ │ │ DynamicSqlSource.html │ │ │ ExpressionEvaluator.html │ │ │ ForEachSqlNode.html │ │ │ IfSqlNode.html │ │ │ MixedSqlNode.html │ │ │ OgnlCache.html │ │ │ package-frame.html │ │ │ package-summary.html │ │ │ SetSqlNode.html │ │ │ SqlNode.html │ │ │ TextSqlNode.html │ │ │ TrimSqlNode.html │ │ │ VarDeclSqlNode.html │ │ │ WhereSqlNode.html │ │ │ XMLLanguageDriver.html │ │ │ XMLScriptBuilder.html │ │ │ │ │ ├─session │ │ │ │ AutoMappingBehavior.html │ │ │ │ Configuration.html │ │ │ │ ExecutorType.html │ │ │ │ LocalCacheScope.html │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ ResultContext.html │ │ │ │ ResultHandler.html │ │ │ │ RowBounds.html │ │ │ │ SqlSession.html │ │ │ │ SqlSessionException.html │ │ │ │ SqlSessionFactory.html │ │ │ │ SqlSessionFactoryBuilder.html │ │ │ │ SqlSessionManager.html │ │ │ │ TransactionIsolationLevel.html │ │ │ │ │ │ │ └─defaults │ │ │ DefaultSqlSession.html │ │ │ DefaultSqlSessionFactory.html │ │ │ package-frame.html │ │ │ package-summary.html │ │ │ │ │ ├─transaction │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ Transaction.html │ │ │ │ TransactionException.html │ │ │ │ TransactionFactory.html │ │ │ │ │ │ │ ├─jdbc │ │ │ │ JdbcTransaction.html │ │ │ │ JdbcTransactionFactory.html │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ │ │ │ └─managed │ │ │ ManagedTransaction.html │ │ │ ManagedTransactionFactory.html │ │ │ package-frame.html │ │ │ package-summary.html │ │ │ │ │ └─type │ │ Alias.html │ │ ArrayTypeHandler.html │ │ BaseTypeHandler.html │ │ BigDecimalTypeHandler.html │ │ BigIntegerTypeHandler.html │ │ BlobByteObjectArrayTypeHandler.html │ │ BlobTypeHandler.html │ │ BooleanTypeHandler.html │ │ ByteArrayTypeHandler.html │ │ ByteArrayUtils.html │ │ ByteObjectArrayTypeHandler.html │ │ ByteTypeHandler.html │ │ CharacterTypeHandler.html │ │ ClobTypeHandler.html │ │ DateOnlyTypeHandler.html │ │ DateTypeHandler.html │ │ DoubleTypeHandler.html │ │ EnumOrdinalTypeHandler.html │ │ EnumTypeHandler.html │ │ FloatTypeHandler.html │ │ IntegerTypeHandler.html │ │ JdbcType.html │ │ LongTypeHandler.html │ │ MappedJdbcTypes.html │ │ MappedTypes.html │ │ NClobTypeHandler.html │ │ NStringTypeHandler.html │ │ ObjectTypeHandler.html │ │ package-frame.html │ │ package-summary.html │ │ ShortTypeHandler.html │ │ SimpleTypeRegistry.html │ │ SqlDateTypeHandler.html │ │ SqlTimestampTypeHandler.html │ │ SqlTimeTypeHandler.html │ │ StringTypeHandler.html │ │ TimeOnlyTypeHandler.html │ │ TypeAliasRegistry.html │ │ TypeException.html │ │ TypeHandler.html │ │ TypeHandlerRegistry.html │ │ TypeReference.html │ │ UnknownTypeHandler.html │ │ │ └─xref-test │ │ allclasses-frame.html │ │ index.html │ │ overview-frame.html │ │ overview-summary.html │ │ stylesheet.css │ │ │ ├─com │ │ ├─badbeans │ │ │ BeanWithDifferentTypeGetterSetter.html │ │ │ BeanWithDifferentTypeOverloadedSetter.html │ │ │ BeanWithNoGetterOverloadedSetters.html │ │ │ BeanWithOverloadedSetter.html │ │ │ GoodBean.html │ │ │ package-frame.html │ │ │ package-summary.html │ │ │ │ │ ├─domain │ │ │ └─misc │ │ │ Employee.html │ │ │ package-frame.html │ │ │ package-summary.html │ │ │ │ │ ├─ibatis │ │ │ ├─common │ │ │ │ ├─jdbc │ │ │ │ │ DbcpConfiguration.html │ │ │ │ │ package-frame.html │ │ │ │ │ package-summary.html │ │ │ │ │ ScriptRunner.html │ │ │ │ │ SimpleDataSource.html │ │ │ │ │ │ │ │ │ ├─resources │ │ │ │ │ package-frame.html │ │ │ │ │ package-summary.html │ │ │ │ │ Resources.html │ │ │ │ │ ResourcesTest.html │ │ │ │ │ │ │ │ │ └─util │ │ │ │ NodeEvent.html │ │ │ │ NodeEventParser.html │ │ │ │ NodeEventWrapper.html │ │ │ │ NodeletParserTest.html │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ PaginatedArrayList.html │ │ │ │ PaginatedArrayListTest.html │ │ │ │ PaginatedList.html │ │ │ │ Stopwatch.html │ │ │ │ │ │ │ ├─dao │ │ │ │ ├─client │ │ │ │ │ │ Dao.html │ │ │ │ │ │ DaoException.html │ │ │ │ │ │ DaoManager.html │ │ │ │ │ │ DaoManagerBuilder.html │ │ │ │ │ │ DaoTransaction.html │ │ │ │ │ │ package-frame.html │ │ │ │ │ │ package-summary.html │ │ │ │ │ │ │ │ │ │ │ └─template │ │ │ │ │ DaoTemplate.html │ │ │ │ │ JdbcDaoTemplate.html │ │ │ │ │ package-frame.html │ │ │ │ │ package-summary.html │ │ │ │ │ SqlMapDaoTemplate.html │ │ │ │ │ │ │ │ │ └─engine │ │ │ │ ├─builder │ │ │ │ │ └─xml │ │ │ │ │ DaoClasspathEntityResolver.html │ │ │ │ │ package-frame.html │ │ │ │ │ package-summary.html │ │ │ │ │ XmlDaoManagerBuilder.html │ │ │ │ │ │ │ │ │ ├─impl │ │ │ │ │ DaoContext.html │ │ │ │ │ DaoImpl.html │ │ │ │ │ DaoProxy.html │ │ │ │ │ DaoTransactionState.html │ │ │ │ │ package-frame.html │ │ │ │ │ package-summary.html │ │ │ │ │ StandardDaoManager.html │ │ │ │ │ │ │ │ │ └─transaction │ │ │ │ │ ConnectionDaoTransaction.html │ │ │ │ │ DaoTransactionManager.html │ │ │ │ │ package-frame.html │ │ │ │ │ package-summary.html │ │ │ │ │ │ │ │ │ ├─external │ │ │ │ │ ExternalDaoTransaction.html │ │ │ │ │ ExternalDaoTransactionManager.html │ │ │ │ │ package-frame.html │ │ │ │ │ package-summary.html │ │ │ │ │ │ │ │ │ ├─jdbc │ │ │ │ │ JdbcDaoTransaction.html │ │ │ │ │ JdbcDaoTransactionManager.html │ │ │ │ │ package-frame.html │ │ │ │ │ package-summary.html │ │ │ │ │ │ │ │ │ └─sqlmap │ │ │ │ package-frame.html │ │ │ │ package-summary.html │ │ │ │ SqlMapDaoTransaction.html │ │ │ │ SqlMapDaoTransactionManager.html │ │ │ │ │ │ │ ├─jpetstore │ │ │ │ ├─domain │ │ │ │ │ Account.html │ │ │ │ │ BeanIntrospector.html │ │ │ │ │ BeanTest.html │ │ │ │ │ Cart.html │ │ │ │ │ CartItem.html │ │ │ │ │ Category.html │ │ │ │ │ ClassIntrospector.html │ │ │ │ │ DomainFixture.html │ │ │ │ │ Item.html │ │ │ │ │ LineItem.html │ │ │ │ │ Order.html │ │ │ │ │ package-frame.html │ │ │ │ │ package-summary.html │ │ │ │ │ Product.html │ │ │ │ │ Sequence.html │ │ │ │ │ │ │ │ │ └─persistence │ │ │ │ │ AccountDaoTest.html │ │ │ │ │ BasePersistenceTest.html │ │ │ │ │ CategoryDaoTest.html │ │ │ │ │ DaoConfig.html │ │ │ │ │ DaoManagerTest.html │ │ │ │ │ ItemDaoTest.html │ │ │ │ │ OrderDaoTest.html │ │ │ │ │ package-frame.html │ │ │ │ │ package-summary.html │ │ │ │ │ PersistenceFixture.html │ │ │ │ │ ProductDaoTest.html │ │ │ │ │ SequenceDaoTest.html │ │ │ │ │ │ │ │ │ ├─iface │ │ │ │ │ AccountDao.html │ │ │ │ │ CategoryDao.html │ │ │ │ │ ItemDao.html │ │ │ │ │ OrderDao.html │ │ │ │ │ package-frame.html │ │ │ │ │ package-summary.html │ │ │ │ │ ProductDao.html │ │ │ │ │ SequenceDao.html │ │ │ │ │ │ │ │ │ └─sqlmapdao │ │ │ │ AccountSqlMapDao.html │ │ │ │ BaseSqlMapDao.html │ │ │ │ CategorySqlMapDao.html │ │ │ │ ItemSqlMapDao.html │ │ │ │ OrderS
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值