I use a tag in the mapper, and text in it contains some external #{} parameters:
<sql id="searchInInterval">
    (r01.start between to_date(#{${what}Date}, 'MMYYYY') and to_date(#{thirdDate}, 'MMYYYY'))
Later in the XML mapper, when I use it
<include refid="searchInInterval">
    <property name="what" value="first"/>
</include>
, what parameter will be parsed the first? # or $ one?
                        
${}(text substitution) is resolved first.In case
${}is inside a<sql />like your example, MyBatis tries to replace it when parsing the mapper file (i.e. during application startup).If there is no matching properties found [1] in this phase, MyBatis tries to replace it by looking up the runtime parameters when the statement is executed.
[1] In addition to the
<property />nested inside<include />, you can declare properties in the configuration as well.