当前位置:   article > 正文

【Mybatis】@Select与@Update注解写法总结

@select

目录

@Select简要

@Select写法详细

1. 基本查询

2. 动态查询

3. 返回 Map

4. 使用注解参数

5. 结果映射

6. 联合查询

7. 分页查询

总结

@Update简要

@Update详细

1. 简单的更新

2. 使用动态 SQL

3. 使用

4. 使用 @Param 注解

5. 使用动态 SQL 的 @If 注解

总结

往期推荐



MyBatis 中的 `@Select` 注解用于直接在接口方法上编写 SQL 语句,避免了使用 XML 映射文件。`@Select` 注解的使用使得 SQL 语句的编写更加直观,并且可以直接与接口方法关联,提高了开发效率和代码的可读性。

@Select简要

  1. //1. 基本查询
  2. @Select("SELECT * FROM users WHERE id = #{id}")
  3. User selectUserById(int id);
  4. //2. 动态查询
  5. @Select("<script>" +
  6. "SELECT * FROM users" +
  7. "<if test='id != null'>" +
  8. " WHERE id = #{id}" +
  9. "</if>" +
  10. "</script>")
  11. List<User> selectUsersById(@Param("id") Integer id);
  12. //3. 返回 Map
  13. @Select("SELECT * FROM users")
  14. @MapKey("id")
  15. Map<Integer, User> selectUsersAsMap();
  16. //4. 使用注解参数
  17. @Select("SELECT * FROM ${tableName}")
  18. List<User> selectUsersFromTable(@Param("tableName") String tableName);
  19. //5. 结果映射
  20. @Select("SELECT id, name, email FROM users WHERE id = #{id}")
  21. @Results({
  22. @Result(property = "id", column = "id"),
  23. @Result(property = "name", column = "name"),
  24. @Result(property = "email", column = "email")
  25. })
  26. User selectUserDetailedById(int id);
  27. //6. 联合查询
  28. @Select("SELECT u.id, u.name, a.city FROM users u INNER JOIN address a ON u.id = a.user_id WHERE u.id = #{id}")
  29. User selectUserWithAddress(int id);
  30. //7. 分页查询
  31. @Select("SELECT * FROM users LIMIT #{limit} OFFSET #{offset}")
  32. List<User> selectUsersByPage(@Param("limit") int limit, @Param("offset") int offset);
标题简单示例代码
基本查询@Select("SELECT * FROM users WHERE id = #{id}")<br>User selectUserById(int id);
动态查询@Select("<script>" +<br>"SELECT * FROM users" +<br>"<if test='id != null'>" +<br>" WHERE id = #{id}" +<br>"</if>" +<br>"</script>")<br>List<User> selectUsersById(@Param("id") Integer id);
返回 Map@Select("SELECT * FROM users")<br>@MapKey("id")<br>Map<Integer, User> selectUsersAsMap();
使用注解参数@Select("SELECT * FROM ${tableName}")<br>List<User> selectUsersFromTable(@Param("tableName") String tableName);
结果映射@Select("SELECT id, name, email FROM users WHERE id = #{id}")<br>@Results({<br>@Result(property = "id", column = "id"),<br>@Result(property = "name", column = "name"),<br>@Result(property = "email", column = "email")<br>})<br>User selectUserDetailedById(int id);
联合查询@Select("SELECT u.id, u.name, a.city FROM users u INNER JOIN address a ON u.id = a.user_id WHERE u.id = #{id}")<br>User selectUserWithAddress(int id);
分页查询@Select("SELECT * FROM users LIMIT #{limit} OFFSET #{offset}")<br>List<User> selectUsersByPage(@Param("limit") int limit, @Param("offset") int offset);

@Select写法详细

下面是使用 `@Select` 注解的一些常见写法:

1. 基本查询

直接在注解中写入 SQL 查询语句。

  1. @Select("SELECT * FROM users WHERE id = #{id}")
  2. User selectUserById(int id);

2. 动态查询

使用 MyBatis 的脚本特性来构建动态 SQL。

  1. @Select("<script>" +
  2. "SELECT * FROM users" +
  3. "<if test='id != null'>" +
  4. " WHERE id = #{id}" +
  5. "</if>" +
  6. "</script>")
  7. List<User> selectUsersById(@Param("id") Integer id);

在 MyBatis 中,使用 <script> 标签是为了支持更复杂的动态 SQL 语句。当你需要在注解中使用 MyBatis 的动态 SQL 功能(如条件判断、循环等)时,你需要告诉 MyBatis 解析器这是一段需要进行动态解析的 SQL 脚本。<script> 标签正是用于这个目的,它标识了一段可能包含动态 SQL 元素的查询。

在上述动态查询的例子中:

  1. @Select("<script>" +
  2. "SELECT * FROM users" +
  3. "<if test='id != null'>" +
  4. " WHERE id = #{id}" +
  5. "</if>" +
  6. "</script>")
  7. List<User> selectUsersById(@Param("id") Integer id);

<script> 标签包裹了整个 SQL 语句,并且内部使用了 <if> 标签来判断是否需要添加 WHERE 条件。如果你传递的参数 id 不为 null,MyBatis 会在生成的 SQL 语句中包含 WHERE id = #{id} 部分。如果 id 为 null,则不包含 WHERE 条件,从而实现了动态 SQL。

不使用 <script> 标签的情况下,MyBatis 无法识别注解中的动态 SQL 元素,因此无法正确解析和生成预期的 SQL 语句。在 XML 映射文件中,<select>、<update>、<delete>、<insert> 这些标签本身就提供了解析动态 SQL 的能力,因此不需要额外的 <script> 标签。但在注解中,你需要显式地使用 <script> 标签来启用这一功能。

3. 返回 Map

当需要返回键值对集合时,可以指定 `@MapKey` 来声明 Map 的键。

  1. @Select("SELECT * FROM users")
  2. @MapKey("id")
  3. Map<Integer, User> selectUsersAsMap();

4. 使用注解参数

可以通过注解参数来传递动态值,如数据库的 schema 名称。

  1. @Select("SELECT * FROM ${tableName}")
  2. List<User> selectUsersFromTable(@Param("tableName") String tableName);

5. 结果映射

如果查询的结果需要进行复杂的映射,可以使用 `@Results` 或 `@ResultMap` 注解。

  1. @Select("SELECT id, name, email FROM users WHERE id = #{id}")
  2. @Results({
  3. @Result(property = "id", column = "id"),
  4. @Result(property = "name", column = "name"),
  5. @Result(property = "email", column = "email")
  6. })
  7. User selectUserDetailedById(int id);

6. 联合查询

可以在注解中书写联合查询的 SQL 语句。

  1. @Select("SELECT u.id, u.name, a.city FROM users u INNER JOIN address a ON u.id = a.user_id WHERE u.id = #{id}")
  2. User selectUserWithAddress(int id);

7. 分页查询

结合 `@Param` 注解来实现分页。

  1. @Select("SELECT * FROM users LIMIT #{limit} OFFSET #{offset}")
  2. List<User> selectUsersByPage(@Param("limit") int limit, @Param("offset") int offset);

总结

使用 `@Select` 注解的好处是减少了 XML 文件的使用,使得 SQL 语句与 Java 代码紧密关联,易于维护。然而,对于非常复杂的 SQL 语句或动态查询,XML 映射文件可能会更加清晰和易于管理。在选择是否使用注解时,应考虑项目的需求和团队的偏好。

@Update简要

注解使用场景描述示例代码
简单的更新使用基础的 @Update 注解进行简单的字段更新。@Update("UPDATE table_name SET column1 = #{column1Value} WHERE id = #{id}")
使用动态 SQL使用 Java 的数组语法来构建动态的更新语句。@Update({"UPDATE table_name", "SET column1 = #{column1Value}", "WHERE id = #{id}"})
使用 <script> 标签对于复杂的更新操作,使用 <script> 标签来支持动态 SQL。@Update({"<script>", "UPDATE table_name", "<set>", "<if test='column1 != null'>column1 = #{column1},</if>", "<if test='column2 != null'>column2 = #{column2},</if>", "</set>", "WHERE id = #{id}", "</script>"})
使用 @Param 注解通过 @Param 注解给 SQL 语句中的参数命名,提高代码的可读性。@Update("UPDATE table_name SET column1 = #{value} WHERE id = #{id}")
动态 SQL 的 @If 注解使用 MyBatis 的 @If 注解来构建条件更新语句。@Update({"<script>", "UPDATE table_name", "<set>", "<if test='value != null'>", "column1 = #{value},", "</if>", "</set>", "WHERE id = #{id}", "</script>"})

@Update详细

使用 MyBatis 的 @Update 注解可以直接在接口方法上编写 SQL 更新语句,而不需要XML文件。下面是一些使用 @Update 注解的示例:

1. 简单的更新

  1. @Update("UPDATE table_name SET column1 = #{column1Value} WHERE id = #{id}")
  2. void updateColumn1ById(@Param("column1Value") String column1Value, @Param("id") int id);

2. 使用动态 SQL

MyBatis 提供了一些功能强大的注解,如 @Set,可以用来构建动态 SQL。

  1. @Update({
  2. "UPDATE table_name",
  3. "SET column1 = #{column1Value}",
  4. "WHERE id = #{id}"
  5. })
  6. void updateColumn1ById(@Param("column1Value") String column1Value, @Param("id") int id);

3. 使用 <script> 标签包裹复杂的 SQL

对于更复杂的更新操作,可以使用 <script> 标签来包裹 SQL 语句,从而支持动态 SQL 功能。

  1. @Update({
  2. "<script>",
  3. "UPDATE table_name",
  4. "<set>",
  5. "<if test='column1 != null'>column1 = #{column1},</if>",
  6. "<if test='column2 != null'>column2 = #{column2},</if>",
  7. "</set>",
  8. "WHERE id = #{id}",
  9. "</script>"
  10. })
  11. void updateTable(@Param("column1") String column1, @Param("column2") String column2, @Param("id") int id);

4. 使用 @Param 注解

当传递多个参数时,可以使用 @Param 注解给每个参数命名,这样在 SQL 语句中就可以直接引用这些名字。

  1. @Update("UPDATE table_name SET column1 = #{value} WHERE id = #{id}")
  2. void updateColumn1ById(@Param("value") String value, @Param("id") int id);

5. 使用动态 SQL 的 @If 注解

  1. @Update({
  2. "<script>",
  3. "UPDATE table_name",
  4. "<set>",
  5. "<if test='value != null'>",
  6. "column1 = #{value},",
  7. "</if>",
  8. "</set>",
  9. "WHERE id = #{id}",
  10. "</script>"
  11. })
  12. void updateColumn1ById(@Param("value") String value, @Param("id") int id);

总结

在 MyBatis 中使用 @Update 注解的好处是减少了XML配置的需要,使得 SQL 语句和 Java 代码更加紧密地集成在一起。这种方式适用于 SQL 语句相对简单的情况。对于更复杂的情况,如动态 SQL,仍然可以通过 <script> 标签来实现,但是这样的代码可读性和维护性可能会下降。因此,对于复杂的 SQL 操作,许多开发者仍然倾向于使用 XML 配置文件来管理 SQL 语句。

往期推荐

https://libusi.blog.csdn.net/article/details/135070117

https://libusi.blog.csdn.net/article/details/127355566

有用请点赞,养成良好习惯!

疑问、交流、鼓励请留言!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/114934
推荐阅读