1 /*
2 * Copyright 2015-2022 the original author or authors.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * https://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package org.mybatis.scripting.freemarker;
17
18 import java.util.List;
19
20 import org.apache.ibatis.annotations.Lang;
21 import org.apache.ibatis.annotations.Param;
22 import org.apache.ibatis.annotations.Select;
23
24 /**
25 * Annotations-driven mapper for {@link org.mybatis.scripting.freemarker.FreeMarkerInAnnotationsTest}.
26 *
27 * @author elwood
28 */
29 public interface NameMapper {
30 /**
31 * Simple query that is loaded from template.
32 */
33 @Lang(FreeMarkerLanguageDriver.class)
34 @Select("getAllNames.ftl")
35 List<Name> getAllNames();
36
37 /**
38 * Simple query with prepared statement parameter.
39 */
40 @Lang(FreeMarkerLanguageDriver.class)
41 @Select("findName.ftl")
42 Name findName(@Param("name") String name);
43
44 /**
45 * If any whitespace found inside @Select text, it is interpreted as inline script, not template name. It is
46 * convenient to avoid creating templates when script is really small.
47 */
48 @Lang(FreeMarkerLanguageDriver.class)
49 @Select("select * from names where id in (${ids?join(',')})")
50 List<Name> findNamesByIds(@Param("ids") List<Integer> ids);
51
52 /**
53 * There are no @Param annotation on argument. This means NameParam instance will be passed into driver as is, not as
54 * Map entry. So, we need to support this case. Because in driver we need to add some another properties into template
55 * model, and NameParam is not Map, we are need to wrap passed parameter object into
56 * {@link org.mybatis.scripting.freemarker.ParamObjectAdapter} before processing template.
57 */
58 @Lang(FreeMarkerLanguageDriver.class)
59 @Select("select * from names where id = <@p name='id'/> and id = ${id}")
60 Name find(NameParam nameParam);
61
62 /**
63 * This query is to demonstrate MyBatis odd behaviour when using String as parameter and can use properties that not
64 * exist. Both props will be use provided `name` parameter value. Goal is to write FreeMarker lang plugin to support
65 * this behaviour too (although it is confusing one).
66 */
67 @Select("select * from names" + " where firstName = #{noSuchPropertyOnString}"
68 + " or firstName = #{oneMoreUnexistingProperty}")
69 List<Name> getNamesOddBehaviourStdLang(String name);
70
71 /**
72 * This query is to demonstrate that FreeMarker does not break the compatibility with this behaviour.
73 */
74 @Lang(FreeMarkerLanguageDriver.class)
75 @Select("select * from names" + " where firstName = <@p name='noSuchPropertyOnString'/>"
76 + " or firstName = <@p name='oneMoreUnexistingProperty'/>")
77 List<Name> getNamesOddBehaviourFreeMarkerLang(String name);
78 }