赞
踩
目录
MyBatis 中的 `@Select` 注解用于直接在接口方法上编写 SQL 语句,避免了使用 XML 映射文件。`@Select` 注解的使用使得 SQL 语句的编写更加直观,并且可以直接与接口方法关联,提高了开发效率和代码的可读性。
- //1. 基本查询
- @Select("SELECT * FROM users WHERE id = #{id}")
- User selectUserById(int id);
-
- //2. 动态查询
- @Select("<script>" +
- "SELECT * FROM users" +
- "<if test='id != null'>" +
- " WHERE id = #{id}" +
- "</if>" +
- "</script>")
- List<User> selectUsersById(@Param("id") Integer id);
-
- //3. 返回 Map
- @Select("SELECT * FROM users")
- @MapKey("id")
- Map<Integer, User> selectUsersAsMap();
-
- //4. 使用注解参数
- @Select("SELECT * FROM ${tableName}")
- List<User> selectUsersFromTable(@Param("tableName") String tableName);
-
- //5. 结果映射
- @Select("SELECT id, name, email FROM users WHERE id = #{id}")
- @Results({
- @Result(property = "id", column = "id"),
- @Result(property = "name", column = "name"),
- @Result(property = "email", column = "email")
- })
- User selectUserDetailedById(int id);
-
- //6. 联合查询
- @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}")
- User selectUserWithAddress(int id);
-
- //7. 分页查询
- @Select("SELECT * FROM users LIMIT #{limit} OFFSET #{offset}")
- 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` 注解的一些常见写法:
直接在注解中写入 SQL 查询语句。
- @Select("SELECT * FROM users WHERE id = #{id}")
- User selectUserById(int id);
使用 MyBatis 的脚本特性来构建动态 SQL。
- @Select("<script>" +
- "SELECT * FROM users" +
- "<if test='id != null'>" +
- " WHERE id = #{id}" +
- "</if>" +
- "</script>")
- List<User> selectUsersById(@Param("id") Integer id);
在 MyBatis 中,使用 <script> 标签是为了支持更复杂的动态 SQL 语句。当你需要在注解中使用 MyBatis 的动态 SQL 功能(如条件判断、循环等)时,你需要告诉 MyBatis 解析器这是一段需要进行动态解析的 SQL 脚本。<script> 标签正是用于这个目的,它标识了一段可能包含动态 SQL 元素的查询。
在上述动态查询的例子中:
- @Select("<script>" +
- "SELECT * FROM users" +
- "<if test='id != null'>" +
- " WHERE id = #{id}" +
- "</if>" +
- "</script>")
- 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> 标签来启用这一功能。
当需要返回键值对集合时,可以指定 `@MapKey` 来声明 Map 的键。
- @Select("SELECT * FROM users")
- @MapKey("id")
- Map<Integer, User> selectUsersAsMap();
可以通过注解参数来传递动态值,如数据库的 schema 名称。
- @Select("SELECT * FROM ${tableName}")
- List<User> selectUsersFromTable(@Param("tableName") String tableName);
如果查询的结果需要进行复杂的映射,可以使用 `@Results` 或 `@ResultMap` 注解。
- @Select("SELECT id, name, email FROM users WHERE id = #{id}")
- @Results({
- @Result(property = "id", column = "id"),
- @Result(property = "name", column = "name"),
- @Result(property = "email", column = "email")
- })
- User selectUserDetailedById(int id);
可以在注解中书写联合查询的 SQL 语句。
- @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}")
- User selectUserWithAddress(int id);
结合 `@Param` 注解来实现分页。
- @Select("SELECT * FROM users LIMIT #{limit} OFFSET #{offset}")
- List<User> selectUsersByPage(@Param("limit") int limit, @Param("offset") int offset);
使用 `@Select` 注解的好处是减少了 XML 文件的使用,使得 SQL 语句与 Java 代码紧密关联,易于维护。然而,对于非常复杂的 SQL 语句或动态查询,XML 映射文件可能会更加清晰和易于管理。在选择是否使用注解时,应考虑项目的需求和团队的偏好。
注解使用场景 | 描述 | 示例代码 |
---|---|---|
简单的更新 | 使用基础的 @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>"}) |
使用 MyBatis 的 @Update 注解可以直接在接口方法上编写 SQL 更新语句,而不需要XML文件。下面是一些使用 @Update 注解的示例:
- @Update("UPDATE table_name SET column1 = #{column1Value} WHERE id = #{id}")
- void updateColumn1ById(@Param("column1Value") String column1Value, @Param("id") int id);
MyBatis 提供了一些功能强大的注解,如 @Set,可以用来构建动态 SQL。
- @Update({
- "UPDATE table_name",
- "SET column1 = #{column1Value}",
- "WHERE id = #{id}"
- })
- void updateColumn1ById(@Param("column1Value") String column1Value, @Param("id") int id);
<script>
标签包裹复杂的 SQL对于更复杂的更新操作,可以使用 <script> 标签来包裹 SQL 语句,从而支持动态 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>"
- })
- void updateTable(@Param("column1") String column1, @Param("column2") String column2, @Param("id") int id);
@Param
注解当传递多个参数时,可以使用 @Param 注解给每个参数命名,这样在 SQL 语句中就可以直接引用这些名字。
- @Update("UPDATE table_name SET column1 = #{value} WHERE id = #{id}")
- void updateColumn1ById(@Param("value") String value, @Param("id") int id);
@If
注解- @Update({
- "<script>",
- "UPDATE table_name",
- "<set>",
- "<if test='value != null'>",
- "column1 = #{value},",
- "</if>",
- "</set>",
- "WHERE id = #{id}",
- "</script>"
- })
- 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
有用请点赞,养成良好习惯!
疑问、交流、鼓励请留言!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。