您好,登录后才能下订单哦!
密码登录
            
            
            
            
        登录注册
            
            
            
        点击 登录注册 即表示同意《亿速云用户服务条款》
        # 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>
public class User {
    private Integer id;
    private String username;
    private String password;
    private String email;
    // 省略getter/setter
}
单条查询示例:
@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);
基本插入:
@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);
基本更新:
@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);
基本删除:
@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);
当数据库字段与实体类属性不一致时:
@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);
@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);
@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);
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);
@Update("<script>" +
        "UPDATE user " +
        "<set>" +
        "<if test='username!=null'>username=#{username},</if>" +
        "<if test='password!=null'>password=#{password},</if>" +
        "</set>" +
        "WHERE id=#{id}" +
        "</script>")
int updateUserSelective(User user);
MyBatis注解方式默认自动提交,需要手动控制事务:
// Spring环境下使用@Transactional
@Transactional
public void transferMoney(int fromId, int toId, BigDecimal amount) {
    userMapper.deductMoney(fromId, amount);
    userMapper.addMoney(toId, amount);
}
注解选择原则:
性能考虑:
维护建议:
常见问题:
MyBatis注解方式为开发者提供了更简洁的SQL编写方式,特别适合简单的CRUD操作。通过合理使用各种注解,可以显著提高开发效率。但对于复杂业务场景,仍建议结合XML配置方式使用,以达到最佳的可维护性和灵活性。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。