Mybatis中怎么实现注解增删改查操作

发布时间:2021-08-05 16:26:44 作者:Leah
来源:亿速云 阅读:134
# Mybatis中怎么实现注解增删改查操作

## 一、MyBatis注解概述

MyBatis作为一款优秀的持久层框架,除了支持传统的XML配置方式外,还提供了基于注解的SQL映射方式。注解方式相比XML具有以下特点:

1. **开发效率高**:SQL直接写在接口方法上,减少文件切换
2. **代码直观**:SQL与Java代码在一起,便于理解
3. **维护方便**:修改时无需查找对应XML文件
4. **适合简单场景**:对于复杂SQL仍建议使用XML方式

### 常用注解分类

| 注解类型       | 主要注解                          |
|----------------|----------------------------------|
| CRUD操作       | @Select, @Insert, @Update, @Delete |
| 参数处理       | @Param, @Options                 |
| 结果映射       | @Results, @Result                |
| 动态SQL        | @SelectProvider等                |

## 二、环境准备

### 1. 添加依赖

```xml
<!-- MyBatis核心依赖 -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.6</version>
</dependency>

<!-- 数据库驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.23</version>
</dependency>

2. 实体类准备

public class User {
    private Integer id;
    private String username;
    private String password;
    private String email;
    // 省略getter/setter
}

三、基础CRUD注解实现

1. 查询操作(@Select)

单条查询示例:

@Select("SELECT * FROM user WHERE id = #{id}")
User getUserById(Integer id);

多条查询示例:

@Select("SELECT * FROM user WHERE username LIKE CONCAT('%',#{name},'%')")
List<User> getUsersByName(String name);

参数传递技巧: - 单个参数:直接使用#{参数名} - 多个参数:使用@Param注解

@Select("SELECT * FROM user WHERE username=#{name} AND password=#{pwd}")
User login(@Param("name") String username, @Param("pwd") String password);

2. 插入操作(@Insert)

基本插入:

@Insert("INSERT INTO user(username,password,email) VALUES(#{username},#{password},#{email})")
int addUser(User user);

返回自增主键:

@Insert("INSERT INTO user(username,password) VALUES(#{username},#{password})")
@Options(useGeneratedKeys = true, keyProperty = "id")
int insertUser(User user);

批量插入:

@Insert("<script>" +
        "INSERT INTO user(username,password) VALUES " +
        "<foreach collection='list' item='item' separator=','>" +
        "(#{item.username},#{item.password})" +
        "</foreach>" +
        "</script>")
int batchInsert(@Param("list") List<User> users);

3. 更新操作(@Update)

基本更新:

@Update("UPDATE user SET username=#{username}, email=#{email} WHERE id=#{id}")
int updateUser(User user);

条件更新:

@Update("<script>" +
        "UPDATE user " +
        "<set>" +
        "<if test='username!=null'>username=#{username},</if>" +
        "<if test='email!=null'>email=#{email},</if>" +
        "</set>" +
        "WHERE id=#{id}" +
        "</script>")
int updateUserSelective(User user);

4. 删除操作(@Delete)

基本删除:

@Delete("DELETE FROM user WHERE id=#{id}")
int deleteUser(Integer id);

批量删除:

@Delete("<script>" +
        "DELETE FROM user WHERE id IN " +
        "<foreach collection='ids' item='id' open='(' separator=',' close=')'>" +
        "#{id}" +
        "</foreach>" +
        "</script>")
int batchDelete(@Param("ids") List<Integer> ids);

四、高级映射与结果处理

1. 结果映射(@Results)

当数据库字段与实体类属性不一致时:

@Results({
    @Result(property = "id", column = "user_id"),
    @Result(property = "username", column = "user_name"),
    @Result(property = "password", column = "user_pwd")
})
@Select("SELECT user_id, user_name, user_pwd FROM t_user WHERE id=#{id}")
User getSpecialUser(Integer id);

2. 一对一关联查询

@Results({
    @Result(property = "id", column = "id"),
    @Result(property = "order", column = "order_id", 
            one = @One(select = "com.mapper.OrderMapper.getOrderById"))
})
@Select("SELECT * FROM user WHERE id=#{id}")
User getUserWithOrder(Integer id);

3. 一对多关联查询

@Results({
    @Result(property = "id", column = "id"),
    @Result(property = "articles", column = "id",
            many = @Many(select = "com.mapper.ArticleMapper.getByUserId"))
})
@Select("SELECT * FROM user WHERE id=#{id}")
User getUserWithArticles(Integer id);

五、动态SQL实现

1. @SelectProvider方式

public class UserSqlProvider {
    public String getUsersByCondition(User condition) {
        return new SQL() {{
            SELECT("*");
            FROM("user");
            if (condition.getUsername() != null) {
                WHERE("username LIKE CONCAT('%',#{username},'%')");
            }
            if (condition.getEmail() != null) {
                WHERE("email = #{email}");
            }
        }}.toString();
    }
}

@SelectProvider(type = UserSqlProvider.class, method = "getUsersByCondition")
List<User> getUsersByCondition(User condition);

2. 注解内使用