org.apache.ibatis.parsing.XNode

Here are the examples of the java api org.apache.ibatis.parsing.XNode taken from open source projects. By voting up you can indicate which examples are most useful and appropriate.

72 Examples 7

19 Source : XMLMapperBuilder.java
with Apache License 2.0
from huifer

/**
 * <insert keyProperty="id" parameterType="Person" useGeneratedKeys="true" id="insert">
 * INSERT INTO person (name, age, phone, email, address)
 * VALUES(#{name},#{age},#{phone},#{email},#{address})
 * </insert>
 *
 * <select resultMap="base" id="list">
 * <include refid="Base_List"/>
 * <if test="iid != null">
 * and id = #{iid,jdbcType=INTEGER}
 * </if>
 * </select>
 *
 * @param list
 * @param requiredDatabaseId
 */
private void buildStatementFromContext(List<XNode> list, String requiredDatabaseId) {
    for (XNode context : list) {
        // 动态 sql 解析
        final XMLStatementBuilder statementParser = new XMLStatementBuilder(configuration, builderreplacedistant, context, requiredDatabaseId);
        try {
            // 解析
            statementParser.parseStatementNode();
        } catch (IncompleteElementException e) {
            configuration.addIncompleteStatement(statementParser);
        }
    }
}

19 Source : XMLMapperBuilder.java
with Apache License 2.0
from huifer

private String processNestedResultMappings(XNode context, List<ResultMapping> resultMappings, Clreplaced<?> enclosingType) throws Exception {
    if ("replacedociation".equals(context.getName()) || "collection".equals(context.getName()) || "case".equals(context.getName())) {
        if (context.getStringAttribute("select") == null) {
            validateCollection(context, enclosingType);
            ResultMap resultMap = resultMapElement(context, resultMappings, enclosingType);
            return resultMap.getId();
        }
    }
    return null;
}

19 Source : XMLMapperBuilder.java
with Apache License 2.0
from huifer

/**
 * 解析 resultMap 标签
 *
 * @param list
 * @throws Exception
 */
private void resultMapElements(List<XNode> list) throws Exception {
    for (XNode resultMapNode : list) {
        try {
            resultMapElement(resultMapNode);
        } catch (IncompleteElementException e) {
        // ignore, it will be retried
        }
    }
}

19 Source : XMLMapperBuilder.java
with Apache License 2.0
from huifer

private ResultMap resultMapElement(XNode resultMapNode) throws Exception {
    return resultMapElement(resultMapNode, Collections.emptyList(), null);
}

19 Source : XMLMapperBuilder.java
with Apache License 2.0
from huifer

private boolean databaseIdMatchesCurrent(String id, String databaseId, String requiredDatabaseId) {
    if (requiredDatabaseId != null) {
        return requiredDatabaseId.equals(databaseId);
    }
    if (databaseId != null) {
        return false;
    }
    if (!this.sqlFragments.containsKey(id)) {
        return true;
    }
    // skip this fragment if there is a previous one with a not null databaseId
    XNode context = this.sqlFragments.get(id);
    return context.getStringAttribute("databaseId") == null;
}

18 Source : MybatisJpaXMLScriptBuilder.java
with Apache License 2.0
from zhouxx

/**
 * @author Clinton Begin
 * @author Zhou Xiaoxiang
 */
public clreplaced MybatisJpaXMLScriptBuilder extends BaseBuilder {

    private final XNode context;

    private boolean isDynamic;

    private final Clreplaced<?> parameterType;

    private final Map<String, MybatisJpaXMLScriptBuilder.NodeHandler> nodeHandlerMap = new HashMap<String, MybatisJpaXMLScriptBuilder.NodeHandler>();

    public MybatisJpaXMLScriptBuilder(Configuration configuration, XNode context) {
        this(configuration, context, null);
    }

    public MybatisJpaXMLScriptBuilder(Configuration configuration, XNode context, Clreplaced<?> parameterType) {
        super(configuration);
        this.context = context;
        this.parameterType = parameterType;
        initNodeHandlerMap();
    }

    private void initNodeHandlerMap() {
        nodeHandlerMap.put("trim", new MybatisJpaXMLScriptBuilder.TrimHandler());
        nodeHandlerMap.put("where", new MybatisJpaXMLScriptBuilder.WhereHandler());
        nodeHandlerMap.put("set", new MybatisJpaXMLScriptBuilder.SetHandler());
        nodeHandlerMap.put("foreach", new MybatisJpaXMLScriptBuilder.ForEachHandler());
        nodeHandlerMap.put("if", new MybatisJpaXMLScriptBuilder.IfHandler());
        nodeHandlerMap.put("choose", new MybatisJpaXMLScriptBuilder.ChooseHandler());
        nodeHandlerMap.put("when", new MybatisJpaXMLScriptBuilder.IfHandler());
        nodeHandlerMap.put("otherwise", new MybatisJpaXMLScriptBuilder.OtherwiseHandler());
        nodeHandlerMap.put("bind", new MybatisJpaXMLScriptBuilder.BindHandler());
    }

    public SqlSource parseScriptNode() {
        MixedSqlNode rootSqlNode = parseDynamicTags(context);
        SqlSource sqlSource = null;
        // 这里跟原来的不一样
        if (isDynamic) {
            sqlSource = new MybatisJpaDynamicSqlSource(configuration, rootSqlNode, parameterType);
        } else {
            sqlSource = new RawSqlSource(configuration, rootSqlNode, parameterType);
        }
        return sqlSource;
    }

    protected MixedSqlNode parseDynamicTags(XNode node) {
        List<SqlNode> contents = new ArrayList<SqlNode>();
        NodeList children = node.getNode().getChildNodes();
        for (int i = 0; i < children.getLength(); i++) {
            XNode child = node.newXNode(children.item(i));
            if (child.getNode().getNodeType() == Node.CDATA_SECTION_NODE || child.getNode().getNodeType() == Node.TEXT_NODE) {
                String data = child.getStringBody("");
                TextSqlNode textSqlNode = new TextSqlNode(data);
                if (textSqlNode.isDynamic()) {
                    contents.add(textSqlNode);
                    isDynamic = true;
                } else {
                    contents.add(new StaticTextSqlNode(data));
                }
            } else if (child.getNode().getNodeType() == Node.ELEMENT_NODE) {
                // issue #628
                String nodeName = child.getNode().getNodeName();
                MybatisJpaXMLScriptBuilder.NodeHandler handler = nodeHandlerMap.get(nodeName);
                if (handler == null) {
                    throw new BuilderException("Unknown element <" + nodeName + "> in SQL statement.");
                }
                handler.handleNode(child, contents);
                isDynamic = true;
            }
        }
        return new MixedSqlNode(contents);
    }

    private interface NodeHandler {

        void handleNode(XNode nodeToHandle, List<SqlNode> targetContents);
    }

    private clreplaced BindHandler implements MybatisJpaXMLScriptBuilder.NodeHandler {

        public BindHandler() {
        // Prevent Synthetic Access
        }

        @Override
        public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
            final String name = nodeToHandle.getStringAttribute("name");
            final String expression = nodeToHandle.getStringAttribute("value");
            final VarDeclSqlNode node = new VarDeclSqlNode(name, expression);
            targetContents.add(node);
        }
    }

    private clreplaced TrimHandler implements MybatisJpaXMLScriptBuilder.NodeHandler {

        public TrimHandler() {
        // Prevent Synthetic Access
        }

        @Override
        public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
            MixedSqlNode mixedSqlNode = parseDynamicTags(nodeToHandle);
            String prefix = nodeToHandle.getStringAttribute("prefix");
            String prefixOverrides = nodeToHandle.getStringAttribute("prefixOverrides");
            String suffix = nodeToHandle.getStringAttribute("suffix");
            String suffixOverrides = nodeToHandle.getStringAttribute("suffixOverrides");
            TrimSqlNode trim = new TrimSqlNode(configuration, mixedSqlNode, prefix, prefixOverrides, suffix, suffixOverrides);
            targetContents.add(trim);
        }
    }

    private clreplaced WhereHandler implements MybatisJpaXMLScriptBuilder.NodeHandler {

        public WhereHandler() {
        // Prevent Synthetic Access
        }

        @Override
        public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
            MixedSqlNode mixedSqlNode = parseDynamicTags(nodeToHandle);
            WhereSqlNode where = new WhereSqlNode(configuration, mixedSqlNode);
            targetContents.add(where);
        }
    }

    private clreplaced SetHandler implements MybatisJpaXMLScriptBuilder.NodeHandler {

        public SetHandler() {
        // Prevent Synthetic Access
        }

        @Override
        public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
            MixedSqlNode mixedSqlNode = parseDynamicTags(nodeToHandle);
            SetSqlNode set = new SetSqlNode(configuration, mixedSqlNode);
            targetContents.add(set);
        }
    }

    private clreplaced ForEachHandler implements MybatisJpaXMLScriptBuilder.NodeHandler {

        public ForEachHandler() {
        // Prevent Synthetic Access
        }

        @Override
        public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
            MixedSqlNode mixedSqlNode = parseDynamicTags(nodeToHandle);
            String collection = nodeToHandle.getStringAttribute("collection");
            String item = nodeToHandle.getStringAttribute("item");
            String index = nodeToHandle.getStringAttribute("index");
            String open = nodeToHandle.getStringAttribute("open");
            String close = nodeToHandle.getStringAttribute("close");
            String separator = nodeToHandle.getStringAttribute("separator");
            ForEachSqlNode forEachSqlNode = new ForEachSqlNode(configuration, mixedSqlNode, collection, index, item, open, close, separator);
            targetContents.add(forEachSqlNode);
        }
    }

    private clreplaced IfHandler implements MybatisJpaXMLScriptBuilder.NodeHandler {

        public IfHandler() {
        // Prevent Synthetic Access
        }

        @Override
        public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
            MixedSqlNode mixedSqlNode = parseDynamicTags(nodeToHandle);
            String test = nodeToHandle.getStringAttribute("test");
            IfSqlNode ifSqlNode = new IfSqlNode(mixedSqlNode, test);
            targetContents.add(ifSqlNode);
        }
    }

    private clreplaced OtherwiseHandler implements MybatisJpaXMLScriptBuilder.NodeHandler {

        public OtherwiseHandler() {
        // Prevent Synthetic Access
        }

        @Override
        public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
            MixedSqlNode mixedSqlNode = parseDynamicTags(nodeToHandle);
            targetContents.add(mixedSqlNode);
        }
    }

    private clreplaced ChooseHandler implements MybatisJpaXMLScriptBuilder.NodeHandler {

        public ChooseHandler() {
        // Prevent Synthetic Access
        }

        @Override
        public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
            List<SqlNode> whenSqlNodes = new ArrayList<SqlNode>();
            List<SqlNode> otherwiseSqlNodes = new ArrayList<SqlNode>();
            handleWhenOtherwiseNodes(nodeToHandle, whenSqlNodes, otherwiseSqlNodes);
            SqlNode defaultSqlNode = getDefaultSqlNode(otherwiseSqlNodes);
            ChooseSqlNode chooseSqlNode = new ChooseSqlNode(whenSqlNodes, defaultSqlNode);
            targetContents.add(chooseSqlNode);
        }

        private void handleWhenOtherwiseNodes(XNode chooseSqlNode, List<SqlNode> ifSqlNodes, List<SqlNode> defaultSqlNodes) {
            List<XNode> children = chooseSqlNode.getChildren();
            for (XNode child : children) {
                String nodeName = child.getNode().getNodeName();
                MybatisJpaXMLScriptBuilder.NodeHandler handler = nodeHandlerMap.get(nodeName);
                if (handler instanceof MybatisJpaXMLScriptBuilder.IfHandler) {
                    handler.handleNode(child, ifSqlNodes);
                } else if (handler instanceof MybatisJpaXMLScriptBuilder.OtherwiseHandler) {
                    handler.handleNode(child, defaultSqlNodes);
                }
            }
        }

        private SqlNode getDefaultSqlNode(List<SqlNode> defaultSqlNodes) {
            SqlNode defaultSqlNode = null;
            if (defaultSqlNodes.size() == 1) {
                defaultSqlNode = defaultSqlNodes.get(0);
            } else if (defaultSqlNodes.size() > 1) {
                throw new BuilderException("Too many default (otherwise) elements in choose statement.");
            }
            return defaultSqlNode;
        }
    }
}

18 Source : MybatisMapperRefresh.java
with GNU Affero General Public License v3.0
from zhouhuan751312

private void clearMapperdMap(List<XNode> list, String namespace) {
    for (XNode parameterMapNode : list) {
        String id = parameterMapNode.getStringAttribute("id");
        configuration.getMappedStatementNames().remove(namespace + "." + id);
    }
}

18 Source : XMLScriptBuilder.java
with Apache License 2.0
from huifer

/**
 * @author Clinton Begin
 */
public clreplaced XMLScriptBuilder extends BaseBuilder {

    private final XNode context;

    private final Clreplaced<?> parameterType;

    private final Map<String, NodeHandler> nodeHandlerMap = new HashMap<>();

    private boolean isDynamic;

    public XMLScriptBuilder(Configuration configuration, XNode context) {
        this(configuration, context, null);
    }

    /**
     * xml 脚本 构建
     *
     * @param configuration
     * @param context
     * @param parameterType
     */
    public XMLScriptBuilder(Configuration configuration, XNode context, Clreplaced<?> parameterType) {
        super(configuration);
        this.context = context;
        this.parameterType = parameterType;
        initNodeHandlerMap();
    }

    /**
     * 动态sql 标签
     */
    private void initNodeHandlerMap() {
        nodeHandlerMap.put("trim", new TrimHandler());
        nodeHandlerMap.put("where", new WhereHandler());
        nodeHandlerMap.put("set", new SetHandler());
        nodeHandlerMap.put("foreach", new ForEachHandler());
        nodeHandlerMap.put("if", new IfHandler());
        nodeHandlerMap.put("choose", new ChooseHandler());
        nodeHandlerMap.put("when", new IfHandler());
        nodeHandlerMap.put("otherwise", new OtherwiseHandler());
        nodeHandlerMap.put("bind", new BindHandler());
    }

    /**
     * 格式化 标签数据
     * @return
     */
    public SqlSource parseScriptNode() {
        // <select resultMap="BaseResultMap" parameterType="java.lang.Integer" id="selectByPrimaryKey">
        // 
        // select
        // </select>
        // select * from hs_sell
        MixedSqlNode rootSqlNode = parseDynamicTags(context);
        SqlSource sqlSource;
        if (isDynamic) {
            // 动态sql
            sqlSource = new DynamicSqlSource(configuration, rootSqlNode);
        } else {
            // 静态sql
            sqlSource = new RawSqlSource(configuration, rootSqlNode, parameterType);
        }
        return sqlSource;
    }

    /**
     *  <b>动态sql 的核心方法!!!</b>
     * <trim suffixOverrides="," prefix="(" suffix=")">
     *      <if test="userId != null">
     *          USER_ID,
     *        </if>
     *      <if test="goodId != null">
     *          GOOD_ID,
     *        </if>
     *      <if test="price != null">
     *          PRICE,
     *        </if>
     *      <if test="size != null">
     *          `SIZE`,
     *        </if>
     *      <if test="companyId != null">
     *          COMPANY_ID,
     *        </if>
     *      <if test="groupId != null">
     *          GROUP_ID,
     *        </if>
     *      <if test="version != null">
     *          VERSION,
     *        </if>
     *      <if test="deleted != null">
     *          DELETED,
     *        </if>
     *      <if test="createUser != null">
     *          CREATE_USER,
     *        </if>
     *      <if test="createTime != null">
     *          CREATE_TIME,
     *        </if>
     *      <if test="updateUser != null">
     *          UPDATE_USER,
     *        </if>
     *      <if test="updateTime != null">
     *          UPDATE_TIME,
     *        </if>
     *      <if test="workOrderId != null">
     *          WORK_ORDER_ID,
     *        </if>
     *  </trim>
     *  @param node
     *  @return
     */
    protected MixedSqlNode parseDynamicTags(XNode node) {
        List<SqlNode> contents = new ArrayList<>();
        NodeList children = node.getNode().getChildNodes();
        for (int i = 0; i < children.getLength(); i++) {
            XNode child = node.newXNode(children.item(i));
            if (child.getNode().getNodeType() == Node.CDATA_SECTION_NODE || child.getNode().getNodeType() == Node.TEXT_NODE) {
                // 如果不包含其他标签或者是纯文本节点
                // data 是替换后sql文本
                String data = child.getStringBody("");
                TextSqlNode textSqlNode = new TextSqlNode(data);
                if (textSqlNode.isDynamic()) {
                    contents.add(textSqlNode);
                    isDynamic = true;
                } else {
                    // 直接添加
                    contents.add(new StaticTextSqlNode(data));
                }
            } else if (child.getNode().getNodeType() == Node.ELEMENT_NODE) {
                // issue #628
                // 动态标签处理逻辑
                String nodeName = child.getNode().getNodeName();
                // if 等标签
                NodeHandler handler = nodeHandlerMap.get(nodeName);
                if (handler == null) {
                    throw new BuilderException("Unknown element <" + nodeName + "> in SQL statement.");
                }
                /**
                 * 动态标签处理 {@link TrimHandler}
                 */
                handler.handleNode(child, contents);
                isDynamic = true;
            }
        }
        return new MixedSqlNode(contents);
    }

    private interface NodeHandler {

        void handleNode(XNode nodeToHandle, List<SqlNode> targetContents);
    }

    private clreplaced BindHandler implements NodeHandler {

        public BindHandler() {
        // Prevent Synthetic Access
        }

        @Override
        public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
            final String name = nodeToHandle.getStringAttribute("name");
            final String expression = nodeToHandle.getStringAttribute("value");
            final VarDeclSqlNode node = new VarDeclSqlNode(name, expression);
            targetContents.add(node);
        }
    }

    /**
     * trim 标签解析
     */
    private clreplaced TrimHandler implements NodeHandler {

        public TrimHandler() {
        // Prevent Synthetic Access
        }

        @Override
        public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
            MixedSqlNode mixedSqlNode = parseDynamicTags(nodeToHandle);
            String prefix = nodeToHandle.getStringAttribute("prefix");
            String prefixOverrides = nodeToHandle.getStringAttribute("prefixOverrides");
            String suffix = nodeToHandle.getStringAttribute("suffix");
            String suffixOverrides = nodeToHandle.getStringAttribute("suffixOverrides");
            TrimSqlNode trim = new TrimSqlNode(configuration, mixedSqlNode, prefix, prefixOverrides, suffix, suffixOverrides);
            targetContents.add(trim);
        }
    }

    private clreplaced WhereHandler implements NodeHandler {

        public WhereHandler() {
        // Prevent Synthetic Access
        }

        @Override
        public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
            MixedSqlNode mixedSqlNode = parseDynamicTags(nodeToHandle);
            WhereSqlNode where = new WhereSqlNode(configuration, mixedSqlNode);
            targetContents.add(where);
        }
    }

    private clreplaced SetHandler implements NodeHandler {

        public SetHandler() {
        // Prevent Synthetic Access
        }

        @Override
        public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
            MixedSqlNode mixedSqlNode = parseDynamicTags(nodeToHandle);
            SetSqlNode set = new SetSqlNode(configuration, mixedSqlNode);
            targetContents.add(set);
        }
    }

    private clreplaced ForEachHandler implements NodeHandler {

        public ForEachHandler() {
        // Prevent Synthetic Access
        }

        @Override
        public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
            MixedSqlNode mixedSqlNode = parseDynamicTags(nodeToHandle);
            String collection = nodeToHandle.getStringAttribute("collection");
            String item = nodeToHandle.getStringAttribute("item");
            String index = nodeToHandle.getStringAttribute("index");
            String open = nodeToHandle.getStringAttribute("open");
            String close = nodeToHandle.getStringAttribute("close");
            String separator = nodeToHandle.getStringAttribute("separator");
            ForEachSqlNode forEachSqlNode = new ForEachSqlNode(configuration, mixedSqlNode, collection, index, item, open, close, separator);
            targetContents.add(forEachSqlNode);
        }
    }

    private clreplaced IfHandler implements NodeHandler {

        public IfHandler() {
        // Prevent Synthetic Access
        }

        @Override
        public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
            MixedSqlNode mixedSqlNode = parseDynamicTags(nodeToHandle);
            String test = nodeToHandle.getStringAttribute("test");
            IfSqlNode ifSqlNode = new IfSqlNode(mixedSqlNode, test);
            targetContents.add(ifSqlNode);
        }
    }

    private clreplaced OtherwiseHandler implements NodeHandler {

        public OtherwiseHandler() {
        // Prevent Synthetic Access
        }

        @Override
        public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
            MixedSqlNode mixedSqlNode = parseDynamicTags(nodeToHandle);
            targetContents.add(mixedSqlNode);
        }
    }

    private clreplaced ChooseHandler implements NodeHandler {

        public ChooseHandler() {
        // Prevent Synthetic Access
        }

        @Override
        public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
            List<SqlNode> whenSqlNodes = new ArrayList<>();
            List<SqlNode> otherwiseSqlNodes = new ArrayList<>();
            handleWhenOtherwiseNodes(nodeToHandle, whenSqlNodes, otherwiseSqlNodes);
            SqlNode defaultSqlNode = getDefaultSqlNode(otherwiseSqlNodes);
            ChooseSqlNode chooseSqlNode = new ChooseSqlNode(whenSqlNodes, defaultSqlNode);
            targetContents.add(chooseSqlNode);
        }

        private void handleWhenOtherwiseNodes(XNode chooseSqlNode, List<SqlNode> ifSqlNodes, List<SqlNode> defaultSqlNodes) {
            List<XNode> children = chooseSqlNode.getChildren();
            for (XNode child : children) {
                String nodeName = child.getNode().getNodeName();
                NodeHandler handler = nodeHandlerMap.get(nodeName);
                if (handler instanceof IfHandler) {
                    handler.handleNode(child, ifSqlNodes);
                } else if (handler instanceof OtherwiseHandler) {
                    handler.handleNode(child, defaultSqlNodes);
                }
            }
        }

        private SqlNode getDefaultSqlNode(List<SqlNode> defaultSqlNodes) {
            SqlNode defaultSqlNode = null;
            if (defaultSqlNodes.size() == 1) {
                defaultSqlNode = defaultSqlNodes.get(0);
            } else if (defaultSqlNodes.size() > 1) {
                throw new BuilderException("Too many default (otherwise) elements in choose statement.");
            }
            return defaultSqlNode;
        }
    }
}

18 Source : XMLStatementBuilder.java
with Apache License 2.0
from huifer

/**
 * @author Clinton Begin
 */
public clreplaced XMLStatementBuilder extends BaseBuilder {

    private final MapperBuilderreplacedistant builderreplacedistant;

    private final XNode context;

    private final String requiredDatabaseId;

    public XMLStatementBuilder(Configuration configuration, MapperBuilderreplacedistant builderreplacedistant, XNode context) {
        this(configuration, builderreplacedistant, context, null);
    }

    /**
     * @param configuration    解析到的 configuration
     * @param builderreplacedistant
     * @param context          当前的 select|insert|update|delete
     * @param databaseId
     */
    public XMLStatementBuilder(Configuration configuration, MapperBuilderreplacedistant builderreplacedistant, XNode context, String databaseId) {
        super(configuration);
        this.builderreplacedistant = builderreplacedistant;
        this.context = context;
        this.requiredDatabaseId = databaseId;
    }

    /**
     * context => <insert keyProperty="id" parameterType="Person" useGeneratedKeys="true" id="insert">
     * INSERT INTO person (name, age, phone, email, address)
     * VALUES(#{name},#{age},#{phone},#{email},#{address})
     * </insert>
     */
    public void parseStatementNode() {
        // 获取id属性
        String id = context.getStringAttribute("id");
        String databaseId = context.getStringAttribute("databaseId");
        if (!databaseIdMatchesCurrent(id, databaseId, this.requiredDatabaseId)) {
            return;
        }
        // 获取当前 <select insert delete update > 名称
        String nodeName = context.getNode().getNodeName();
        // 判断sql语句的类型
        SqlCommandType sqlCommandType = SqlCommandType.valueOf(nodeName.toUpperCase(Locale.ENGLISH));
        boolean isSelect = sqlCommandType == SqlCommandType.SELECT;
        boolean flushCache = context.getBooleanAttribute("flushCache", !isSelect);
        boolean useCache = context.getBooleanAttribute("useCache", isSelect);
        boolean resultOrdered = context.getBooleanAttribute("resultOrdered", false);
        // Include Fragments before parsing
        // <include > 解析
        // TODO: 2019/12/17 include 标签
        XMLIncludeTransformer includeParser = new XMLIncludeTransformer(configuration, builderreplacedistant);
        includeParser.applyIncludes(context.getNode());
        // <select resultMap="base" id="list">
        // <if test="iid != null">
        // and id = #{iid,jdbcType=INTEGER}
        // </if>
        // </select>
        // 请求类型
        String parameterType = context.getStringAttribute("parameterType");
        // 别名中心注册获取
        Clreplaced<?> parameterTypeClreplaced = resolveClreplaced(parameterType);
        String lang = context.getStringAttribute("lang");
        LanguageDriver langDriver = getLanguageDriver(lang);
        // Parse selectKey after includes and remove them.
        processSelectKeyNodes(id, parameterTypeClreplaced, langDriver);
        // Parse the SQL (pre: <selectKey> and <include> were parsed and removed)
        KeyGenerator keyGenerator;
        // 生成一个id
        String keyStatementId = id + SelectKeyGenerator.SELECT_KEY_SUFFIX;
        keyStatementId = builderreplacedistant.applyCurrentNamespace(keyStatementId, true);
        if (configuration.hasKeyGenerator(keyStatementId)) {
            keyGenerator = configuration.getKeyGenerator(keyStatementId);
        } else {
            keyGenerator = context.getBooleanAttribute("useGeneratedKeys", configuration.isUseGeneratedKeys() && SqlCommandType.INSERT.equals(sqlCommandType)) ? Jdbc3KeyGenerator.INSTANCE : NoKeyGenerator.INSTANCE;
        }
        // 语言驱动: org.apache.ibatis.scripting.xmltags.XMLLanguageDriver
        // 创建sql源
        SqlSource sqlSource = langDriver.createSqlSource(configuration, context, parameterTypeClreplaced);
        StatementType statementType = StatementType.valueOf(context.getStringAttribute("statementType", StatementType.PREPARED.toString()));
        // 标签获取
        Integer fetchSize = context.getIntAttribute("fetchSize");
        Integer timeout = context.getIntAttribute("timeout");
        String parameterMap = context.getStringAttribute("parameterMap");
        String resultType = context.getStringAttribute("resultType");
        Clreplaced<?> resultTypeClreplaced = resolveClreplaced(resultType);
        String resultMap = context.getStringAttribute("resultMap");
        String resultSetType = context.getStringAttribute("resultSetType");
        ResultSetType resultSetTypeEnum = resolveResultSetType(resultSetType);
        if (resultSetTypeEnum == null) {
            resultSetTypeEnum = configuration.getDefaultResultSetType();
        }
        String keyProperty = context.getStringAttribute("keyProperty");
        String keyColumn = context.getStringAttribute("keyColumn");
        String resultSets = context.getStringAttribute("resultSets");
        builderreplacedistant.addMappedStatement(id, sqlSource, statementType, sqlCommandType, fetchSize, timeout, parameterMap, parameterTypeClreplaced, resultMap, resultTypeClreplaced, resultSetTypeEnum, flushCache, useCache, resultOrdered, keyGenerator, keyProperty, keyColumn, databaseId, langDriver, resultSets);
    }

    /**
     * @param id                 crud 标签id
     * @param parameterTypeClreplaced 请求参数类型
     * @param langDriver         语言驱动
     */
    private void processSelectKeyNodes(String id, Clreplaced<?> parameterTypeClreplaced, LanguageDriver langDriver) {
        List<XNode> selectKeyNodes = context.evalNodes("selectKey");
        if (configuration.getDatabaseId() != null) {
            parseSelectKeyNodes(id, selectKeyNodes, parameterTypeClreplaced, langDriver, configuration.getDatabaseId());
        }
        parseSelectKeyNodes(id, selectKeyNodes, parameterTypeClreplaced, langDriver, null);
        removeSelectKeyNodes(selectKeyNodes);
    }

    /**
     * @param parentId             crud 标签ID
     * @param list                 子集
     * @param parameterTypeClreplaced   参数类型
     * @param langDriver
     * @param skRequiredDatabaseId
     */
    private void parseSelectKeyNodes(String parentId, List<XNode> list, Clreplaced<?> parameterTypeClreplaced, LanguageDriver langDriver, String skRequiredDatabaseId) {
        for (XNode nodeToHandle : list) {
            String id = parentId + SelectKeyGenerator.SELECT_KEY_SUFFIX;
            String databaseId = nodeToHandle.getStringAttribute("databaseId");
            if (databaseIdMatchesCurrent(id, databaseId, skRequiredDatabaseId)) {
                parseSelectKeyNode(id, nodeToHandle, parameterTypeClreplaced, langDriver, databaseId);
            }
        }
    }

    /**
     * @param id
     * @param nodeToHandle
     * @param parameterTypeClreplaced
     * @param langDriver
     * @param databaseId
     */
    private void parseSelectKeyNode(String id, XNode nodeToHandle, Clreplaced<?> parameterTypeClreplaced, LanguageDriver langDriver, String databaseId) {
        String resultType = nodeToHandle.getStringAttribute("resultType");
        Clreplaced<?> resultTypeClreplaced = resolveClreplaced(resultType);
        StatementType statementType = StatementType.valueOf(nodeToHandle.getStringAttribute("statementType", StatementType.PREPARED.toString()));
        String keyProperty = nodeToHandle.getStringAttribute("keyProperty");
        String keyColumn = nodeToHandle.getStringAttribute("keyColumn");
        boolean executeBefore = "BEFORE".equals(nodeToHandle.getStringAttribute("order", "AFTER"));
        // defaults
        boolean useCache = false;
        boolean resultOrdered = false;
        KeyGenerator keyGenerator = NoKeyGenerator.INSTANCE;
        Integer fetchSize = null;
        Integer timeout = null;
        boolean flushCache = false;
        String parameterMap = null;
        String resultMap = null;
        ResultSetType resultSetTypeEnum = null;
        SqlSource sqlSource = langDriver.createSqlSource(configuration, nodeToHandle, parameterTypeClreplaced);
        SqlCommandType sqlCommandType = SqlCommandType.SELECT;
        builderreplacedistant.addMappedStatement(id, sqlSource, statementType, sqlCommandType, fetchSize, timeout, parameterMap, parameterTypeClreplaced, resultMap, resultTypeClreplaced, resultSetTypeEnum, flushCache, useCache, resultOrdered, keyGenerator, keyProperty, keyColumn, databaseId, langDriver, null);
        id = builderreplacedistant.applyCurrentNamespace(id, false);
        MappedStatement keyStatement = configuration.getMappedStatement(id, false);
        configuration.addKeyGenerator(id, new SelectKeyGenerator(keyStatement, executeBefore));
    }

    private void removeSelectKeyNodes(List<XNode> selectKeyNodes) {
        for (XNode nodeToHandle : selectKeyNodes) {
            nodeToHandle.getParent().getNode().removeChild(nodeToHandle.getNode());
        }
    }

    private boolean databaseIdMatchesCurrent(String id, String databaseId, String requiredDatabaseId) {
        if (requiredDatabaseId != null) {
            return requiredDatabaseId.equals(databaseId);
        }
        if (databaseId != null) {
            return false;
        }
        id = builderreplacedistant.applyCurrentNamespace(id, false);
        if (!this.configuration.hreplacedtatement(id, false)) {
            return true;
        }
        // skip this statement if there is a previous one with a not null databaseId
        // issue #2
        MappedStatement previous = this.configuration.getMappedStatement(id, false);
        return previous.getDatabaseId() == null;
    }

    /**
     * 默认的 {@link LanguageDriver} {@link LanguageDriverRegistry#setDefaultDriverClreplaced(java.lang.Clreplaced)}
     *
     * @param lang
     * @return
     */
    private LanguageDriver getLanguageDriver(String lang) {
        Clreplaced<? extends LanguageDriver> langClreplaced = null;
        if (lang != null) {
            langClreplaced = resolveClreplaced(lang);
        }
        return configuration.getLanguageDriver(langClreplaced);
    }
}

18 Source : XMLMapperBuilder.java
with Apache License 2.0
from huifer

/**
 * 解析 sql 标签
 * <sql id="Base_List">
 * name,age,phone,email,address
 * </sql>
 *
 * @param list
 */
private void sqlElement(List<XNode> list, String requiredDatabaseId) {
    for (XNode context : list) {
        String databaseId = context.getStringAttribute("databaseId");
        // 获取 id
        String id = context.getStringAttribute("id");
        id = builderreplacedistant.applyCurrentNamespace(id, false);
        if (databaseIdMatchesCurrent(id, databaseId, requiredDatabaseId)) {
            sqlFragments.put(id, context);
        }
    }
}

18 Source : HierarchicalXMLConfigBuilder.java
with GNU Lesser General Public License v3.0
from Alfresco

private void parseConfiguration(XNode root) {
    try {
        // issue #117 read properties first
        propertiesElement(root.evalNode("properties"));
        typeAliasesElement(root.evalNode("typeAliases"));
        pluginElement(root.evalNode("plugins"));
        objectFactoryElement(root.evalNode("objectFactory"));
        objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
        reflectionFactoryElement(root.evalNode("reflectionFactory"));
        settingsElement(root.evalNode("settings"));
        // read it after objectFactory and objectWrapperFactory issue #631
        environmentsElement(root.evalNode("environments"));
        databaseIdProviderElement(root.evalNode("databaseIdProvider"));
        typeHandlerElement(root.evalNode("typeHandlers"));
        mapperElement(root.evalNode("mappers"));
    } catch (Exception e) {
        throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
    }
}

17 Source : MybatisJpaLanguageDriver.java
with Apache License 2.0
from zhouxx

@Override
public SqlSource createSqlSource(Configuration configuration, XNode script, Clreplaced<?> parameterType) {
    MybatisJpaXMLScriptBuilder builder = new MybatisJpaXMLScriptBuilder(configuration, script, parameterType);
    return builder.parseScriptNode();
}

17 Source : MybatisMapperRefresh.java
with GNU Affero General Public License v3.0
from zhouhuan751312

/**
 * 清理selectKey
 *
 * @param list
 * @param namespace
 */
private void cleanKeyGenerators(List<XNode> list, String namespace) {
    for (XNode context : list) {
        String id = context.getStringAttribute("id");
        configuration.getKeyGeneratorNames().remove(id + SelectKeyGenerator.SELECT_KEY_SUFFIX);
        configuration.getKeyGeneratorNames().remove(namespace + "." + id + SelectKeyGenerator.SELECT_KEY_SUFFIX);
    }
}

17 Source : MybatisMapperRefresh.java
with GNU Affero General Public License v3.0
from zhouhuan751312

/**
 * 清理parameterMap
 *
 * @param list
 * @param namespace
 */
private void cleanParameterMap(List<XNode> list, String namespace) {
    for (XNode parameterMapNode : list) {
        String id = parameterMapNode.getStringAttribute("id");
        configuration.getParameterMaps().remove(namespace + "." + id);
    }
}

17 Source : MybatisMapperRefresh.java
with GNU Affero General Public License v3.0
from zhouhuan751312

/**
 * 清理sql节点缓存
 *
 * @param list
 * @param namespace
 */
private void cleanSqlElement(List<XNode> list, String namespace) {
    for (XNode context : list) {
        String id = context.getStringAttribute("id");
        configuration.getSqlFragments().remove(id);
        configuration.getSqlFragments().remove(namespace + "." + id);
    }
}

17 Source : VelocityLanguageDriver.java
with Apache License 2.0
from huifer

@Override
public SqlSource createSqlSource(Configuration configuration, XNode script, Clreplaced<?> parameterType) {
    return new VelocitySqlSource(configuration, script.getStringBody(""));
}

17 Source : XMLLanguageDriver.java
with Apache License 2.0
from huifer

/**
 * 创建{@link SqlSource}
 *
 * @param configuration The MyBatis configuration
 * @param script        XNode parsed from a XML file
 * @param parameterType input parameter type got from a mapper method or specified in the parameterType xml attribute. Can be null.
 * @return
 */
@Override
public SqlSource createSqlSource(Configuration configuration, XNode script, Clreplaced<?> parameterType) {
    XMLScriptBuilder builder = new XMLScriptBuilder(configuration, script, parameterType);
    return builder.parseScriptNode();
}

17 Source : RawLanguageDriver.java
with Apache License 2.0
from huifer

@Override
public SqlSource createSqlSource(Configuration configuration, XNode script, Clreplaced<?> parameterType) {
    SqlSource source = super.createSqlSource(configuration, script, parameterType);
    checkIsNotDynamic(source);
    return source;
}

17 Source : XMLStatementBuilder.java
with Apache License 2.0
from huifer

/**
 * @param parentId             crud 标签ID
 * @param list                 子集
 * @param parameterTypeClreplaced   参数类型
 * @param langDriver
 * @param skRequiredDatabaseId
 */
private void parseSelectKeyNodes(String parentId, List<XNode> list, Clreplaced<?> parameterTypeClreplaced, LanguageDriver langDriver, String skRequiredDatabaseId) {
    for (XNode nodeToHandle : list) {
        String id = parentId + SelectKeyGenerator.SELECT_KEY_SUFFIX;
        String databaseId = nodeToHandle.getStringAttribute("databaseId");
        if (databaseIdMatchesCurrent(id, databaseId, skRequiredDatabaseId)) {
            parseSelectKeyNode(id, nodeToHandle, parameterTypeClreplaced, langDriver, databaseId);
        }
    }
}

17 Source : XMLStatementBuilder.java
with Apache License 2.0
from huifer

private void removeSelectKeyNodes(List<XNode> selectKeyNodes) {
    for (XNode nodeToHandle : selectKeyNodes) {
        nodeToHandle.getParent().getNode().removeChild(nodeToHandle.getNode());
    }
}

17 Source : XMLMapperBuilder.java
with Apache License 2.0
from huifer

/**
 * <discriminator javaType="">
 * <case value=""></case>
 * </discriminator>
 *
 * @param context
 * @param resultType
 * @param resultMappings
 * @return
 * @throws Exception
 */
private Discriminator processDiscriminatorElement(XNode context, Clreplaced<?> resultType, List<ResultMapping> resultMappings) throws Exception {
    // 简单的数据获取 赋值
    String column = context.getStringAttribute("column");
    String javaType = context.getStringAttribute("javaType");
    String jdbcType = context.getStringAttribute("jdbcType");
    String typeHandler = context.getStringAttribute("typeHandler");
    Clreplaced<?> javaTypeClreplaced = resolveClreplaced(javaType);
    Clreplaced<? extends TypeHandler<?>> typeHandlerClreplaced = resolveClreplaced(typeHandler);
    JdbcType jdbcTypeEnum = resolveJdbcType(jdbcType);
    Map<String, String> discriminatorMap = new HashMap<>();
    for (XNode caseChild : context.getChildren()) {
        String value = caseChild.getStringAttribute("value");
        String resultMap = caseChild.getStringAttribute("resultMap", processNestedResultMappings(caseChild, resultMappings, resultType));
        discriminatorMap.put(value, resultMap);
    }
    return builderreplacedistant.buildDiscriminator(resultType, column, javaTypeClreplaced, jdbcTypeEnum, typeHandlerClreplaced, discriminatorMap);
}

17 Source : XMLMapperBuilder.java
with Apache License 2.0
from huifer

/**
 * 解析 <cache-ref namespace=""/> 标签的属性
 *
 * @param context
 */
private void cacheRefElement(XNode context) {
    if (context != null) {
        // 向全局配置设置 CacheRef
        configuration.addCacheRef(builderreplacedistant.getCurrentNamespace(), context.getStringAttribute("namespace"));
        // 构造
        CacheRefResolver cacheRefResolver = new CacheRefResolver(builderreplacedistant, context.getStringAttribute("namespace"));
        try {
            // 解析
            Cache cache = cacheRefResolver.resolveCacheRef();
        } catch (IncompleteElementException e) {
            // 初始化是没有内容走这一步
            configuration.addIncompleteCacheRef(cacheRefResolver);
        }
    }
}

17 Source : XMLConfigBuilder.java
with Apache License 2.0
from huifer

/**
 * 解析 objectWrapperFactory 标签
 * <objectWrapperFactory type="org.apache.ibatis.reflection.wrapper.DefaultObjectWrapperFactory"/>
 *
 * @param context
 * @throws Exception
 */
private void objectWrapperFactoryElement(XNode context) throws Exception {
    if (context != null) {
        // 获取 objectWrapperFactory 标签 type 的值
        String type = context.getStringAttribute("type");
        // 别名 mao 中获取
        ObjectWrapperFactory factory = (ObjectWrapperFactory) resolveClreplaced(type).getDeclaredConstructor().newInstance();
        // 在 configuration 设置
        configuration.setObjectWrapperFactory(factory);
    }
}

17 Source : XMLConfigBuilder.java
with Apache License 2.0
from huifer

private void parseConfiguration(XNode root) {
    try {
        // issue #117 read properties first
        // 加载 properties 标签
        propertiesElement(root.evalNode("properties"));
        // 加载 setting 标签
        Properties settings = settingsAsProperties(root.evalNode("settings"));
        // vfs 虚拟文件相关属性
        loadCustomVfs(settings);
        // 日志实现类
        loadCustomLogImpl(settings);
        // 加载 typeAliases 标签
        typeAliasesElement(root.evalNode("typeAliases"));
        // 加载 plugins 标签
        pluginElement(root.evalNode("plugins"));
        // 加载 objectFactory 标签
        objectFactoryElement(root.evalNode("objectFactory"));
        // 加载 objectWrapperFactory 标签
        objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
        // 加载 reflectorFactory 标签
        reflectorFactoryElement(root.evalNode("reflectorFactory"));
        // 设置 settings 标签的属性值放入 configuration 中
        // 不明白为什么放在下面,应该放在 loadCustomLogImpl 方法之后. 可读性会更好
        settingsElement(settings);
        // read it after objectFactory and objectWrapperFactory issue #631
        environmentsElement(root.evalNode("environments"));
        databaseIdProviderElement(root.evalNode("databaseIdProvider"));
        typeHandlerElement(root.evalNode("typeHandlers"));
        mapperElement(root.evalNode("mappers"));
    } catch (Exception e) {
        throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
    }
}

17 Source : XMLConfigBuilder.java
with Apache License 2.0
from huifer

/**
 * 解析 reflectorFactory 标签
 * <reflectorFactory type="org.apache.ibatis.reflection.DefaultReflectorFactory"/>
 *
 * @param context
 * @throws Exception
 */
private void reflectorFactoryElement(XNode context) throws Exception {
    if (context != null) {
        // 获取 reflectorFactory 标签 type 的值
        String type = context.getStringAttribute("type");
        // 别名 mao 中获取
        ReflectorFactory factory = (ReflectorFactory) resolveClreplaced(type).getDeclaredConstructor().newInstance();
        // 在 configuration 设置
        configuration.setReflectorFactory(factory);
    }
}

17 Source : HierarchicalXMLConfigBuilder.java
with GNU Lesser General Public License v3.0
from Alfresco

private void reflectionFactoryElement(XNode context) throws Exception {
    if (context != null) {
        String type = context.getStringAttribute("type");
        ReflectorFactory factory = (ReflectorFactory) resolveClreplaced(type).newInstance();
        configuration.setReflectorFactory(factory);
    }
}

17 Source : HierarchicalXMLConfigBuilder.java
with GNU Lesser General Public License v3.0
from Alfresco

private void objectWrapperFactoryElement(XNode context) throws Exception {
    if (context != null) {
        String type = context.getStringAttribute("type");
        ObjectWrapperFactory factory = (ObjectWrapperFactory) resolveClreplaced(type).newInstance();
        configuration.setObjectWrapperFactory(factory);
    }
}

16 Source : MybatisMapperRefresh.java
with GNU Affero General Public License v3.0
from zhouhuan751312

private void clearResultMap(XNode xNode, String namespace) {
    for (XNode resultChild : xNode.getChildren()) {
        if ("replacedociation".equals(resultChild.getName()) || "collection".equals(resultChild.getName()) || "case".equals(resultChild.getName())) {
            if (resultChild.getStringAttribute("select") == null) {
                configuration.getResultMapNames().remove(resultChild.getStringAttribute("id", resultChild.getValueBasedIdentifier()));
                configuration.getResultMapNames().remove(namespace + "." + resultChild.getStringAttribute("id", resultChild.getValueBasedIdentifier()));
                if (resultChild.getChildren() != null && !resultChild.getChildren().isEmpty()) {
                    clearResultMap(resultChild, namespace);
                }
            }
        }
    }
}

16 Source : MybatisMapperRefresh.java
with GNU Affero General Public License v3.0
from zhouhuan751312

/**
 * 清理resultMap
 *
 * @param list
 * @param namespace
 */
private void cleanResultMap(List<XNode> list, String namespace) {
    for (XNode resultMapNode : list) {
        String id = resultMapNode.getStringAttribute("id", resultMapNode.getValueBasedIdentifier());
        configuration.getResultMapNames().remove(id);
        configuration.getResultMapNames().remove(namespace + "." + id);
        clearResultMap(resultMapNode, namespace);
    }
}

16 Source : XMLMapperBuilder.java
with Apache License 2.0
from huifer

/**
 * 解析  parameterMap 标签的内容
 * <parameterMap id="hc" type="com.huifer.mybatis.enreplacedy.PersonQuery">
 * <parameter property="name" resultMap="base"/>
 * </parameterMap>
 *
 * @param list
 */
private void parameterMapElement(List<XNode> list) {
    for (XNode parameterMapNode : list) {
        // 获取标签属性值
        String id = parameterMapNode.getStringAttribute("id");
        String type = parameterMapNode.getStringAttribute("type");
        // 到别名map中注册
        Clreplaced<?> parameterClreplaced = resolveClreplaced(type);
        // 获取下级标签 parameter 的属性值
        List<XNode> parameterNodes = parameterMapNode.evalNodes("parameter");
        List<ParameterMapping> parameterMappings = new ArrayList<>();
        for (XNode parameterNode : parameterNodes) {
            // 遍历下级节点获取属性
            String property = parameterNode.getStringAttribute("property");
            String javaType = parameterNode.getStringAttribute("javaType");
            String jdbcType = parameterNode.getStringAttribute("jdbcType");
            String resultMap = parameterNode.getStringAttribute("resultMap");
            String mode = parameterNode.getStringAttribute("mode");
            String typeHandler = parameterNode.getStringAttribute("typeHandler");
            Integer numericScale = parameterNode.getIntAttribute("numericScale");
            ParameterMode modeEnum = resolveParameterMode(mode);
            Clreplaced<?> javaTypeClreplaced = resolveClreplaced(javaType);
            JdbcType jdbcTypeEnum = resolveJdbcType(jdbcType);
            Clreplaced<? extends TypeHandler<?>> typeHandlerClreplaced = resolveClreplaced(typeHandler);
            ParameterMapping parameterMapping = builderreplacedistant.buildParameterMapping(parameterClreplaced, property, javaTypeClreplaced, jdbcTypeEnum, resultMap, modeEnum, typeHandlerClreplaced, numericScale);
            parameterMappings.add(parameterMapping);
        }
        builderreplacedistant.addParameterMap(id, parameterClreplaced, parameterMappings);
    }
}

16 Source : XMLMapperBuilder.java
with Apache License 2.0
from huifer

/**
 * 创建一个 {@link  ResultMapping}
 * <resultMap id="base" type="com.huifer.mybatis.enreplacedy.Person">
 * <id column="ID" jdbcType="VARCHAR" property="id"/>
 * <result column="age" jdbcType="INTEGER" property="age"/>
 * <collection property="name" jdbcType="VARCHAR"/>
 * </resultMap>
 *
 * @param context
 * @param resultType
 * @param flags
 * @return
 * @throws Exception
 */
private ResultMapping buildResultMappingFromContext(XNode context, Clreplaced<?> resultType, List<ResultFlag> flags) throws Exception {
    String property;
    if (flags.contains(ResultFlag.CONSTRUCTOR)) {
        property = context.getStringAttribute("name");
    } else {
        property = context.getStringAttribute("property");
    }
    // 获取标签属性
    String column = context.getStringAttribute("column");
    String javaType = context.getStringAttribute("javaType");
    String jdbcType = context.getStringAttribute("jdbcType");
    String nestedSelect = context.getStringAttribute("select");
    String nestedResultMap = context.getStringAttribute("resultMap", processNestedResultMappings(context, Collections.emptyList(), resultType));
    String notNullColumn = context.getStringAttribute("notNullColumn");
    String columnPrefix = context.getStringAttribute("columnPrefix");
    String typeHandler = context.getStringAttribute("typeHandler");
    String resultSet = context.getStringAttribute("resultSet");
    String foreignColumn = context.getStringAttribute("foreignColumn");
    boolean lazy = "lazy".equals(context.getStringAttribute("fetchType", configuration.isLazyLoadingEnabled() ? "lazy" : "eager"));
    Clreplaced<?> javaTypeClreplaced = resolveClreplaced(javaType);
    Clreplaced<? extends TypeHandler<?>> typeHandlerClreplaced = resolveClreplaced(typeHandler);
    JdbcType jdbcTypeEnum = resolveJdbcType(jdbcType);
    // 构造一个 resultMap
    return builderreplacedistant.buildResultMapping(resultType, property, column, javaTypeClreplaced, jdbcTypeEnum, nestedSelect, nestedResultMap, notNullColumn, columnPrefix, typeHandlerClreplaced, flags, resultSet, foreignColumn, lazy);
}

16 Source : XMLMapperBuilder.java
with Apache License 2.0
from huifer

protected void validateCollection(XNode context, Clreplaced<?> enclosingType) {
    if ("collection".equals(context.getName()) && context.getStringAttribute("resultMap") == null && context.getStringAttribute("javaType") == null) {
        MetaClreplaced metaResultType = MetaClreplaced.forClreplaced(enclosingType, configuration.getReflectorFactory());
        String property = context.getStringAttribute("property");
        if (!metaResultType.hreplacedetter(property)) {
            throw new BuilderException("Ambiguous collection type for property '" + property + "'. You must specify 'javaType' or 'resultMap'.");
        }
    }
}

16 Source : XMLMapperBuilder.java
with Apache License 2.0
from huifer

/**
 * 解析 mapper 标签
 * <mapper resource="com/huifer/mybatis/mapper/PersonMapper.xml"/>
 * <mapper namespace="com.huifer.mybatis.mapper.PersonMapper">
 * <p>
 * <cache-ref namespace="com.huifer.mybatis.mapper.PersonMapper"/>
 * <resultMap id="base" type="com.huifer.mybatis.enreplacedy.Person">
 * <id column="ID" jdbcType="VARCHAR" property="id"/>
 * <result column="age" jdbcType="INTEGER" property="age"/>
 * </resultMap>
 *
 * <parameterMap id="hc" type="com.huifer.mybatis.enreplacedy.PersonQuery">
 * <parameter property="name" resultMap="base"/>
 * </parameterMap>
 * <sql id="Base_List">
 * name,age,phone,email,address
 * </sql>
 * <insert id="insert" parameterType="Person" keyProperty="id"
 * useGeneratedKeys="true">
 * INSERT INTO person (name, age, phone, email, address)
 * VALUES(#{name},#{age},#{phone},#{email},#{address})
 * </insert>
 * </mapper>
 *
 * @param context
 */
private void configurationElement(XNode context) {
    try {
        // 获取 namespace 属性
        String namespace = context.getStringAttribute("namespace");
        if (namespace == null || namespace.equals("")) {
            throw new BuilderException("Mapper's namespace cannot be empty");
        }
        // 直接设置 namespace 属性不做其他操作普通的 setter 方法
        builderreplacedistant.setCurrentNamespace(namespace);
        // <cache-ref namespace="com.huifer.mybatis.mapper.PersonMapper"/>
        cacheRefElement(context.evalNode("cache-ref"));
        // <cache blocking="" eviction="" flushInterval="" readOnly="" size="" type=""/>
        cacheElement(context.evalNode("cache"));
        // <parameterMap id="hc" type="com.huifer.mybatis.enreplacedy.PersonQuery">
        parameterMapElement(context.evalNodes("/mapper/parameterMap"));
        // <resultMap id="base" type="com.huifer.mybatis.enreplacedy.Person">
        resultMapElements(context.evalNodes("/mapper/resultMap"));
        // <sql id="Base_List">
        // name,age,phone,email,address
        // </sql>
        sqlElement(context.evalNodes("/mapper/sql"));
        // 解析 select|insert|update|delete 标签
        buildStatementFromContext(context.evalNodes("select|insert|update|delete"));
    } catch (Exception e) {
        throw new BuilderException("Error parsing Mapper XML. The XML location is '" + resource + "'. Cause: " + e, e);
    }
}

16 Source : XMLMapperBuilder.java
with Apache License 2.0
from huifer

/**
 * 解析 constructor 标签
 *
 * @param resultChild
 * @param resultType
 * @param resultMappings
 * @throws Exception
 */
private void processConstructorElement(XNode resultChild, Clreplaced<?> resultType, List<ResultMapping> resultMappings) throws Exception {
    List<XNode> argChildren = resultChild.getChildren();
    for (XNode argChild : argChildren) {
        List<ResultFlag> flags = new ArrayList<>();
        flags.add(ResultFlag.CONSTRUCTOR);
        if ("idArg".equals(argChild.getName())) {
            flags.add(ResultFlag.ID);
        }
        resultMappings.add(buildResultMappingFromContext(argChild, resultType, flags));
    }
}

16 Source : XMLMapperBuilder.java
with Apache License 2.0
from huifer

/**
 * 解析
 * <cache blocking="" eviction="" flushInterval="" readOnly="" size="" type=""/>
 * 具体缓存策略查看{@link org.apache.ibatis.cache.decorators} 下的类
 * 获取每个属性构造成 {@link  Cache}
 *
 * @param context
 */
private void cacheElement(XNode context) {
    if (context != null) {
        // org.apache.ibatis.cache.impl.PerpetualCache 默认缓存实现
        String type = context.getStringAttribute("type", "PERPETUAL");
        // 添加到别名,或者从别名中获取
        Clreplaced<? extends Cache> typeClreplaced = typeAliasRegistry.resolveAlias(type);
        // 緩存策略 LRU 最近最少使用的:移除最长时间不被使用的对象。
        String eviction = context.getStringAttribute("eviction", "LRU");
        Clreplaced<? extends Cache> evictionClreplaced = typeAliasRegistry.resolveAlias(eviction);
        // 刷新时间 单位 毫秒
        Long flushInterval = context.getLongAttribute("flushInterval");
        // 引用数量
        Integer size = context.getIntAttribute("size");
        // 只读
        boolean readWrite = !context.getBooleanAttribute("readOnly", false);
        // 
        boolean blocking = context.getBooleanAttribute("blocking", false);
        // <properties> 下级属性
        Properties props = context.getChildrenAsProperties();
        // 构造 cache
        builderreplacedistant.useNewCache(typeClreplaced, evictionClreplaced, flushInterval, size, readWrite, blocking, props);
    }
}

16 Source : XMLIncludeTransformer.java
with Apache License 2.0
from huifer

private Node findSqlFragment(String refid, Properties variables) {
    refid = PropertyParser.parse(refid, variables);
    refid = builderreplacedistant.applyCurrentNamespace(refid, true);
    try {
        XNode nodeToInclude = configuration.getSqlFragments().get(refid);
        return nodeToInclude.getNode().cloneNode(true);
    } catch (IllegalArgumentException e) {
        throw new IncompleteElementException("Could not find SQL statement to include with refid '" + refid + "'", e);
    }
}

16 Source : XMLConfigBuilder.java
with Apache License 2.0
from huifer

/**
 * 解析 typeHandler
 * 最终调用方法:{@link TypeHandlerRegistry#register(java.lang.reflect.Type, org.apache.ibatis.type.JdbcType, org.apache.ibatis.type.TypeHandler)}
 *
 * <typeHandlers>
 * <!--      <package name="com.huifer.mybatis.handler"/>-->
 * <typeHandler jdbcType="VARCHAR" javaType="String" handler="com.huifer.mybatis.handler.TestTypeHandler"/>
 * </typeHandlers>
 *
 * @param parent
 */
private void typeHandlerElement(XNode parent) {
    if (parent != null) {
        for (XNode child : parent.getChildren()) {
            if ("package".equals(child.getName())) {
                // 获取 package 的 name 属性
                String typeHandlerPackage = child.getStringAttribute("name");
                // 注册
                typeHandlerRegistry.register(typeHandlerPackage);
            } else {
                // 获取 javaType 属性值
                String javaTypeName = child.getStringAttribute("javaType");
                // 获取 jdbcType 属性值
                String jdbcTypeName = child.getStringAttribute("jdbcType");
                // 获取 handler 属性值
                String handlerTypeName = child.getStringAttribute("handler");
                // org.apache.ibatis.type.TypeAliasRegistry.TypeAliasRegistry 构造方法中有默认的
                // 从别名中获取
                Clreplaced<?> javaTypeClreplaced = resolveClreplaced(javaTypeName);
                JdbcType jdbcType = resolveJdbcType(jdbcTypeName);
                Clreplaced<?> typeHandlerClreplaced = resolveClreplaced(handlerTypeName);
                if (javaTypeClreplaced != null) {
                    if (jdbcType == null) {
                        typeHandlerRegistry.register(javaTypeClreplaced, typeHandlerClreplaced);
                    } else {
                        typeHandlerRegistry.register(javaTypeClreplaced, jdbcType, typeHandlerClreplaced);
                    }
                } else {
                    typeHandlerRegistry.register(typeHandlerClreplaced);
                }
            }
        }
    }
}

16 Source : XMLConfigBuilder.java
with Apache License 2.0
from huifer

/**
 * 别名加载
 * <typeAliases>
 * <!--    <package name="com.huifer.mybatis.enreplacedy"/>-->
 * <typeAlias type="com.huifer.mybatis.enreplacedy.Person" alias="Person"/>
 * </typeAliases>
 *
 * @param parent
 */
private void typeAliasesElement(XNode parent) {
    if (parent != null) {
        for (XNode child : parent.getChildren()) {
            if ("package".equals(child.getName())) {
                // 解析 package 标签
                String typeAliasPackage = child.getStringAttribute("name");
                configuration.getTypeAliasRegistry().registerAliases(typeAliasPackage);
            } else {
                // 解析 typeAliases 标签
                String alias = child.getStringAttribute("alias");
                String type = child.getStringAttribute("type");
                try {
                    // 将 type 中的全类名解析成字节码
                    Clreplaced<?> clazz = Resources.clreplacedForName(type);
                    // 别名注册
                    if (alias == null) {
                        typeAliasRegistry.registerAlias(clazz);
                    } else {
                        // 向 typeAliases put(别名名称,字节码)
                        typeAliasRegistry.registerAlias(alias, clazz);
                    }
                } catch (ClreplacedNotFoundException e) {
                    throw new BuilderException("Error registering typeAlias for '" + alias + "'. Cause: " + e, e);
                }
            }
        }
    }
}

16 Source : DynamicTableLanguageDriver.java
with MIT License
from gexiangdong

@Override
public SqlSource createSqlSource(Configuration configuration, XNode xNode, Clreplaced<?> parameterType) {
    logger.trace("createSqlSource({}, XNode: {}, {}", configuration, xNode, parameterType);
    return super.createSqlSource(configuration, xNode, parameterType);
}

16 Source : HierarchicalXMLConfigBuilder.java
with GNU Lesser General Public License v3.0
from Alfresco

private void typeAliasesElement(XNode parent) {
    if (parent != null) {
        for (XNode child : parent.getChildren()) {
            if ("package".equals(child.getName())) {
                String typeAliasPackage = child.getStringAttribute("name");
                configuration.getTypeAliasRegistry().registerAliases(typeAliasPackage);
            } else {
                String alias = child.getStringAttribute("alias");
                String type = child.getStringAttribute("type");
                try {
                    Clreplaced<?> clazz = Resources.clreplacedForName(type);
                    if (alias == null) {
                        typeAliasRegistry.registerAlias(clazz);
                    } else {
                        typeAliasRegistry.registerAlias(alias, clazz);
                    }
                } catch (ClreplacedNotFoundException e) {
                    throw new BuilderException("Error registering typeAlias for '" + alias + "'. Cause: " + e, e);
                }
            }
        }
    }
}

16 Source : HierarchicalXMLConfigBuilder.java
with GNU Lesser General Public License v3.0
from Alfresco

private void typeHandlerElement(XNode parent) throws Exception {
    if (parent != null) {
        for (XNode child : parent.getChildren()) {
            if ("package".equals(child.getName())) {
                String typeHandlerPackage = child.getStringAttribute("name");
                typeHandlerRegistry.register(typeHandlerPackage);
            } else {
                String javaTypeName = child.getStringAttribute("javaType");
                String jdbcTypeName = child.getStringAttribute("jdbcType");
                String handlerTypeName = child.getStringAttribute("handler");
                Clreplaced<?> javaTypeClreplaced = resolveClreplaced(javaTypeName);
                JdbcType jdbcType = resolveJdbcType(jdbcTypeName);
                Clreplaced<?> typeHandlerClreplaced = resolveClreplaced(handlerTypeName);
                if (javaTypeClreplaced != null) {
                    if (jdbcType == null) {
                        typeHandlerRegistry.register(javaTypeClreplaced, typeHandlerClreplaced);
                    } else {
                        typeHandlerRegistry.register(javaTypeClreplaced, jdbcType, typeHandlerClreplaced);
                    }
                } else {
                    typeHandlerRegistry.register(typeHandlerClreplaced);
                }
            }
        }
    }
}

15 Source : XMLMapperBuilder.java
with Apache License 2.0
from huifer

/**
 * @param resultMapNode
 * @param enclosingType
 * @return
 */
protected Clreplaced<?> inheritEnclosingType(XNode resultMapNode, Clreplaced<?> enclosingType) {
    if ("replacedociation".equals(resultMapNode.getName()) && resultMapNode.getStringAttribute("resultMap") == null) {
        String property = resultMapNode.getStringAttribute("property");
        if (property != null && enclosingType != null) {
            MetaClreplaced metaResultType = MetaClreplaced.forClreplaced(enclosingType, configuration.getReflectorFactory());
            return metaResultType.getSetterType(property);
        }
    } else if ("case".equals(resultMapNode.getName()) && resultMapNode.getStringAttribute("resultMap") == null) {
        return enclosingType;
    }
    return null;
}

15 Source : XMLConfigBuilder.java
with Apache License 2.0
from huifer

/**
 * 解析 dataSourceElement 标签
 * <dataSource type="POOLED">
 * <property name="driver" value="com.mysql.jdbc.Driver"/>
 * <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
 * <property name="username" value="root"/>
 * <property name="preplacedword" value="root"/>
 * </dataSource>
 *
 * @param context
 * @return
 * @throws Exception
 */
private DataSourceFactory dataSourceElement(XNode context) throws Exception {
    if (context != null) {
        String type = context.getStringAttribute("type");
        Properties props = context.getChildrenAsProperties();
        // org.apache.ibatis.session.Configuration.Configuration()
        DataSourceFactory factory = (DataSourceFactory) resolveClreplaced(type).getDeclaredConstructor().newInstance();
        // PooledDataSourceFactory -> UnpooledDataSourceFactory
        factory.setProperties(props);
        return factory;
    }
    throw new BuilderException("Environment declaration requires a DataSourceFactory.");
}

15 Source : HierarchicalXMLConfigBuilder.java
with GNU Lesser General Public License v3.0
from Alfresco

private DataSourceFactory dataSourceElement(XNode context) throws Exception {
    if (context != null) {
        String type = context.getStringAttribute("type");
        Properties props = context.getChildrenAsProperties();
        DataSourceFactory factory = (DataSourceFactory) resolveClreplaced(type).newInstance();
        factory.setProperties(props);
        return factory;
    }
    throw new BuilderException("Environment declaration requires a DataSourceFactory.");
}

14 Source : MybatisJpaXMLScriptBuilder.java
with Apache License 2.0
from zhouxx

protected MixedSqlNode parseDynamicTags(XNode node) {
    List<SqlNode> contents = new ArrayList<SqlNode>();
    NodeList children = node.getNode().getChildNodes();
    for (int i = 0; i < children.getLength(); i++) {
        XNode child = node.newXNode(children.item(i));
        if (child.getNode().getNodeType() == Node.CDATA_SECTION_NODE || child.getNode().getNodeType() == Node.TEXT_NODE) {
            String data = child.getStringBody("");
            TextSqlNode textSqlNode = new TextSqlNode(data);
            if (textSqlNode.isDynamic()) {
                contents.add(textSqlNode);
                isDynamic = true;
            } else {
                contents.add(new StaticTextSqlNode(data));
            }
        } else if (child.getNode().getNodeType() == Node.ELEMENT_NODE) {
            // issue #628
            String nodeName = child.getNode().getNodeName();
            MybatisJpaXMLScriptBuilder.NodeHandler handler = nodeHandlerMap.get(nodeName);
            if (handler == null) {
                throw new BuilderException("Unknown element <" + nodeName + "> in SQL statement.");
            }
            handler.handleNode(child, contents);
            isDynamic = true;
        }
    }
    return new MixedSqlNode(contents);
}

14 Source : XMLScriptBuilder.java
with Apache License 2.0
from huifer

/**
 *  <b>动态sql 的核心方法!!!</b>
 * <trim suffixOverrides="," prefix="(" suffix=")">
 *      <if test="userId != null">
 *          USER_ID,
 *        </if>
 *      <if test="goodId != null">
 *          GOOD_ID,
 *        </if>
 *      <if test="price != null">
 *          PRICE,
 *        </if>
 *      <if test="size != null">
 *          `SIZE`,
 *        </if>
 *      <if test="companyId != null">
 *          COMPANY_ID,
 *        </if>
 *      <if test="groupId != null">
 *          GROUP_ID,
 *        </if>
 *      <if test="version != null">
 *          VERSION,
 *        </if>
 *      <if test="deleted != null">
 *          DELETED,
 *        </if>
 *      <if test="createUser != null">
 *          CREATE_USER,
 *        </if>
 *      <if test="createTime != null">
 *          CREATE_TIME,
 *        </if>
 *      <if test="updateUser != null">
 *          UPDATE_USER,
 *        </if>
 *      <if test="updateTime != null">
 *          UPDATE_TIME,
 *        </if>
 *      <if test="workOrderId != null">
 *          WORK_ORDER_ID,
 *        </if>
 *  </trim>
 *  @param node
 *  @return
 */
protected MixedSqlNode parseDynamicTags(XNode node) {
    List<SqlNode> contents = new ArrayList<>();
    NodeList children = node.getNode().getChildNodes();
    for (int i = 0; i < children.getLength(); i++) {
        XNode child = node.newXNode(children.item(i));
        if (child.getNode().getNodeType() == Node.CDATA_SECTION_NODE || child.getNode().getNodeType() == Node.TEXT_NODE) {
            // 如果不包含其他标签或者是纯文本节点
            // data 是替换后sql文本
            String data = child.getStringBody("");
            TextSqlNode textSqlNode = new TextSqlNode(data);
            if (textSqlNode.isDynamic()) {
                contents.add(textSqlNode);
                isDynamic = true;
            } else {
                // 直接添加
                contents.add(new StaticTextSqlNode(data));
            }
        } else if (child.getNode().getNodeType() == Node.ELEMENT_NODE) {
            // issue #628
            // 动态标签处理逻辑
            String nodeName = child.getNode().getNodeName();
            // if 等标签
            NodeHandler handler = nodeHandlerMap.get(nodeName);
            if (handler == null) {
                throw new BuilderException("Unknown element <" + nodeName + "> in SQL statement.");
            }
            /**
             * 动态标签处理 {@link TrimHandler}
             */
            handler.handleNode(child, contents);
            isDynamic = true;
        }
    }
    return new MixedSqlNode(contents);
}

14 Source : XMLConfigBuilder.java
with Apache License 2.0
from huifer

/**
 * 加载 setting 标签
 *
 * <settings>
 * <setting name="cacheEnabled" value="true"/>
 * </settings>
 *
 * @param context
 * @return
 */
private Properties settingsAsProperties(XNode context) {
    if (context == null) {
        // 返回一个空的 Properties
        return new Properties();
    }
    Properties props = context.getChildrenAsProperties();
    // Check that all settings are known to the configuration clreplaced
    MetaClreplaced metaConfig = MetaClreplaced.forClreplaced(Configuration.clreplaced, localReflectorFactory);
    for (Object key : props.keySet()) {
        if (!metaConfig.hreplacedetter(String.valueOf(key))) {
            throw new BuilderException("The setting " + key + " is not known.  Make sure you spelled it correctly (case sensitive).");
        }
    }
    return props;
}

14 Source : XMLConfigBuilder.java
with Apache License 2.0
from huifer

/**
 * 记载 plugins 标签内容
 * <plugins>
 * <plugin interceptor="com.huifer.mybatis.plugins.TestPlugin">
 * <property name="testPlugins" value="tPl"/>
 * </plugin>
 * </plugins>
 *
 * @param parent
 * @throws Exception
 */
private void pluginElement(XNode parent) throws Exception {
    if (parent != null) {
        for (XNode child : parent.getChildren()) {
            // <plugin interceptor="com.huifer.mybatis.plugins.TestPlugin"> 获取 interceptor 值
            String interceptor = child.getStringAttribute("interceptor");
            // 获取plugin 下面的 property 标签数据
            Properties properties = child.getChildrenAsProperties();
            Interceptor interceptorInstance = (Interceptor) resolveClreplaced(interceptor).getDeclaredConstructor().newInstance();
            interceptorInstance.setProperties(properties);
            configuration.addInterceptor(interceptorInstance);
        }
    }
}

14 Source : XMLConfigBuilder.java
with Apache License 2.0
from huifer

/**
 * 解析 environments 标签
 * <environments default="development">
 * <environment id="development">
 * <transactionManager type="JDBC"/>
 * <dataSource type="POOLED">
 * <property name="driver" value="com.mysql.jdbc.Driver"/>
 * <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
 * <property name="username" value="root"/>
 * <property name="preplacedword" value="root"/>
 * </dataSource>
 * </environment>
 * </environments>
 *
 * @param context
 * @throws Exception
 */
private void environmentsElement(XNode context) throws Exception {
    if (context != null) {
        if (environment == null) {
            // environment 初始化的是就是空
            environment = context.getStringAttribute("default");
        }
        for (XNode child : context.getChildren()) {
            // 获取 environment 的 id
            String id = child.getStringAttribute("id");
            if (isSpecifiedEnvironment(id)) {
                // 解析 transactionManager
                // JdbcTransaction
                TransactionFactory txFactory = transactionManagerElement(child.evalNode("transactionManager"));
                // 解析 dataSource
                DataSourceFactory dsFactory = dataSourceElement(child.evalNode("dataSource"));
                // 获取数据库
                DataSource dataSource = dsFactory.getDataSource();
                // 构建
                Environment.Builder environmentBuilder = new Environment.Builder(id).transactionFactory(txFactory).dataSource(dataSource);
                // 在 configuration 设置
                configuration.setEnvironment(environmentBuilder.build());
            }
        }
    }
}

14 Source : XMLConfigBuilder.java
with Apache License 2.0
from huifer

/**
 * 解析 objectFactory 标签
 * <objectFactory type="com.huifer.mybatis.factory.TestObjectFactory">
 * <property name="data" value="100"/>
 * </objectFactory>
 *
 * @param context
 * @throws Exception
 */
private void objectFactoryElement(XNode context) throws Exception {
    if (context != null) {
        // 获取标签 objectFactory 中的 type 属性
        String type = context.getStringAttribute("type");
        Properties properties = context.getChildrenAsProperties();
        // 去别名 MAP 中获取实例
        ObjectFactory factory = (ObjectFactory) resolveClreplaced(type).getDeclaredConstructor().newInstance();
        // 设置属性值
        factory.setProperties(properties);
        // 在 configuration 中放入该工厂
        configuration.setObjectFactory(factory);
    }
}

See More Examples