# sqlCommand - Author: [HuiFer](https://github.com/huifer) - Description: 该文介绍 mybatis sqlCommand 类的源码 - 源码阅读工程: [SourceHot-Mybatis](https://github.com/SourceHot/mybatis-read.git) - `org.apache.ibatis.binding.MapperMethod.SqlCommand` ```java /** * 核心内容: sql id , Sql 类型 */ public static class SqlCommand { /** * sql id */ private final String name; /** * sql 类型select|update|delete|insert|... */ private final SqlCommandType type; /** * 根据传递的参数 设置sql的一些属性 , sql id , type . * * @param configuration * @param mapperInterface * @param method */ public SqlCommand(Configuration configuration, Class mapperInterface, Method method) { // 方法名 final String methodName = method.getName(); final Class declaringClass = method.getDeclaringClass(); // Statement 实质是sql 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; } /** * @param mapperInterface mapper.class * @param methodName 方法名 * @param declaringClass 可能是 mapper.class * @param configuration * @return */ private MappedStatement resolveMappedStatement(Class mapperInterface, String methodName, Class declaringClass, Configuration configuration) { // 接口名称+方法名 String statementId = mapperInterface.getName() + "." + methodName; if (configuration.hasStatement(statementId)) { // 从 configuration 获取 return configuration.getMappedStatement(statementId); } else if (mapperInterface.equals(declaringClass)) { return null; } // new 一个新的实例 for (Class superInterface : mapperInterface.getInterfaces()) { if (declaringClass.isAssignableFrom(superInterface)) { MappedStatement ms = resolveMappedStatement(superInterface, methodName, declaringClass, configuration); if (ms != null) { return ms; } } } return null; } } ``` ![image-20191218191512184](../../../images/mybatis/image-20191218191512184.png) ![image-20191218191550550](../../../images/mybatis/image-20191218191550550.png)