View Javadoc
1   /*
2    *    Copyright 2009-2024 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.apache.ibatis.annotations;
17  
18  import java.lang.annotation.Documented;
19  import java.lang.annotation.ElementType;
20  import java.lang.annotation.Repeatable;
21  import java.lang.annotation.Retention;
22  import java.lang.annotation.RetentionPolicy;
23  import java.lang.annotation.Target;
24  
25  /**
26   * The annotation that specify an SQL for retrieving record(s).
27   * <p>
28   * <b>How to use:</b>
29   * <p>
30   * <ul>
31   * <li>Simple:
32   *
33   * <pre>{@code
34   * public interface UserMapper {
35   *   @Select("SELECT id, name FROM users WHERE id = #{id}")
36   *   User selectById(int id);
37   * }
38   * }</pre>
39   *
40   * </li>
41   * <li>Dynamic SQL:
42   *
43   * <pre>{@code
44   * public interface UserMapper {
45   *   @Select({ "<script>", "select * from users", "where name = #{name}",
46   *       "<if test=\"age != null\"> age = #{age} </if>", "</script>" })
47   *   User select(@NotNull String name, @Nullable Intger age);
48   * }
49   * }</pre>
50   *
51   * </li>
52   * </ul>
53   *
54   * @author Clinton Begin
55   *
56   * @see <a href="https://mybatis.org/mybatis-3/dynamic-sql.html">How to use Dynamic SQL</a>
57   */
58  @Documented
59  @Retention(RetentionPolicy.RUNTIME)
60  @Target(ElementType.METHOD)
61  @Repeatable(Select.List.class)
62  public @interface Select {
63    /**
64     * Returns an SQL for retrieving record(s).
65     *
66     * @return an SQL for retrieving record(s)
67     */
68    String[] value();
69  
70    /**
71     * @return A database id that correspond this statement
72     *
73     * @since 3.5.5
74     */
75    String databaseId() default "";
76  
77    /**
78     * Returns whether this select affects DB data.<br>
79     * e.g. RETURNING of PostgreSQL or OUTPUT of MS SQL Server.
80     *
81     * @return {@code true} if this select affects DB data; {@code false} if otherwise
82     *
83     * @since 3.5.12
84     */
85    boolean affectData() default false;
86  
87    /**
88     * The container annotation for {@link Select}.
89     *
90     * @author Kazuki Shimizu
91     *
92     * @since 3.5.5
93     */
94    @Documented
95    @Retention(RetentionPolicy.RUNTIME)
96    @Target(ElementType.METHOD)
97    @interface List {
98      Select[] value();
99    }
100 
101 }