Mybatis详解(二)--动态代理(未集成Spring)
mybatis: xxMapper ================> xxMapper.xml
2.SqlSession代表和数据库的一次会话,用完必须关闭。
3.SqlSession和Connection一样,都是非线程安全的,每次使用都是应该去获取新的对象,不要将这个对象定义在类变量中使用!
4.mapper接口没有实现类,但是mybatis这个接口生成一个代理对象
EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
5.两个重要的配置文件
mybatis的全局配置文件:包含数据库连接池信息,事务管理器信息等…系统运行环境信息。
sql映射文件:保存了每一个sql语句的映射信息。
在开始动态代理的原理讲解以前,我们先看一下集成mybatis以后dao层不使用动态代理以及使用动态代理的两种实现方式,通过对比我们自己实现dao层接口以及mybatis动态代理可以更加直观的展现出mybatis动态代理替我们所做的工作,有利于我们理解动态代理的过程,讲解完以后我们再进行动态代理的原理解析,此讲解基于mybatis的环境已经搭建完成,并且已经实现了基本的用户类编写以及用户类的Dao接口的声明,下面是Dao层的接口代码
复制代码
public interface UserDao {
/*
查询所有用户信息
*/
List findAll();
/**
- 保存用户
- @param user
*/
void save(User user);
/**
- 更新用户
- @return
/
void update(User user);
/* - 删除用户
*/
void delete(Integer userId);
/**
- 查找一个用户
- @param userId
- @return
*/
User findOne(Integer userId);
/**
- 根据名字模糊查询
- @param name
- @return
/
List findByName(String name);
/* - 根据组合对象进行模糊查询
- @param vo
- @return
*/
List findByQueryVo(QueryVo vo);
}
复制代码
一、Mybatis dao层两种实现方式的对比
1.dao层不使用动态代理
dao层不使用动态代理的话,就需要我们自己实现dao层的接口,为了简便起见,我只是实现了Dao接口中的findAll方法,以此方法为例子来展现我们自己实现Dao的方式的情况,让我们来看代码:
复制代码
public class UserDaoImpl implements UserDao{
private SqlSessionFactory factory;
public UserDaoImpl(SqlSessionFactory factory){
this.factory = factory;
}
public List findAll() {
//1.获取sqlSession对象
SqlSession sqlSession = factory.openSession();
//2.调用selectList方法
List list = sqlSession.selectList(“com.example.dao.UserDao.findAll”);
//3.关闭流
sqlSession.close();
return list;
}
public void save(User user) {
}
public void update(User user) {
}
public void delete(Integer userId) {
}
public User findOne(Integer userId) {
return null;
}
public List findByName(String name) {
return null;
}
public List findByQueryVo(QueryVo vo) {
return null;
}
复制代码
这里的关键代码 List list = sqlSession.selectList(“com.example.dao.UserDao.findAll”),需要我们自己手动调用SqlSession里面的方法,基于动态代理的方式最后的目标也是成功的调用到这里。
注意:如果是添加,更新或者删除操作的话需要在方法中增加事务的提交。
2.dao层使用Mybatis的动态代理
使用动态代理的话Dao层的接口声明完成以后只需要在使用的时候通过SqlSession对象的getMapper方法获取对应Dao接口的代理对象,关键代码如下:
//3.获取SqlSession对象
SqlSession session = factory.openSession();
//4.获取dao的代理对象
UserDao mapper = session.getMapper(UserDao.class);
//5.执行查询所有的方法
List list = mapper.findAll();
获取到dao层的代理对象以后通过代理对象调用查询方法就可以实现查询所有用户列表的功能。
二、Mybatis动态代理实现方式的原理解析
动态代理中最重要的类:SqlSession、MapperProxy、MapperMethod,下面开始从入口方法到调用结束的过程分析。
调用方法的开始:
//4.获取dao的代理对象
UserDao mapper = session.getMapper(UserDao.class); 因为SqlSesseion为接口,所以我们通过Debug方式发现这里使用的实现类为DefaultSqlSession。
找到DeaultSqlSession中的getMapper方法,发现这里没有做其他的动作,只是将工作继续抛到了Configuration类中,Configuration为类不是接口,可以直接进入该类的getMapper方法中
@Override
public T getMapper(Class type) {
return configuration.getMapper(type, this);
}
3. 找到Configuration类的getMapper方法,这里也是将工作继续交到MapperRegistry的getMapper的方法中,所以我们继续向下进行。
public T getMapper(Class type, SqlSession sqlSession) {
return mapperRegistry.getMapper(type, sqlSession);
}
4. 找到MapperRegistry的getMapper的方法,看到这里发现和以前不一样了,通过MapperProxyFactory的命名方式我们知道这里将通过这个工厂生成我们所关注的MapperProxy的代理类,然后我们通过mapperProxyFactory.newInstance(sqlSession);进入MapperProxyFactory的newInstance方法中
复制代码
复制代码
public T getMapper(Class type, SqlSession sqlSession) {
final MapperProxyFactory mapperProxyFactory = (MapperProxyFactory) knownMappers.get(type);
if (mapperProxyFactory == null) {
throw new BindingException(“Type " + type + " is not known to the MapperRegistry.”);
}
try {
return mapperProxyFactory.newInstance(sqlSession);
} catch (Exception e) {
throw new BindingException("Error getting mapper instance. Cause: " + e, e);
}
}
复制代码
复制代码
5. 找到MapperProxyFactory的newIntance方法,通过参数类型SqlSession可以得知,上面的调用先进入第二个newInstance方法中并创建我们所需要重点关注的MapperProxy对象,第二个方法中再调用第一个newInstance方法并将MapperProxy对象传入进去,根据该对象创建代理类并返回。这里已经得到需要的代理类了,但是我们的代理类所做的工作还得继续向下看MapperProxy类。
复制代码
复制代码
protected T newInstance(MapperProxy mapperProxy) {
return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface }, mapperProxy);
}
public T newInstance(SqlSession sqlSession) {
final MapperProxy mapperProxy = new MapperProxy(sqlSession, mapperInterface, methodCache);
return newInstance(mapperProxy);
}
复制代码
复制代码
6. 找到MapperProxy类,发现其确实实现了JDK动态代理必须实现的接口InvocationHandler,所以我们重点关注invoke()方法,这里看到在invoke方法里先获取MapperMethod类,然后调用mapperMethod.execute(),所以我们继续查看MapperMethod类的execute方法。
复制代码
复制代码
public class MapperProxy implements InvocationHandler, Serializable {
private static final long serialVersionUID = -6424540398559729838L;
private final SqlSession sqlSession;
private final Class mapperInterface;
private final Map<Method, MapperMethod> methodCache;
public MapperProxy(SqlSession sqlSession, Class mapperInterface, Map<Method, MapperMethod> methodCache) {
this.sqlSession = sqlSession;
this.mapperInterface = mapperInterface;
this.methodCache = methodCache;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
try {
if (Object.class.equals(method.getDeclaringClass())) {
return method.invoke(this, args);
} else if (isDefaultMethod(method)) {
return invokeDefaultMethod(proxy, method, args);
}
} catch (Throwable t) {
throw ExceptionUtil.unwrapThrowable(t);
}
final MapperMethod mapperMethod = cachedMapperMethod(method);
return mapperMethod.execute(sqlSession, args);
}
private MapperMethod cachedMapperMethod(Method method) {
MapperMethod mapperMethod = methodCache.get(method);
if (mapperMethod == null) {
mapperMethod = new MapperMethod(mapperInterface, method, sqlSession.getConfiguration());
methodCache.put(method, mapperMethod);
}
return mapperMethod;
}
@UsesJava7
private Object invokeDefaultMethod(Object proxy, Method method, Object[] args)
throws Throwable {
final Constructor<MethodHandles.Lookup> constructor = MethodHandles.Lookup.class
.getDeclaredConstructor(Class.class, int.class);
if (!constructor.isAccessible()) {
constructor.setAccessible(true);
}
final Class<?> declaringClass = method.getDeclaringClass();
return constructor
.newInstance(declaringClass,
MethodHandles.Lookup.PRIVATE | MethodHandles.Lookup.PROTECTED
| MethodHandles.Lookup.PACKAGE | MethodHandles.Lookup.PUBLIC)
.unreflectSpecial(method, declaringClass).bindTo(proxy).invokeWithArguments(args);
}
/**
- Backport of java.lang.reflect.Method#isDefault()
*/
private boolean isDefaultMethod(Method method) {
return ((method.getModifiers()
& (Modifier.ABSTRACT | Modifier.PUBLIC | Modifier.STATIC)) == Modifier.PUBLIC)
&& method.getDeclaringClass().isInterface();
}
}
复制代码
复制代码
- 找到类MapperMethod类的execute方法,发现execute中通过调用本类中的其他方法获取并封装返回结果,我们来看一下MapperMethod整个类。
复制代码
复制代码
public Object execute(SqlSession sqlSession, Object[] args) {
Object result;
switch (command.getType()) {
case INSERT: {
Object param = method.convertArgsToSqlCommandParam(args);
result = rowCountResult(sqlSession.insert(command.getName(), param));
break;
}
case UPDATE: {
Object param = method.convertArgsToSqlCommandParam(args);
result = rowCountResult(sqlSession.update(command.getName(), param));
break;
}
case DELETE: {
Object param = method.convertArgsToSqlCommandParam(args);
result = rowCountResult(sqlSession.delete(command.getName(), param));
break;
}
case SELECT:
if (method.returnsVoid() && method.hasResultHandler()) {
executeWithResultHandler(sqlSession, args);
result = null;
} else if (method.returnsMany()) {
result = executeForMany(sqlSession, args);
} else if (method.returnsMap()) {
result = executeForMap(sqlSession, args);
} else if (method.returnsCursor()) {
result = executeForCursor(sqlSession, args);
} else {
Object param = method.convertArgsToSqlCommandParam(args);
result = sqlSession.selectOne(command.getName(), param);
}
break;
case FLUSH:
result = sqlSession.flushStatements();
break;
default:
throw new BindingException(“Unknown execution method for: " + command.getName());
}
if (result == null && method.getReturnType().isPrimitive() && !method.returnsVoid()) {
throw new BindingException(“Mapper method '” + command.getName()
+ " attempted to return null from a method with a primitive return type (” + method.getReturnType() + “).”);
}
return result;
}
复制代码
复制代码
8. MapperMethod类是整个代理机制的核心类,对SqlSession中的操作进行了封装使用。 该类里有两个内部类SqlCommand和MethodSignature。 SqlCommand用来封装CRUD操作,也就是我们在xml中配置的操作的节点。每个节点都会生成一个MappedStatement类。MethodSignature用来封装方法的参数以及返回类型,在execute的方法中我们发现在这里又回到了SqlSession中的接口调用,和我们自己实现UerDao接口的方式中直接用SqlSession对象调用DefaultSqlSession的实现类的方法是一样的,经过一大圈的代理又回到了原地,这就是整个动态代理的实现过程了。
复制代码
public class MapperMethod {
private final SqlCommand command; private final MethodSignature method; public MapperMethod(Class<?> mapperInterface, Method method, Configuration config) { this.command = new SqlCommand(config, mapperInterface, method); this.method = new MethodSignature(config, mapperInterface, method); } public Object execute(SqlSession sqlSession, Object[] args) { Object result; switch (command.getType()) { case INSERT: { Object param = method.convertArgsToSqlCommandParam(args); result = rowCountResult(sqlSession.insert(command.getName(), param)); break; } case UPDATE: { Object param = method.convertArgsToSqlCommandParam(args); result = rowCountResult(sqlSession.update(command.getName(), param)); break; } case DELETE: { Object param = method.convertArgsToSqlCommandParam(args); result = rowCountResult(sqlSession.delete(command.getName(), param)); break; } case SELECT: if (method.returnsVoid() && method.hasResultHandler()) { executeWithResultHandler(sqlSession, args); result = null; } else if (method.returnsMany()) { result = executeForMany(sqlSession, args); } else if (method.returnsMap()) { result = executeForMap(sqlSession, args); } else if (method.returnsCursor()) { result = executeForCursor(sqlSession, args); } else { Object param = method.convertArgsToSqlCommandParam(args); result = sqlSession.selectOne(command.getName(), param); } break; case FLUSH: result = sqlSession.flushStatements(); break; default: throw new BindingException("Unknown execution method for: " + command.getName()); } if (result == null && method.getReturnType().isPrimitive() && !method.returnsVoid()) { throw new BindingException("Mapper method '" + command.getName() + " attempted to return null from a method with a primitive return type (" + method.getReturnType() + ")."); } return result; } private Object rowCountResult(int rowCount) { final Object result; if (method.returnsVoid()) { result = null; } else if (Integer.class.equals(method.getReturnType()) || Integer.TYPE.equals(method.getReturnType())) { result = rowCount; } else if (Long.class.equals(method.getReturnType()) || Long.TYPE.equals(method.getReturnType())) { result = (long)rowCount; } else if (Boolean.class.equals(method.getReturnType()) || Boolean.TYPE.equals(method.getReturnType())) { result = rowCount > 0; } else { throw new BindingException("Mapper method '" + command.getName() + "' has an unsupported return type: " + method.getReturnType()); } return result; } private void executeWithResultHandler(SqlSession sqlSession, Object[] args) { MappedStatement ms = sqlSession.getConfiguration().getMappedStatement(command.getName()); if (void.class.equals(ms.getResultMaps().get(0).getType())) { throw new BindingException("method " + command.getName() + " needs either a @ResultMap annotation, a @ResultType annotation," + " or a resultType attribute in XML so a ResultHandler can be used as a parameter."); } Object param = method.convertArgsToSqlCommandParam(args); if (method.hasRowBounds()) { RowBounds rowBounds = method.extractRowBounds(args); sqlSession.select(command.getName(), param, rowBounds, method.extractResultHandler(args)); } else { sqlSession.select(command.getName(), param, method.extractResultHandler(args)); } } private <E> Object executeForMany(SqlSession sqlSession, Object[] args) { List<E> result; Object param = method.convertArgsToSqlCommandParam(args); if (method.hasRowBounds()) { RowBounds rowBounds = method.extractRowBounds(args); result = sqlSession.<E>selectList(command.getName(), param, rowBounds); } else { result = sqlSession.<E>selectList(command.getName(), param); } // issue #510 Collections & arrays support if (!method.getReturnType().isAssignableFrom(result.getClass())) { if (method.getReturnType().isArray()) { return convertToArray(result); } else { return convertToDeclaredCollection(sqlSession.getConfiguration(), result); } } return result; } private <T> Cursor<T> executeForCursor(SqlSession sqlSession, Object[] args) { Cursor<T> result; Object param = method.convertArgsToSqlCommandParam(args); if (method.hasRowBounds()) { RowBounds rowBounds = method.extractRowBounds(args); result = sqlSession.<T>selectCursor(command.getName(), param, rowBounds); } else { result = sqlSession.<T>selectCursor(command.getName(), param); } return result; } private <E> Object convertToDeclaredCollection(Configuration config, List<E> list) { Object collection = config.getObjectFactory().create(method.getReturnType()); MetaObject metaObject = config.newMetaObject(collection); metaObject.addAll(list); return collection; } @SuppressWarnings("unchecked") private <E> Object convertToArray(List<E> list) { Class<?> arrayComponentType = method.getReturnType().getComponentType(); Object array = Array.newInstance(arrayComponentType, list.size()); if (arrayComponentType.isPrimitive()) { for (int i = 0; i < list.size(); i++) { Array.set(array, i, list.get(i)); } return array; } else { return list.toArray((E[])array); } } private <K, V> Map<K, V> executeForMap(SqlSession sqlSession, Object[] args) { Map<K, V> result; Object param = method.convertArgsToSqlCommandParam(args); if (method.hasRowBounds()) { RowBounds rowBounds = method.extractRowBounds(args); result = sqlSession.<K, V>selectMap(command.getName(), param, method.getMapKey(), rowBounds); } else { result = sqlSession.<K, V>selectMap(command.getName(), param, method.getMapKey()); } return result; } public static class ParamMap<V> extends HashMap<String, V> { private static final long serialVersionUID = -2212268410512043556L; @Override public V get(Object key) { if (!super.containsKey(key)) { throw new BindingException("Parameter '" + key + "' not found. Available parameters are " + keySet()); } return super.get(key); } } public static class SqlCommand { private final String name; private final SqlCommandType type; public SqlCommand(Configuration configuration, Class<?> mapperInterface, Method method) { final String methodName = method.getName(); final Class<?> declaringClass = method.getDeclaringClass(); MappedStatement ms = resolveMappedStatement(mapperInterface, methodName, declaringClass, configuration); if (ms == null) { if (method.getAnnotation(Flush.class) != null) { name = null; type = SqlCommandType.FLUSH; } else { throw new BindingException("Invalid bound statement (not found): " + mapperInterface.getName() + "." + methodName); } } else { name = ms.getId(); type = ms.getSqlCommandType(); if (type == SqlCommandType.UNKNOWN) { throw new BindingException("Unknown execution method for: " + name); } } } public String getName() { return name; } public SqlCommandType getType() { return type; } private MappedStatement resolveMappedStatement(Class<?> mapperInterface, String methodName, Class<?> declaringClass, Configuration configuration) { String statementId = mapperInterface.getName() + "." + methodName; if (configuration.hasStatement(statementId)) { return configuration.getMappedStatement(statementId); } else if (mapperInterface.equals(declaringClass)) { return null; } for (Class<?> superInterface : mapperInterface.getInterfaces()) { if (declaringClass.isAssignableFrom(superInterface)) { MappedStatement ms = resolveMappedStatement(superInterface, methodName, declaringClass, configuration); if (ms != null) { return ms; } } } return null; } } public static class MethodSignature { private final boolean returnsMany; private final boolean returnsMap; private final boolean returnsVoid; private final boolean returnsCursor; private final Class<?> returnType; private final String mapKey; private final Integer resultHandlerIndex; private final Integer rowBoundsIndex; private final ParamNameResolver paramNameResolver; public MethodSignature(Configuration configuration, Class<?> mapperInterface, Method method) { Type resolvedReturnType = TypeParameterResolver.resolveReturnType(method, mapperInterface); if (resolvedReturnType instanceof Class<?>) { this.returnType = (Class<?>) resolvedReturnType; } else if (resolvedReturnType instanceof ParameterizedType) { this.returnType = (Class<?>) ((ParameterizedType) resolvedReturnType).getRawType(); } else { this.returnType = method.getReturnType(); } this.returnsVoid = void.class.equals(this.returnType); this.returnsMany = (configuration.getObjectFactory().isCollection(this.returnType) || this.returnType.isArray()); this.returnsCursor = Cursor.class.equals(this.returnType); this.mapKey = getMapKey(method); this.returnsMap = (this.mapKey != null); this.rowBoundsIndex = getUniqueParamIndex(method, RowBounds.class); this.resultHandlerIndex = getUniqueParamIndex(method, ResultHandler.class); this.paramNameResolver = new ParamNameResolver(configuration, method); } public Object convertArgsToSqlCommandParam(Object[] args) { return paramNameResolver.getNamedParams(args); } public boolean hasRowBounds() { return rowBoundsIndex != null; } public RowBounds extractRowBounds(Object[] args) { return hasRowBounds() ? (RowBounds) args[rowBoundsIndex] : null; } public boolean hasResultHandler() { return resultHandlerIndex != null; } public ResultHandler extractResultHandler(Object[] args) { return hasResultHandler() ? (ResultHandler) args[resultHandlerIndex] : null; } public String getMapKey() { return mapKey; } public Class<?> getReturnType() { return returnType; } public boolean returnsMany() { return returnsMany; } public boolean returnsMap() { return returnsMap; } public boolean returnsVoid() { return returnsVoid; } public boolean returnsCursor() { return returnsCursor; } private Integer getUniqueParamIndex(Method method, Class<?> paramType) { Integer index = null; final Class<?>[] argTypes = method.getParameterTypes(); for (int i = 0; i < argTypes.length; i++) { if (paramType.isAssignableFrom(argTypes[i])) { if (index == null) { index = i; } else { throw new BindingException(method.getName() + " cannot have multiple " + paramType.getSimpleName() + " parameters"); } } } return index; } private String getMapKey(Method method) { String mapKey = null; if (Map.class.isAssignableFrom(method.getReturnType())) { final MapKey mapKeyAnnotation = method.getAnnotation(MapKey.class); if (mapKeyAnnotation != null) { mapKey = mapKeyAnnotation.value(); } } return mapKey; } } https://www.wenjuan.com/z/ammINfa
https://www.wenjuan.com/d/ammINfa
https://www.wenjuan.com/s/ammINfa
https://www.wenjuan.com/t/ammINfa
https://www.wenjuan.com/z/RZzeYjj
https://www.wenjuan.com/d/RZzeYjj
https://www.wenjuan.com/s/RZzeYjj
https://www.wenjuan.com/t/RZzeYjj
https://www.wenjuan.com/z/f2m63mv
https://www.wenjuan.com/d/f2m63mv
https://www.wenjuan.com/s/f2m63mv
https://www.wenjuan.com/t/f2m63mv
https://www.wenjuan.com/z/FBNVfel
https://www.wenjuan.com/d/FBNVfel
https://www.wenjuan.com/s/FBNVfel
https://www.wenjuan.com/t/FBNVfel
https://www.wenjuan.com/z/ZvIjUbM
https://www.wenjuan.com/d/ZvIjUbM
https://www.wenjuan.com/s/ZvIjUbM
https://www.wenjuan.com/t/ZvIjUbM
https://www.wenjuan.com/z/aa2URn8
https://www.wenjuan.com/d/aa2URn8
https://www.wenjuan.com/s/aa2URn8
https://www.wenjuan.com/t/aa2URn8
https://www.wenjuan.com/z/Y3qIR3l
https://www.wenjuan.com/d/Y3qIR3l
https://www.wenjuan.com/s/Y3qIR3l
https://www.wenjuan.com/t/Y3qIR3l
https://www.wenjuan.com/z/MJFr6nA
https://www.wenjuan.com/d/MJFr6nA
https://www.wenjuan.com/s/MJFr6nA
https://www.wenjuan.com/t/MJFr6nA
https://www.wenjuan.com/z/JJF3m2C
https://www.wenjuan.com/d/JJF3m2C
https://www.wenjuan.com/s/JJF3m2C
https://www.wenjuan.com/t/JJF3m2C
https://www.wenjuan.com/z/jm226vV
https://www.wenjuan.com/d/jm226vV
https://www.wenjuan.com/s/jm226vV
https://www.wenjuan.com/t/jm226vV
https://www.wenjuan.com/z/73ua22G
https://www.wenjuan.com/d/73ua22G
https://www.wenjuan.com/s/73ua22G
https://www.wenjuan.com/t/73ua22G
https://www.wenjuan.com/z/vMfIJvv
https://www.wenjuan.com/d/vMfIJvv
https://www.wenjuan.com/s/vMfIJvv
https://www.wenjuan.com/t/vMfIJvv
https://www.wenjuan.com/z/6Rb6Vb2
https://www.wenjuan.com/d/6Rb6Vb2
https://www.wenjuan.com/s/6Rb6Vb2
https://www.wenjuan.com/t/6Rb6Vb2
https://www.wenjuan.com/z/Nfiqyy9
https://www.wenjuan.com/d/Nfiqyy9
https://www.wenjuan.com/s/Nfiqyy9
https://www.wenjuan.com/t/Nfiqyy9
https://www.wenjuan.com/z/mYzqeyH
https://www.wenjuan.com/d/mYzqeyH
https://www.wenjuan.com/s/mYzqeyH
https://www.wenjuan.com/t/mYzqeyH
https://www.wenjuan.com/z/nAruue8
https://www.wenjuan.com/d/nAruue8
https://www.wenjuan.com/s/nAruue8
https://www.wenjuan.com/t/nAruue8
https://www.wenjuan.com/z/3YBZNb0
https://www.wenjuan.com/d/3YBZNb0
https://www.wenjuan.com/s/3YBZNb0
https://www.wenjuan.com/t/3YBZNb0
https://www.wenjuan.com/z/aYnU7n7
https://www.wenjuan.com/d/aYnU7n7
https://www.wenjuan.com/s/aYnU7n7
https://www.wenjuan.com/t/aYnU7n7
https://www.wenjuan.com/z/An6nIv6
https://www.wenjuan.com/d/An6nIv6
https://www.wenjuan.com/s/An6nIv6
https://www.wenjuan.com/t/An6nIv6
https://www.wenjuan.com/z/r6VfEnk
https://www.wenjuan.com/d/r6VfEnk
https://www.wenjuan.com/s/r6VfEnk
https://www.wenjuan.com/t/r6VfEnk
https://www.wenjuan.com/z/IRJ7Bf
https://www.wenjuan.com/d/IRJ7Bf
https://www.wenjuan.com/s/IRJ7Bf
https://www.wenjuan.com/t/IRJ7Bf
https://www.wenjuan.com/z/FBviiiZ
https://www.wenjuan.com/d/FBviiiZ
https://www.wenjuan.com/s/FBviiiZ
https://www.wenjuan.com/t/FBviiiZ
https://www.wenjuan.com/z/N7RZR3
https://www.wenjuan.com/d/N7RZR3
https://www.wenjuan.com/s/N7RZR3
https://www.wenjuan.com/t/N7RZR3
https://www.wenjuan.com/z/zIRjQrV
https://www.wenjuan.com/d/zIRjQrV
https://www.wenjuan.com/s/zIRjQrV
https://www.wenjuan.com/t/zIRjQrV
https://www.wenjuan.com/z/NzYNnq
https://www.wenjuan.com/d/NzYNnq
https://www.wenjuan.com/s/NzYNnq
https://www.wenjuan.com/t/NzYNnq
https://www.wenjuan.com/z/N7fymir
https://www.wenjuan.com/d/N7fymir
https://www.wenjuan.com/s/N7fymir
https://www.wenjuan.com/t/N7fymir
https://www.wenjuan.com/z/iQfUbmy
https://www.wenjuan.com/d/iQfUbmy
https://www.wenjuan.com/s/iQfUbmy
https://www.wenjuan.com/t/iQfUbmy
https://www.wenjuan.com/z/N7NrQvy
https://www.wenjuan.com/d/N7NrQvy
https://www.wenjuan.com/s/N7NrQvy
https://www.wenjuan.com/t/N7NrQvy
https://www.wenjuan.com/z/euiuIvM
https://www.wenjuan.com/d/euiuIvM
https://www.wenjuan.com/s/euiuIvM
https://www.wenjuan.com/t/euiuIvM
https://www.wenjuan.com/z/ZZ7fUvU
https://www.wenjuan.com/d/ZZ7fUvU
https://www.wenjuan.com/s/ZZ7fUvU
https://www.wenjuan.com/t/ZZ7fUvU
https://www.wenjuan.com/z/fiMrUn1
https://www.wenjuan.com/d/fiMrUn1
https://www.wenjuan.com/s/fiMrUn1
https://www.wenjuan.com/t/fiMrUn1
https://www.wenjuan.com/z/iq6bUby
https://www.wenjuan.com/d/iq6bUby
https://www.wenjuan.com/s/iq6bUby
https://www.wenjuan.com/t/iq6bUby
https://www.wenjuan.com/z/JNv2AnH
https://www.wenjuan.com/d/JNv2AnH
https://www.wenjuan.com/s/JNv2AnH
https://www.wenjuan.com/t/JNv2AnH
https://www.wenjuan.com/z/UvUvqe7
https://www.wenjuan.com/d/UvUvqe7
https://www.wenjuan.com/s/UvUvqe7
https://www.wenjuan.com/t/UvUvqe7
https://www.wenjuan.com/z/FBvqee
https://www.wenjuan.com/d/FBvqee
https://www.wenjuan.com/s/FBvqee
https://www.wenjuan.com/t/FBvqee
https://www.wenjuan.com/z/FrqQzaV
https://www.wenjuan.com/d/FrqQzaV
https://www.wenjuan.com/s/FrqQzaV
https://www.wenjuan.com/t/FrqQzaV
https://www.wenjuan.com/z/eQjAZnK
https://www.wenjuan.com/d/eQjAZnK
https://www.wenjuan.com/s/eQjAZnK
https://www.wenjuan.com/t/eQjAZnK
https://www.wenjuan.com/z/zABnUzL
https://www.wenjuan.com/d/zABnUzL
https://www.wenjuan.com/s/zABnUzL
https://www.wenjuan.com/t/zABnUzL
https://www.wenjuan.com/z/fmAFf2a
https://www.wenjuan.com/d/fmAFf2a
https://www.wenjuan.com/s/fmAFf2a
https://www.wenjuan.com/t/fmAFf2a
https://www.wenjuan.com/z/AVJrEf
https://www.wenjuan.com/d/AVJrEf
https://www.wenjuan.com/s/AVJrEf
https://www.wenjuan.com/t/AVJrEf
https://www.wenjuan.com/z/63yeUbH
https://www.wenjuan.com/d/63yeUbH
https://www.wenjuan.com/s/63yeUbH
https://www.wenjuan.com/t/63yeUbH
https://www.wenjuan.com/z/AfQBBjP
https://www.wenjuan.com/d/AfQBBjP
https://www.wenjuan.com/s/AfQBBjP
https://www.wenjuan.com/t/AfQBBjP
https://www.wenjuan.com/z/NvmMNnv
https://www.wenjuan.com/d/NvmMNnv
https://www.wenjuan.com/s/NvmMNnv
https://www.wenjuan.com/t/NvmMNnv
https://www.wenjuan.com/z/q2Qr2yD
https://www.wenjuan.com/d/q2Qr2yD
https://www.wenjuan.com/s/q2Qr2yD
https://www.wenjuan.com/t/q2Qr2yD
https://www.wenjuan.com/z/qQrqmm
https://www.wenjuan.com/d/qQrqmm
https://www.wenjuan.com/s/qQrqmm
https://www.wenjuan.com/t/qQrqmm
https://www.wenjuan.com/z/bqU7Bnn
https://www.wenjuan.com/d/bqU7Bnn
https://www.wenjuan.com/s/bqU7Bnn
https://www.wenjuan.com/t/bqU7Bnn
https://www.wenjuan.com/z/FRR7jeC
https://www.wenjuan.com/d/FRR7jeC
https://www.wenjuan.com/s/FRR7jeC
https://www.wenjuan.com/t/FRR7jeC
https://www.wenjuan.com/z/qEv6nyh
https://www.wenjuan.com/d/qEv6nyh
https://www.wenjuan.com/s/qEv6nyh
https://www.wenjuan.com/t/qEv6nyh
https://www.wenjuan.com/z/QRFBBb1
https://www.wenjuan.com/d/QRFBBb1
https://www.wenjuan.com/s/QRFBBb1
https://www.wenjuan.com/t/QRFBBb1
https://www.wenjuan.com/z/z2M3Mn5
https://www.wenjuan.com/d/z2M3Mn5
https://www.wenjuan.com/s/z2M3Mn5
https://www.wenjuan.com/t/z2M3Mn5
https://www.wenjuan.com/z/qAVbmaz
https://www.wenjuan.com/d/qAVbmaz
https://www.wenjuan.com/s/qAVbmaz
https://www.wenjuan.com/t/qAVbmaz
https://www.wenjuan.com/z/JZNbUr4
https://www.wenjuan.com/d/JZNbUr4
https://www.wenjuan.com/s/JZNbUr4
https://www.wenjuan.com/t/JZNbUr4
https://www.wenjuan.com/z/NZbe2q
https://www.wenjuan.com/d/NZbe2q
https://www.wenjuan.com/s/NZbe2q
https://www.wenjuan.com/t/NZbe2q
https://www.wenjuan.com/z/6ZZNrmA
https://www.wenjuan.com/d/6ZZNrmA
https://www.wenjuan.com/s/6ZZNrmA
https://www.wenjuan.com/t/6ZZNrmA
https://www.wenjuan.com/z/fQNZ3yx
https://www.wenjuan.com/d/fQNZ3yx
https://www.wenjuan.com/s/fQNZ3yx
https://www.wenjuan.com/t/fQNZ3yx
https://www.wenjuan.com/z/NjUjmmF
https://www.wenjuan.com/d/NjUjmmF
https://www.wenjuan.com/s/NjUjmmF
https://www.wenjuan.com/t/NjUjmmF
https://www.wenjuan.com/z/aayyAza
https://www.wenjuan.com/d/aayyAza
https://www.wenjuan.com/s/aayyAza
https://www.wenjuan.com/t/aayyAza
https://www.wenjuan.com/z/aE3AniP
https://www.wenjuan.com/d/aE3AniP
https://www.wenjuan.com/s/aE3AniP
https://www.wenjuan.com/t/aE3AniP
https://www.wenjuan.com/z/eqqQvuO
https://www.wenjuan.com/d/eqqQvuO
https://www.wenjuan.com/s/eqqQvuO
https://www.wenjuan.com/t/eqqQvuO
https://www.wenjuan.com/z/mAZrmmP
https://www.wenjuan.com/d/mAZrmmP
https://www.wenjuan.com/s/mAZrmmP
https://www.wenjuan.com/t/mAZrmmP
https://www.wenjuan.com/z/uAFZNj8
https://www.wenjuan.com/d/uAFZNj8
https://www.wenjuan.com/s/uAFZNj8
https://www.wenjuan.com/t/uAFZNj8
https://www.wenjuan.com/z/Q3am6vF
https://www.wenjuan.com/d/Q3am6vF
https://www.wenjuan.com/s/Q3am6vF
https://www.wenjuan.com/t/Q3am6vF
https://www.wenjuan.com/z/NZbmIr
https://www.wenjuan.com/d/NZbmIr
https://www.wenjuan.com/s/NZbmIr
https://www.wenjuan.com/t/NZbmIr
https://www.wenjuan.com/z/zqqmu2
https://www.wenjuan.com/d/zqqmu2
https://www.wenjuan.com/s/zqqmu2
https://www.wenjuan.com/t/zqqmu2
https://www.wenjuan.com/z/ZBbquyP
https://www.wenjuan.com/d/ZBbquyP
https://www.wenjuan.com/s/ZBbquyP
https://www.wenjuan.com/t/ZBbquyP
https://www.wenjuan.com/z/32euaqQ
https://www.wenjuan.com/d/32euaqQ
https://www.wenjuan.com/s/32euaqQ
https://www.wenjuan.com/t/32euaqQ
https://www.wenjuan.com/z/V3U7Jfe
https://www.wenjuan.com/d/V3U7Jfe
https://www.wenjuan.com/s/V3U7Jfe
https://www.wenjuan.com/t/V3U7Jfe
https://www.wenjuan.com/z/eEBNBzJ
https://www.wenjuan.com/d/eEBNBzJ
https://www.wenjuan.com/s/eEBNBzJ
https://www.wenjuan.com/t/eEBNBzJ
https://www.wenjuan.com/z/UnuQb2sa
https://www.wenjuan.com/d/UnuQb2sa
https://www.wenjuan.com/s/UnuQb2sa
https://www.wenjuan.com/t/UnuQb2sa
https://www.wenjuan.com/z/n6jMryB
https://www.wenjuan.com/d/n6jMryB
https://www.wenjuan.com/s/n6jMryB
https://www.wenjuan.com/t/n6jMryB
https://www.wenjuan.com/z/QrInEbL
https://www.wenjuan.com/d/QrInEbL
https://www.wenjuan.com/s/QrInEbL
https://www.wenjuan.com/t/QrInEbL
https://www.wenjuan.com/z/rmAveia
https://www.wenjuan.com/d/rmAveia
https://www.wenjuan.com/s/rmAveia
https://www.wenjuan.com/t/rmAveia
https://www.wenjuan.com/z/322y6zG
https://www.wenjuan.com/d/322y6zG
https://www.wenjuan.com/s/322y6zG
https://www.wenjuan.com/t/322y6zG
https://www.wenjuan.com/z/uqMv6vC
https://www.wenjuan.com/d/uqMv6vC
https://www.wenjuan.com/s/uqMv6vC
https://www.wenjuan.com/t/uqMv6vC
https://www.wenjuan.com/z/F7zE7rE
https://www.wenjuan.com/d/F7zE7rE
https://www.wenjuan.com/s/F7zE7rE
https://www.wenjuan.com/t/F7zE7rE
https://www.wenjuan.com/z/B7JRz2f
https://www.wenjuan.com/d/B7JRz2f
https://www.wenjuan.com/s/B7JRz2f
https://www.wenjuan.com/t/B7JRz2f
https://www.wenjuan.com/z/RnAzi2c
https://www.wenjuan.com/d/RnAzi2c
https://www.wenjuan.com/s/RnAzi2c
https://www.wenjuan.com/t/RnAzi2c
https://www.wenjuan.com/z/bI73Qz8
https://www.wenjuan.com/d/bI73Qz8
https://www.wenjuan.com/s/bI73Qz8
https://www.wenjuan.com/t/bI73Qz8
https://www.wenjuan.com/z/zM3iQ3Qf
https://www.wenjuan.com/d/zM3iQ3Qf
https://www.wenjuan.com/s/zM3iQ3Qf
https://www.wenjuan.com/t/zM3iQ3Qf
https://www.wenjuan.com/z/JJbIVrI
https://www.wenjuan.com/d/JJbIVrI
https://www.wenjuan.com/s/JJbIVrI
https://www.wenjuan.com/t/JJbIVrI
https://www.wenjuan.com/z/JR322yS
https://www.wenjuan.com/d/JR322yS
https://www.wenjuan.com/s/JR322yS
https://www.wenjuan.com/t/JR322yS
https://www.wenjuan.com/z/zQzYFv3
https://www.wenjuan.com/d/zQzYFv3
https://www.wenjuan.com/s/zQzYFv3
https://www.wenjuan.com/t/zQzYFv3
https://www.wenjuan.com/z/VbqQVnf
https://www.wenjuan.com/d/VbqQVnf
https://www.wenjuan.com/s/VbqQVnf
https://www.wenjuan.com/t/VbqQVnf
https://www.wenjuan.com/z/uiAzMvT
https://www.wenjuan.com/d/uiAzMvT
https://www.wenjuan.com/s/uiAzMvT
https://www.wenjuan.com/t/uiAzMvT
https://www.wenjuan.com/z/EnmuMfL
https://www.wenjuan.com/d/EnmuMfL
https://www.wenjuan.com/s/EnmuMfL
https://www.wenjuan.com/t/EnmuMfL
https://www.wenjuan.com/z/FVfmiyN
https://www.wenjuan.com/d/FVfmiyN
https://www.wenjuan.com/s/FVfmiyN
https://www.wenjuan.com/t/FVfmiyN
https://www.wenjuan.com/z/ZbEnaqW
https://www.wenjuan.com/d/ZbEnaqW
https://www.wenjuan.com/s/ZbEnaqW
https://www.wenjuan.com/t/ZbEnaqW
https://www.wenjuan.com/z/3URV3iL
https://www.wenjuan.com/d/3URV3iL
https://www.wenjuan.com/s/3URV3iL
https://www.wenjuan.com/t/3URV3iL
https://www.wenjuan.com/z/qe6RnuA
https://www.wenjuan.com/d/qe6RnuA
https://www.wenjuan.com/s/qe6RnuA
https://www.wenjuan.com/t/qe6RnuA
https://www.wenjuan.com/z/bYVJZ3g
https://www.wenjuan.com/d/bYVJZ3g
https://www.wenjuan.com/s/bYVJZ3g
https://www.wenjuan.com/t/bYVJZ3g
https://www.wenjuan.com/z/n63EFjY
https://www.wenjuan.com/d/n63EFjY
https://www.wenjuan.com/s/n63EFjY
https://www.wenjuan.com/t/n63EFjY
https://www.wenjuan.com/z/imqa6nR
https://www.wenjuan.com/d/imqa6nR
https://www.wenjuan.com/s/imqa6nR
https://www.wenjuan.com/t/imqa6nR
https://www.wenjuan.com/z/m6JrMj0
https://www.wenjuan.com/d/m6JrMj0
https://www.wenjuan.com/s/m6JrMj0
https://www.wenjuan.com/t/m6JrMj0
https://www.wenjuan.com/z/jYfM32X
https://www.wenjuan.com/d/jYfM32X
https://www.wenjuan.com/s/jYfM32X
https://www.wenjuan.com/t/jYfM32X
https://www.wenjuan.com/z/bI3Ez2
https://www.wenjuan.com/d/bI3Ez2
https://www.wenjuan.com/s/bI3Ez2
https://www.wenjuan.com/t/bI3Ez2
https://www.wenjuan.com/z/RNR732
https://www.wenjuan.com/d/RNR732
https://www.wenjuan.com/s/RNR732
https://www.wenjuan.com/t/RNR732
https://www.wenjuan.com/z/IfEvqq
https://www.wenjuan.com/d/IfEvqq
https://www.wenjuan.com/s/IfEvqq
https://www.wenjuan.com/t/IfEvqq
https://www.wenjuan.com/z/3Ir6zu1
https://www.wenjuan.com/d/3Ir6zu1
https://www.wenjuan.com/s/3Ir6zu1
https://www.wenjuan.com/t/3Ir6zu1
https://www.wenjuan.com/z/ziAjIbV
https://www.wenjuan.com/d/ziAjIbV
https://www.wenjuan.com/s/ziAjIbV
https://www.wenjuan.com/t/ziAjIbV
https://www.wenjuan.com/z/UJVfmy
https://www.wenjuan.com/d/UJVfmy
https://www.wenjuan.com/s/UJVfmy
https://www.wenjuan.com/t/UJVfmy
https://www.wenjuan.com/z/m2AbEju
https://www.wenjuan.com/d/m2AbEju
https://www.wenjuan.com/s/m2AbEju
https://www.wenjuan.com/t/m2AbEju
https://www.wenjuan.com/z/UFRb2uu
https://www.wenjuan.com/d/UFRb2uu
https://www.wenjuan.com/s/UFRb2uu
https://www.wenjuan.com/t/UFRb2uu
https://www.wenjuan.com/z/6R3Yb2z
https://www.wenjuan.com/d/6R3Yb2z
https://www.wenjuan.com/s/6R3Yb2z
https://www.wenjuan.com/t/6R3Yb2z
https://www.wenjuan.com/z/nqQVfag
https://www.wenjuan.com/d/nqQVfag
https://www.wenjuan.com/s/nqQVfag
https://www.wenjuan.com/t/nqQVfag
https://www.wenjuan.com/z/bAZ3iey
https://www.wenjuan.com/d/bAZ3iey
https://www.wenjuan.com/s/bAZ3iey
https://www.wenjuan.com/t/bAZ3iey
https://www.wenjuan.com/z/eUz2QnX
https://www.wenjuan.com/d/eUz2QnX
https://www.wenjuan.com/s/eUz2QnX
https://www.wenjuan.com/t/eUz2QnX
https://www.wenjuan.com/z/2UjeUvt
https://www.wenjuan.com/d/2UjeUvt
https://www.wenjuan.com/s/2UjeUvt
https://www.wenjuan.com/t/2UjeUvt
https://www.wenjuan.com/z/Mn2Ivam
https://www.wenjuan.com/d/Mn2Ivam
https://www.wenjuan.com/s/Mn2Ivam
https://www.wenjuan.com/t/Mn2Ivam
https://www.wenjuan.com/z/rUNrUbB
https://www.wenjuan.com/d/rUNrUbB
https://www.wenjuan.com/s/rUNrUbB
https://www.wenjuan.com/t/rUNrUbB
https://www.wenjuan.com/z/Bbq22y5
https://www.wenjuan.com/d/Bbq22y5
https://www.wenjuan.com/s/Bbq22y5
https://www.wenjuan.com/t/Bbq22y5
https://www.wenjuan.com/z/yeIfi20
https://www.wenjuan.com/d/yeIfi20
https://www.wenjuan.com/s/yeIfi20
https://www.wenjuan.com/t/yeIfi20
https://www.wenjuan.com/z/yaMJvaJ
https://www.wenjuan.com/d/yaMJvaJ
https://www.wenjuan.com/s/yaMJvaJ
https://www.wenjuan.com/t/yaMJvaJ
https://www.wenjuan.com/z/yIzmMbI
https://www.wenjuan.com/d/yIzmMbI
https://www.wenjuan.com/s/yIzmMbI
https://www.wenjuan.com/t/yIzmMbI
https://www.wenjuan.com/z/Zb2emm
https://www.wenjuan.com/d/Zb2emm
https://www.wenjuan.com/s/Zb2emm
https://www.wenjuan.com/t/Zb2emm
https://www.wenjuan.com/z/M32Mnqu
https://www.wenjuan.com/d/M32Mnqu
https://www.wenjuan.com/s/M32Mnqu
https://www.wenjuan.com/t/M32Mnqu
https://www.wenjuan.com/z/Mzqmyi1
https://www.wenjuan.com/d/Mzqmyi1
https://www.wenjuan.com/s/Mzqmyi1
https://www.wenjuan.com/t/Mzqmyi1
https://www.wenjuan.com/z/eInMva8
https://www.wenjuan.com/d/eInMva8
https://www.wenjuan.com/s/eInMva8
https://www.wenjuan.com/t/eInMva8
https://www.wenjuan.com/z/bmY73yK
https://www.wenjuan.com/d/bmY73yK
https://www.wenjuan.com/s/bmY73yK
https://www.wenjuan.com/t/bmY73yK
https://www.wenjuan.com/z/bEF3Aj0
https://www.wenjuan.com/d/bEF3Aj0
https://www.wenjuan.com/s/bEF3Aj0
https://www.wenjuan.com/t/bEF3Aj0
https://www.wenjuan.com/z/E3y22yz
https://www.wenjuan.com/d/E3y22yz
https://www.wenjuan.com/s/E3y22yz
https://www.wenjuan.com/t/E3y22yz
https://www.wenjuan.com/z/BNf6Vv1
https://www.wenjuan.com/d/BNf6Vv1
https://www.wenjuan.com/s/BNf6Vv1
https://www.wenjuan.com/t/BNf6Vv1
https://www.wenjuan.com/z/6vU36zP
https://www.wenjuan.com/d/6vU36zP
https://www.wenjuan.com/s/6vU36zP
https://www.wenjuan.com/t/6vU36zP
https://www.wenjuan.com/z/ZvMvuae
https://www.wenjuan.com/d/ZvMvuae
https://www.wenjuan.com/s/ZvMvuae
https://www.wenjuan.com/t/ZvMvuae
https://www.wenjuan.com/z/nuqURjS
https://www.wenjuan.com/d/nuqURjS
https://www.wenjuan.com/s/nuqURjS
https://www.wenjuan.com/t/nuqURjS
https://www.wenjuan.com/z/vMF3eu1
https://www.wenjuan.com/d/vMF3eu1
https://www.wenjuan.com/s/vMF3eu1
https://www.wenjuan.com/t/vMF3eu1
https://www.wenjuan.com/z/RfAFraI
https://www.wenjuan.com/d/RfAFraI
https://www.wenjuan.com/s/RfAFraI
https://www.wenjuan.com/t/RfAFraI
https://www.wenjuan.com/z/MZFFruS
https://www.wenjuan.com/d/MZFFruS
https://www.wenjuan.com/s/MZFFruS
https://www.wenjuan.com/t/MZFFruS
https://www.wenjuan.com/z/rMRbMv9
https://www.wenjuan.com/d/rMRbMv9
https://www.wenjuan.com/s/rMRbMv9
https://www.wenjuan.com/t/rMRbMv9
https://www.wenjuan.com/z/77BbEfu
https://www.wenjuan.com/d/77BbEfu
https://www.wenjuan.com/s/77BbEfu
https://www.wenjuan.com/t/77BbEfu
https://www.wenjuan.com/z/NrUfQvo
https://www.wenjuan.com/d/NrUfQvo
https://www.wenjuan.com/s/NrUfQvo
https://www.wenjuan.com/t/NrUfQvo
https://www.wenjuan.com/z/Q3Qz6vR
https://www.wenjuan.com/d/Q3Qz6vR
https://www.wenjuan.com/s/Q3Qz6vR
https://www.wenjuan.com/t/Q3Qz6vR
https://www.wenjuan.com/z/jAZNjiW
https://www.wenjuan.com/d/jAZNjiW
https://www.wenjuan.com/s/jAZNjiW
https://www.wenjuan.com/t/jAZNjiW
https://www.wenjuan.com/z/zYrYFba
https://www.wenjuan.com/d/zYrYFba
https://www.wenjuan.com/s/zYrYFba
https://www.wenjuan.com/t/zYrYFba
https://www.wenjuan.com/z/ieuaIfK
https://www.wenjuan.com/d/ieuaIfK
https://www.wenjuan.com/s/ieuaIfK
https://www.wenjuan.com/t/ieuaIfK
https://www.wenjuan.com/z/ji6vqan
https://www.wenjuan.com/d/ji6vqan
https://www.wenjuan.com/s/ji6vqan
https://www.wenjuan.com/t/ji6vqan
https://www.wenjuan.com/z/bieaei
https://www.wenjuan.com/d/bieaei
https://www.wenjuan.com/s/bieaei
https://www.wenjuan.com/t/bieaei
https://www.wenjuan.com/z/qUr2ErE
https://www.wenjuan.com/d/qUr2ErE
https://www.wenjuan.com/s/qUr2ErE
https://www.wenjuan.com/t/qUr2ErE
https://www.wenjuan.com/z/iERny2z
https://www.wenjuan.com/d/iERny2z
https://www.wenjuan.com/s/iERny2z
https://www.wenjuan.com/t/iERny2z
https://www.wenjuan.com/z/uAFZrmD
https://www.wenjuan.com/d/uAFZrmD
https://www.wenjuan.com/s/uAFZrmD
https://www.wenjuan.com/t/uAFZrmD
https://www.wenjuan.com/z/b6rEjqa
https://www.wenjuan.com/d/b6rEjqa
https://www.wenjuan.com/s/b6rEjqa
https://www.wenjuan.com/t/b6rEjqa
https://www.wenjuan.com/z/MvAFF3f
https://www.wenjuan.com/d/MvAFF3f
https://www.wenjuan.com/s/MvAFF3f
https://www.wenjuan.com/t/MvAFF3f
https://www.wenjuan.com/z/VJnYBzb
https://www.wenjuan.com/d/VJnYBzb
https://www.wenjuan.com/s/VJnYBzb
https://www.wenjuan.com/t/VJnYBzb
https://www.wenjuan.com/z/zYrIBrP
https://www.wenjuan.com/d/zYrIBrP
https://www.wenjuan.com/s/zYrIBrP
https://www.wenjuan.com/t/zYrIBrP
https://www.wenjuan.com/z/ZzABvqh
https://www.wenjuan.com/d/ZzABvqh
https://www.wenjuan.com/s/ZzABvqh
https://www.wenjuan.com/t/ZzABvqh
https://www.wenjuan.com/z/EreQN3g
https://www.wenjuan.com/d/EreQN3g
https://www.wenjuan.com/s/EreQN3g
https://www.wenjuan.com/t/EreQN3g
https://www.wenjuan.com/z/63A3mey
https://www.wenjuan.com/d/63A3mey
https://www.wenjuan.com/s/63A3mey
https://www.wenjuan.com/t/63A3mey
https://www.wenjuan.com/z/rQ7jEz
https://www.wenjuan.com/d/rQ7jEz
https://www.wenjuan.com/s/rQ7jEz
https://www.wenjuan.com/t/rQ7jEz
https://www.wenjuan.com/z/367zIfJ
https://www.wenjuan.com/d/367zIfJ
https://www.wenjuan.com/s/367zIfJ
https://www.wenjuan.com/t/367zIfJ
https://www.wenjuan.com/z/VZJrYr5
https://www.wenjuan.com/d/VZJrYr5
https://www.wenjuan.com/s/VZJrYr5
https://www.wenjuan.com/t/VZJrYr5
https://www.wenjuan.com/z/vuy6n2W
https://www.wenjuan.com/d/vuy6n2W
https://www.wenjuan.com/s/vuy6n2W
https://www.wenjuan.com/t/vuy6n2W
https://www.wenjuan.com/z/2iaa2uK
https://www.wenjuan.com/d/2iaa2uK
https://www.wenjuan.com/s/2iaa2uK
https://www.wenjuan.com/t/2iaa2uK
https://www.wenjuan.com/z/3uEvu2g
https://www.wenjuan.com/d/3uEvu2g
https://www.wenjuan.com/s/3uEvu2g
https://www.wenjuan.com/t/3uEvu2g
https://www.wenjuan.com/z/vQfEzmu
https://www.wenjuan.com/d/vQfEzmu
https://www.wenjuan.com/s/vQfEzmu
https://www.wenjuan.com/t/vQfEzmu
https://www.wenjuan.com/z/FbUJJjL
https://www.wenjuan.com/d/FbUJJjL
https://www.wenjuan.com/s/FbUJJjL
https://www.wenjuan.com/t/FbUJJjL
https://www.wenjuan.com/z/YNRrU3
https://www.wenjuan.com/d/YNRrU3
https://www.wenjuan.com/s/YNRrU3
https://www.wenjuan.com/t/YNRrU3
https://www.wenjuan.com/z/MfYBJn0
https://www.wenjuan.com/d/MfYBJn0
https://www.wenjuan.com/s/MfYBJn0
https://www.wenjuan.com/t/MfYBJn0
https://www.wenjuan.com/z/6FN7Bf
https://www.wenjuan.com/d/6FN7Bf
https://www.wenjuan.com/s/6FN7Bf
https://www.wenjuan.com/t/6FN7Bf
https://www.wenjuan.com/z/ER7vyyy
https://www.wenjuan.com/d/ER7vyyy
https://www.wenjuan.com/s/ER7vyyy
https://www.wenjuan.com/t/ER7vyyy
https://www.wenjuan.com/z/reEBfqT
https://www.wenjuan.com/d/reEBfqT
https://www.wenjuan.com/s/reEBfqT
https://www.wenjuan.com/t/reEBfqT
https://www.wenjuan.com/z/jUfIZb6
https://www.wenjuan.com/d/jUfIZb6
https://www.wenjuan.com/s/jUfIZb6
https://www.wenjuan.com/t/jUfIZb6
https://www.wenjuan.com/z/ERBVzuC
https://www.wenjuan.com/d/ERBVzuC
https://www.wenjuan.com/s/ERBVzuC
https://www.wenjuan.com/t/ERBVzuC
https://www.wenjuan.com/z/vqyMZzv
https://www.wenjuan.com/d/vqyMZzv
https://www.wenjuan.com/s/vqyMZzv
https://www.wenjuan.com/t/vqyMZzv
https://www.wenjuan.com/z/QNny6n9
https://www.wenjuan.com/d/QNny6n9
https://www.wenjuan.com/s/QNny6n9
https://www.wenjuan.com/t/QNny6n9
https://www.wenjuan.com/z/Zjm6R3p
https://www.wenjuan.com/d/Zjm6R3p
https://www.wenjuan.com/s/Zjm6R3p
https://www.wenjuan.com/t/Zjm6R3p
https://www.wenjuan.com/z/EVzUniB
https://www.wenjuan.com/d/EVzUniB
https://www.wenjuan.com/s/EVzUniB
https://www.wenjuan.com/t/EVzUniB
https://www.wenjuan.com/z/b2uuU3Y
https://www.wenjuan.com/d/b2uuU3Y
https://www.wenjuan.com/s/b2uuU3Y
https://www.wenjuan.com/t/b2uuU3Y
https://www.wenjuan.com/z/aIZzm2L
https://www.wenjuan.com/d/aIZzm2L
https://www.wenjuan.com/s/aIZzm2L
https://www.wenjuan.com/t/aIZzm2L
https://www.wenjuan.com/z/yIBnQr
https://www.wenjuan.com/d/yIBnQr
https://www.wenjuan.com/s/yIBnQr
https://www.wenjuan.com/t/yIBnQr
https://www.wenjuan.com/z/ZzA3q2Q
https://www.wenjuan.com/d/ZzA3q2Q
https://www.wenjuan.com/s/ZzA3q2Q
https://www.wenjuan.com/t/ZzA3q2Q
https://www.wenjuan.com/z/VN3yUvk
https://www.wenjuan.com/d/VN3yUvk
https://www.wenjuan.com/s/VN3yUvk
https://www.wenjuan.com/t/VN3yUvk
https://www.wenjuan.com/z/eMrYn29
https://www.wenjuan.com/d/eMrYn29
https://www.wenjuan.com/s/eMrYn29
https://www.wenjuan.com/t/eMrYn29
https://www.wenjuan.com/z/ZRrmAjK
https://www.wenjuan.com/d/ZRrmAjK
https://www.wenjuan.com/s/ZRrmAjK
https://www.wenjuan.com/t/ZRrmAjK
https://www.wenjuan.com/z/6Fve6ry
https://www.wenjuan.com/d/6Fve6ry
https://www.wenjuan.com/s/6Fve6ry
https://www.wenjuan.com/t/6Fve6ry
https://www.wenjuan.com/z/fmyeqa2
https://www.wenjuan.com/d/fmyeqa2
https://www.wenjuan.com/s/fmyeqa2
https://www.wenjuan.com/t/fmyeqa2
https://www.wenjuan.com/z/rqMNriX
https://www.wenjuan.com/d/rqMNriX
https://www.wenjuan.com/s/rqMNriX
https://www.wenjuan.com/t/rqMNriX
https://www.wenjuan.com/z/biQ7BfS
https://www.wenjuan.com/d/biQ7BfS
https://www.wenjuan.com/s/biQ7BfS
https://www.wenjuan.com/t/biQ7BfS
https://www.wenjuan.com/z/jIzmYrW
https://www.wenjuan.com/d/jIzmYrW
https://www.wenjuan.com/s/jIzmYrW
https://www.wenjuan.com/t/jIzmYrW
https://www.wenjuan.com/z/BZNfYzn
https://www.wenjuan.com/d/BZNfYzn
https://www.wenjuan.com/s/BZNfYzn
https://www.wenjuan.com/t/BZNfYzn
https://www.wenjuan.com/z/YRvYn2
https://www.wenjuan.com/d/YRvYn2
https://www.wenjuan.com/s/YRvYn2
https://www.wenjuan.com/t/YRvYn2
https://www.wenjuan.com/z/ZVbyEj
https://www.wenjuan.com/d/ZVbyEj
https://www.wenjuan.com/s/ZVbyEj
https://www.wenjuan.com/t/ZVbyEj
https://www.wenjuan.com/z/qmaa63x
https://www.wenjuan.com/d/qmaa63x
https://www.wenjuan.com/s/qmaa63x
https://www.wenjuan.com/t/qmaa63x
https://www.wenjuan.com/z/UfAnMvv
https://www.wenjuan.com/d/UfAnMvv
https://www.wenjuan.com/s/UfAnMvv
https://www.wenjuan.com/t/UfAnMvv
https://www.wenjuan.com/z/IRVZZz
https://www.wenjuan.com/d/IRVZZz
https://www.wenjuan.com/s/IRVZZz
https://www.wenjuan.com/t/IRVZZz
https://www.wenjuan.com/z/RV7zIbU
https://www.wenjuan.com/d/RV7zIbU
https://www.wenjuan.com/s/RV7zIbU
https://www.wenjuan.com/t/RV7zIbU
https://www.wenjuan.com/z/AvueMvl
https://www.wenjuan.com/d/AvueMvl
https://www.wenjuan.com/s/AvueMvl
https://www.wenjuan.com/t/AvueMvl
https://www.wenjuan.com/z/IBz6fuW
https://www.wenjuan.com/d/IBz6fuW
https://www.wenjuan.com/s/IBz6fuW
https://www.wenjuan.com/t/IBz6fuW
https://www.wenjuan.com/z/maUFNvF
https://www.wenjuan.com/d/maUFNvF
https://www.wenjuan.com/s/maUFNvF
https://www.wenjuan.com/t/maUFNvF
https://www.wenjuan.com/z/mmQv2ih
https://www.wenjuan.com/d/mmQv2ih
https://www.wenjuan.com/s/mmQv2ih
https://www.wenjuan.com/t/mmQv2ih
https://www.wenjuan.com/z/EFjQ3u
https://www.wenjuan.com/d/EFjQ3u
https://www.wenjuan.com/s/EFjQ3u
https://www.wenjuan.com/t/EFjQ3u
https://www.wenjuan.com/z/rAZjia
https://www.wenjuan.com/d/rAZjia
https://www.wenjuan.com/s/rAZjia
https://www.wenjuan.com/t/rAZjia
https://www.wenjuan.com/z/Qbei2mA
https://www.wenjuan.com/d/Qbei2mA
https://www.wenjuan.com/s/Qbei2mA
https://www.wenjuan.com/t/Qbei2mA
https://www.wenjuan.com/z/QFBjUrO
https://www.wenjuan.com/d/QFBjUrO
https://www.wenjuan.com/s/QFBjUrO
https://www.wenjuan.com/t/QFBjUrO
https://www.wenjuan.com/z/677fam7
https://www.wenjuan.com/d/677fam7
https://www.wenjuan.com/s/677fam7
https://www.wenjuan.com/t/677fam7
https://www.wenjuan.com/z/IVRfiy
https://www.wenjuan.com/d/IVRfiy
https://www.wenjuan.com/s/IVRfiy
https://www.wenjuan.com/t/IVRfiy
https://www.wenjuan.com/z/7jM3Qvx
https://www.wenjuan.com/d/7jM3Qvx
https://www.wenjuan.com/s/7jM3Qvx
https://www.wenjuan.com/t/7jM3Qvx
https://www.wenjuan.com/z/RrQfQrp
https://www.wenjuan.com/d/RrQfQrp
https://www.wenjuan.com/s/RrQfQrp
https://www.wenjuan.com/t/RrQfQrp
https://www.wenjuan.com/z/uyMfYj1
https://www.wenjuan.com/d/uyMfYj1
https://www.wenjuan.com/s/uyMfYj1
https://www.wenjuan.com/t/uyMfYj1
https://www.wenjuan.com/z/BNbE3m
https://www.wenjuan.com/d/BNbE3m
https://www.wenjuan.com/s/BNbE3m
https://www.wenjuan.com/t/BNbE3m
https://www.wenjuan.com/z/MnyAnu7
https://www.wenjuan.com/d/MnyAnu7
https://www.wenjuan.com/s/MnyAnu7
https://www.wenjuan.com/t/MnyAnu7
https://www.wenjuan.com/z/F7beUbV
https://www.wenjuan.com/d/F7beUbV
https://www.wenjuan.com/s/F7beUbV
https://www.wenjuan.com/t/F7beUbV
https://www.wenjuan.com/z/qAJBvql
https://www.wenjuan.com/d/qAJBvql
https://www.wenjuan.com/s/qAJBvql
https://www.wenjuan.com/t/qAJBvql
https://www.wenjuan.com/z/Nn2Qnic
https://www.wenjuan.com/d/Nn2Qnic
https://www.wenjuan.com/s/Nn2Qnic
https://www.wenjuan.com/t/Nn2Qnic
https://www.wenjuan.com/z/nEBvYv7
https://www.wenjuan.com/d/nEBvYv7
https://www.wenjuan.com/s/nEBvYv7
https://www.wenjuan.com/t/nEBvYv7
https://www.wenjuan.com/z/Z7FjYvv
https://www.wenjuan.com/d/Z7FjYvv
https://www.wenjuan.com/s/Z7FjYvv
https://www.wenjuan.com/t/Z7FjYvv
https://www.wenjuan.com/z/vuY7nyB
https://www.wenjuan.com/d/vuY7nyB
https://www.wenjuan.com/s/vuY7nyB
https://www.wenjuan.com/t/vuY7nyB
https://www.wenjuan.com/z/7ju2Aj1
https://www.wenjuan.com/d/7ju2Aj1
https://www.wenjuan.com/s/7ju2Aj1
https://www.wenjuan.com/t/7ju2Aj1
https://www.wenjuan.com/z/RNvueaL
https://www.wenjuan.com/d/RNvueaL
https://www.wenjuan.com/s/RNvueaL
https://www.wenjuan.com/t/RNvueaL
https://www.wenjuan.com/z/vaIjEbg
https://www.wenjuan.com/d/vaIjEbg
https://www.wenjuan.com/s/vaIjEbg
https://www.wenjuan.com/t/vaIjEbg
https://www.wenjuan.com/z/6zqayek
https://www.wenjuan.com/d/6zqayek
https://www.wenjuan.com/s/6zqayek
https://www.wenjuan.com/t/6zqayek
https://www.wenjuan.com/z/uiuAfqB
https://www.wenjuan.com/d/uiuAfqB
https://www.wenjuan.com/s/uiuAfqB
https://www.wenjuan.com/t/uiuAfqB
https://www.wenjuan.com/z/e2MNzyp
https://www.wenjuan.com/d/e2MNzyp
https://www.wenjuan.com/s/e2MNzyp
https://www.wenjuan.com/t/e2MNzyp
https://www.wenjuan.com/z/uqUnii
https://www.wenjuan.com/d/uqUnii
https://www.wenjuan.com/s/uqUnii
https://www.wenjuan.com/t/uqUnii
https://www.wenjuan.com/z/I3qiQvI
https://www.wenjuan.com/d/I3qiQvI
https://www.wenjuan.com/s/I3qiQvI
https://www.wenjuan.com/t/I3qiQvI
https://www.wenjuan.com/z/B7RBf2n
https://www.wenjuan.com/d/B7RBf2n
https://www.wenjuan.com/s/B7RBf2n
https://www.wenjuan.com/t/B7RBf2n
https://www.wenjuan.com/z/BBVfu2H
https://www.wenjuan.com/d/BBVfu2H
https://www.wenjuan.com/s/BBVfu2H
https://www.wenjuan.com/t/BBVfu2H
https://www.wenjuan.com/z/beyMveS
https://www.wenjuan.com/d/beyMveS
https://www.wenjuan.com/s/beyMveS
https://www.wenjuan.com/t/beyMveS
https://www.wenjuan.com/z/vqUfEjz
https://www.wenjuan.com/d/vqUfEjz
https://www.wenjuan.com/s/vqUfEjz
https://www.wenjuan.com/t/vqUfEjz
https://www.wenjuan.com/z/yuauU3Y
https://www.wenjuan.com/d/yuauU3Y
https://www.wenjuan.com/s/yuauU3Y
https://www.wenjuan.com/t/yuauU3Y
https://www.wenjuan.com/z/FneAfyI
https://www.wenjuan.com/d/FneAfyI
https://www.wenjuan.com/s/FneAfyI
https://www.wenjuan.com/t/FneAfyI
https://www.wenjuan.com/z/qY3Uvig
https://www.wenjuan.com/d/qY3Uvig
https://www.wenjuan.com/s/qY3Uvig
https://www.wenjuan.com/t/qY3Uvig
https://www.wenjuan.com/z/6f2E7z
https://www.wenjuan.com/d/6f2E7z
https://www.wenjuan.com/s/6f2E7z
https://www.wenjuan.com/t/6f2E7z
https://www.wenjuan.com/z/jy6rqed
https://www.wenjuan.com/d/jy6rqed
https://www.wenjuan.com/s/jy6rqed
https://www.wenjuan.com/t/jy6rqed
https://www.wenjuan.com/z/Nv2e2me
https://www.wenjuan.com/d/Nv2e2me
https://www.wenjuan.com/s/Nv2e2me
https://www.wenjuan.com/t/Nv2e2me
https://www.wenjuan.com/z/FbaAvma
https://www.wenjuan.com/d/FbaAvma
https://www.wenjuan.com/s/FbaAvma
https://www.wenjuan.com/t/FbaAvma
https://www.wenjuan.com/z/YzMzea0
https://www.wenjuan.com/d/YzMzea0
https://www.wenjuan.com/s/YzMzea0
https://www.wenjuan.com/t/YzMzea0
https://www.wenjuan.com/z/bmmQJr
https://www.wenjuan.com/d/bmmQJr
https://www.wenjuan.com/s/bmmQJr
https://www.wenjuan.com/t/bmmQJr
https://www.wenjuan.com/z/mM3eYzV
https://www.wenjuan.com/d/mM3eYzV
https://www.wenjuan.com/s/mM3eYzV
https://www.wenjuan.com/t/mM3eYzV
https://www.wenjuan.com/z/FFR7vak
https://www.wenjuan.com/d/FFR7vak
https://www.wenjuan.com/s/FFR7vak
https://www.wenjuan.com/t/FFR7vak
https://www.wenjuan.com/z/YvQVJzh
https://www.wenjuan.com/d/YvQVJzh
https://www.wenjuan.com/s/YvQVJzh
https://www.wenjuan.com/t/YvQVJzh
https://www.wenjuan.com/z/3aQFrug
https://www.wenjuan.com/d/3aQFrug
https://www.wenjuan.com/s/3aQFrug
https://www.wenjuan.com/t/3aQFrug
https://www.wenjuan.com/z/fmEZNft
https://www.wenjuan.com/d/fmEZNft
https://www.wenjuan.com/s/fmEZNft
https://www.wenjuan.com/t/fmEZNft
https://www.wenjuan.com/z/eQ7BFzw
https://www.wenjuan.com/d/eQ7BFzw
https://www.wenjuan.com/s/eQ7BFzw
https://www.wenjuan.com/t/eQ7BFzw
https://www.wenjuan.com/z/3Uv6zyc
https://www.wenjuan.com/d/3Uv6zyc
https://www.wenjuan.com/s/3Uv6zyc
https://www.wenjuan.com/t/3Uv6zyc
https://www.wenjuan.com/z/vau6fuy
https://www.wenjuan.com/d/vau6fuy
https://www.wenjuan.com/s/vau6fuy
https://www.wenjuan.com/t/vau6fuy
https://www.wenjuan.com/z/aMvUniE
https://www.wenjuan.com/d/aMvUniE
https://www.wenjuan.com/s/aMvUniE
https://www.wenjuan.com/t/aMvUniE
https://www.wenjuan.com/z/UnayMv8
https://www.wenjuan.com/d/UnayMv8
https://www.wenjuan.com/s/UnayMv8
https://www.wenjuan.com/t/UnayMv8
https://www.wenjuan.com/z/ARNZNnK
https://www.wenjuan.com/d/ARNZNnK
https://www.wenjuan.com/s/ARNZNnK
https://www.wenjuan.com/t/ARNZNnK
https://www.wenjuan.com/z/QneIFj5
https://www.wenjuan.com/d/QneIFj5
https://www.wenjuan.com/s/QneIFj5
https://www.wenjuan.com/t/QneIFj5
https://www.wenjuan.com/z/fENnqyP
https://www.wenjuan.com/d/fENnqyP
https://www.wenjuan.com/s/fENnqyP
https://www.wenjuan.com/t/fENnqyP
https://www.wenjuan.com/z/biqyMrQ
https://www.wenjuan.com/d/biqyMrQ
https://www.wenjuan.com/s/biqyMrQ
https://www.wenjuan.com/t/biqyMrQ
https://www.wenjuan.com/z/2INJZjp
https://www.wenjuan.com/d/2INJZjp
https://www.wenjuan.com/s/2INJZjp
https://www.wenjuan.com/t/2INJZjp
https://www.wenjuan.com/z/BFr6Rrs
https://www.wenjuan.com/d/BFr6Rrs
https://www.wenjuan.com/s/BFr6Rrs
https://www.wenjuan.com/t/BFr6Rrs
https://www.wenjuan.com/z/mAJNRju
https://www.wenjuan.com/d/mAJNRju
https://www.wenjuan.com/s/mAJNRju
https://www.wenjuan.com/t/mAJNRju
https://www.wenjuan.com/z/JrmUJzC
https://www.wenjuan.com/d/JrmUJzC
https://www.wenjuan.com/s/JrmUJzC
https://www.wenjuan.com/t/JrmUJzC
https://www.wenjuan.com/z/M3qA3e
https://www.wenjuan.com/d/M3qA3e
https://www.wenjuan.com/s/M3qA3e
https://www.wenjuan.com/t/M3qA3e
https://www.wenjuan.com/z/MFnqamR
https://www.wenjuan.com/d/MFnqamR
https://www.wenjuan.com/s/MFnqamR
https://www.wenjuan.com/t/MFnqamR
https://www.wenjuan.com/z/by6Fn2l
https://www.wenjuan.com/d/by6Fn2l
https://www.wenjuan.com/s/by6Fn2l
https://www.wenjuan.com/t/by6Fn2l
https://www.wenjuan.com/z/iUfu2am
https://www.wenjuan.com/d/iUfu2am
https://www.wenjuan.com/s/iUfu2am
https://www.wenjuan.com/t/iUfu2am
https://www.wenjuan.com/z/RNvaQnH
https://www.wenjuan.com/d/RNvaQnH
https://www.wenjuan.com/s/RNvaQnH
https://www.wenjuan.com/t/RNvaQnH
https://www.wenjuan.com/z/y26NRzS
https://www.wenjuan.com/d/y26NRzS
https://www.wenjuan.com/s/y26NRzS
https://www.wenjuan.com/t/y26NRzS
https://www.wenjuan.com/z/Z3AjMnG
https://www.wenjuan.com/d/Z3AjMnG
https://www.wenjuan.com/s/Z3AjMnG
https://www.wenjuan.com/t/Z3AjMnG
https://www.wenjuan.com/z/NJnea26
https://www.wenjuan.com/d/NJnea26
https://www.wenjuan.com/s/NJnea26
https://www.wenjuan.com/t/NJnea26
https://www.wenjuan.com/z/VrqUjem
https://www.wenjuan.com/d/VrqUjem
https://www.wenjuan.com/s/VrqUjem
https://www.wenjuan.com/t/VrqUjem
https://www.wenjuan.com/z/n6FFR3
https://www.wenjuan.com/d/n6FFR3
https://www.wenjuan.com/s/n6FFR3
https://www.wenjuan.com/t/n6FFR3
https://www.wenjuan.com/z/eiQB7zx
https://www.wenjuan.com/d/eiQB7zx
https://www.wenjuan.com/s/eiQB7zx
https://www.wenjuan.com/t/eiQB7zx
https://www.wenjuan.com/z/3Y7R73
https://www.wenjuan.com/d/3Y7R73
https://www.wenjuan.com/s/3Y7R73
https://www.wenjuan.com/t/3Y7R73
https://www.wenjuan.com/z/NfEFbu
https://www.wenjuan.com/d/NfEFbu
https://www.wenjuan.com/s/NfEFbu
https://www.wenjuan.com/t/NfEFbu
https://www.wenjuan.com/z/UFreaaE
https://www.wenjuan.com/d/UFreaaE
https://www.wenjuan.com/s/UFreaaE
https://www.wenjuan.com/t/UFreaaE
https://www.wenjuan.com/z/3iyIZra
https://www.wenjuan.com/d/3iyIZra
https://www.wenjuan.com/s/3iyIZra
https://www.wenjuan.com/t/3iyIZra
https://www.wenjuan.com/z/iiE7fm6
https://www.wenjuan.com/d/iiE7fm6
https://www.wenjuan.com/s/iiE7fm6
https://www.wenjuan.com/t/iiE7fm6
https://www.wenjuan.com/z/UVjYvyA
https://www.wenjuan.com/d/UVjYvyA
https://www.wenjuan.com/s/UVjYvyA
https://www.wenjuan.com/t/UVjYvyA
https://www.wenjuan.com/z/ZNRFVbj
https://www.wenjuan.com/d/ZNRFVbj
https://www.wenjuan.com/s/ZNRFVbj
https://www.wenjuan.com/t/ZNRFVbj
https://www.wenjuan.com/z/yEZvQj
https://www.wenjuan.com/d/yEZvQj
https://www.wenjuan.com/s/yEZvQj
https://www.wenjuan.com/t/yEZvQj
https://www.wenjuan.com/z/qEbaUzc
https://www.wenjuan.com/d/qEbaUzc
https://www.wenjuan.com/s/qEbaUzc
https://www.wenjuan.com/t/qEbaUzc
https://www.wenjuan.com/z/6BJZVvf
https://www.wenjuan.com/d/6BJZVvf
https://www.wenjuan.com/s/6BJZVvf
https://www.wenjuan.com/t/6BJZVvf
https://www.wenjuan.com/z/BfInei6
https://www.wenjuan.com/d/BfInei6
https://www.wenjuan.com/s/BfInei6
https://www.wenjuan.com/t/BfInei6
复制代码
- 基于SpringBoot实现AOP+jdk/CGlib动态代理详解
- Spring架构详解之动态代理的实现原理
- Spring AOP详解 、 JDK动态代理、CGLib动态代理
- MyBatis输入映射、输出映射、动态SQL、关联关系、Spring集成加强笔记
- spring 集成mybatis动态设置数据源,实现读写分离
- 【spring基础】AOP概念与动态代理详解
- Spring5系列完整学习笔记以及相关代码(含Spring基本配置,IoC,AOP思想,依赖注入,注解开发Spring,静态/动态代理模式,MyBatis整合以及相关代码案例)
- Quartz学习——SSMM(Spring+SpringMVC+Mybatis+Mysql)和Quartz集成详解(四)
- Spring AOP详解 、 JDK动态代理、CGLib动态代理
- mybatis3整合spring4-采用mapper动态代理的方式开发Dao
- SpringBoot+Mybatis中使用动态代理方式动态切换datasource
- Spring AOP详解 、 JDK动态代理、CGLib动态代理
- (转) Quartz学习——SSMM(Spring+SpringMVC+Mybatis+Mysql)和Quartz集成详解(四)
- Mybatis(五)Spring整合Mybatis之mapper动态代理开发
- 详解MyBatis开发Dao层的两种方式(Mapper动态代理方式)
- Quartz学习——SSMM(Spring+SpringMVC+Mybatis+Mysql)和Quartz集成详解(四)
- Quartz学习——SSMM(Spring+SpringMVC+Mybatis+Mysql)和Quartz集成详解(四)
- MyBatis Mapper动态代理详解
- [置顶] Quartz学习——SSMM(Spring+SpringMVC+Mybatis+Mysql)和Quartz集成详解(四)
- SpringBoot入门-19(springboot集成mybatis注解形式增删查改properties配置,利用《script》实现动态SQL)