Difference Between @Select and @Results in MyBatis

使用 GPT-4o-mini 回答Java Q&A Hub

問題:

What’s the difference between @Select and @Results annotations in MyBatis?

答案:

In MyBatis, both @Select and @Results annotations are used to define SQL queries and map the results to Java objects, but they serve different purposes.

@Select

  • Purpose: The @Select annotation is used to define a SQL SELECT statement directly in your mapper interface. It specifies the query that will be executed when the method is called.
  • Usage: You can use it to execute a simple query and retrieve results. It can return a single object, a list of objects, or a scalar value.
  • Example:
    @Select("SELECT * FROM users WHERE id = #{id}")
    User getUserById(int id);
    

@Results

  • Purpose: The @Results annotation is used to define how the results of a query should be mapped to the properties of a Java object. It is typically used in conjunction with @Select or other query annotations.
  • Usage: You can specify the mapping of columns in the result set to fields in the Java object, including handling complex mappings, nested objects, or custom property names.
  • Example:
    @Select("SELECT id, username, email FROM users WHERE id = #{id}")
    @Results({
        @Result(property = "userId", column = "id"),
        @Result(property = "userName", column = "username"),
        @Result(property = "userEmail", column = "email")
    })
    User getUserById(int id);
    

Summary

  • Use @Select to define the SQL query.
  • Use @Results to define how the result set maps to the Java object properties.
  • They can be used together to create a complete mapping for your queries.

In practice, if your query results match the property names of your Java object, you may not need to use @Results at all, as MyBatis can automatically map the results based on naming conventions. However, @Results becomes essential when you need to customize the mapping.