您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。