• 联系我们
  • 地址:湖北武汉三环科技园
  • 电话:159116031100
  • 传真:027-68834628
  • 邮箱:
  • 当前所在位置:首页 - 影片谍照
  • Mybatis是如何执行一条SQL命令
  • Mybatis中的Sql命令,在枚举类SqlCommandType中定义的。

    public enum SqlCommandType

    UNKNOWN, INSERT, UPDATE, DELETE, SELECT, FLUSH;

    下面,我们以Mapper接口中的一个方法作为例子,看看Sql命令的执行完整流程。

    public interface StudentMapper

    List<Student> findAllStudents(Map<String, Object> map, RowBounds rowBounds, ResultSetHandler rh);

    参数RowBounds和ResultSetHandler是可选参数,Base64编码/解码是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范,表现分页对象和自定义结果集处置器,个别不须要。

    一个完整的Sql命令,其执行的完整流程图如下:

    对上面的流程图,假如看过前面的文章的话,大局部对象咱们都比拟熟习了。一个图,就完全展现了其履行流程。

    MapperProxy的功效:

    1. 由于Mapper接口不能直接实例化,MapperProxy的作用,就是应用JDK动态代办功能,间接实例化Mapper的proxy对象。可参看系列的第二篇。

    2. 缓存MapperMethod对象。

    private final Map<Method, MapperMethod> methodCache;

    @Override

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

    if (Object.class.equals(method.getDeclaringClass())) {

    try

    return method.invoke(this, args);

    catch (Throwable t)

    throw ExceptionUtil.unwrapThrowable(t);

    }

    // 投鞭断流

    final MapperMethod mapperMethod = cachedMapperMethod(method);

    return mapperMethod.execute(sqlSession, args);

    }

    // 缓存MapperMethod

    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;

    }

    MapperMethod的功能:

    1. 解析Mapper接口的方法,并封装成MapperMethod对象。

    2. 将Sql命令,准确路由到恰当的SqlSession的方法上。

    public class MapperMethod {

    // 保留了Sql命令的类型跟键id

    private final SqlCommand command;

    // 保存了Mapper接口方式的解析信息

    private final MethodSignature method;

    public MapperMethod(Class<?> mapperInterface, Method method, Configuration config)

    this.command = new SqlCommand(config, mapperInterface, method);

    this.method = new MethodSignature(config, method);

    // 依据解析成果,路由到适当的SqlSession办法上

    public Object execute(SqlSession sqlSession, Object[] args) {

    Object result;

    if (SqlCommandType.INSERT == command.getType())

    Object param = method.convertArgsToSqlCommandParam(args);

    result = rowCountResult(sqlSession.insert(command.getName(), param));

    else if (SqlCommandType.UPDATE == command.getType())

    Object param = method.convertArgsToSqlCommandParam(args);

    result = rowCountResult(sqlSession.update(command.getName(), param));

    else if (SqlCommandType.DELETE == command.getType())

    Object param = method.convertArgsToSqlCommandParam(args);

    result = rowCountResult(sqlSession.delete(command.getName(), param));

    else if (SqlCommandType.SELECT == command.getType()) {

    if (method.returnsVoid() &,JSON格式化是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率;& method.hasResultHandler())

    executeWithResultHandler(sqlSession, args);

    result = null;

    else if (method.returnsMany())

    result = executeForMany(sqlSession, args);

    else if (method.returnsMap())

    result = executeForMap(sqlSession, args);

    else

    Object param = method.convertArgsToSqlCommandParam(args);

    result = sqlSession.selectOne(command.getName(), param);

    } else if (SqlCommandType.FLUSH == command.getType())

    result = sqlSession.flushStatements();

    else

    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() + ")."),JS代码压缩是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。虽然它是作为开发Web页面的脚本语言而出名,但是它也被用到了很多非浏览器环境中,JavaScript 基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式和声明式(如函数式编程)风格;

    return result;

    }

    org.apache.ibatis.binding.MapperMethod.SqlCommand。

    public static class SqlCommand {

    // full id, 通过它能够找到MappedStatement

    private final String name;

    private final SqlCommandType type;

    org.apache.ibatis.binding.MapperMethod.MethodSignature:

    public static class MethodSignature {

    private final boolean returnsMany;

    private final boolean returnsMap;

    private final boolean returnsVoid;

    private final Class<?> returnType;

    private final String mapKey;

    private final Integer resultHandlerIndex;

    private final Integer rowBoundsIndex;

    private final SortedMap<Integer, String> params;

    private final boolean hasNamedParameters;

    public MethodSignature(Configuration configuration, Method method) this.returnType.isArray());

    this.mapKey = getMapKey(method);

    this.returnsMap = (this.mapKey != null);

    this.hasNamedParameters = hasNamedParams(method);

    // 分页参数

    this.rowBoundsIndex = getUniqueParamIndex(method, RowBounds.class);

    // 自定义ResultHandler

    this.resultHandlerIndex = getUniqueParamIndex(method, ResultHandler.class);

    this.params = Collections.unmodifiableSortedMap(getParams(method, this.hasNamedParameters));

    以上是对MapperMethod的弥补阐明。

  • 关键词: