Java实现软删除的5种方法及实战案例
引言
在Java开发中,软删除是一种常用的数据删除策略。它不是真正地删除数据,而是在数据表中添加一个字段,比如deleted,当需要删除数据时,只需将该字段的值设置为true。这种方法可以保留历史数据,方便后续的数据恢复和审计。本文将介绍五种Java实现软删除的方法,并附上实战案例。
方法一:使用注解
- 添加注解
在实体类上添加@Entity注解,并在字段上添加@Column注解,指定deleted字段。
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// ...其他字段...
@Column(name = "deleted", columnDefinition = "bit default 0")
private Boolean deleted;
}
- 实现软删除
在服务层实现软删除逻辑。
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public List<User> listUsers() {
return userRepository.findAllByDeleted(false);
}
}
方法二:使用自定义注解
- 定义注解
创建一个自定义注解@SoftDelete。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface SoftDelete {
String value() default "deleted";
}
- 使用注解
在实体类字段上使用自定义注解。
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// ...其他字段...
@SoftDelete
private Boolean deleted;
}
- 实现软删除
在服务层实现软删除逻辑。
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public List<User> listUsers() {
return userRepository.findAllByDeleted(false);
}
}
方法三:使用Lombok
- 添加依赖
在pom.xml中添加Lombok依赖。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
- 使用Lombok注解
在实体类字段上使用@Accessors(chain = true)和@ToString注解。
@Entity
@Accessors(chain = true)
@ToString
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// ...其他字段...
private Boolean deleted;
}
- 实现软删除
在服务层实现软删除逻辑。
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public List<User> listUsers() {
return userRepository.findAllByDeleted(false);
}
}
方法四:使用MyBatis
- 配置MyBatis
在mybatis-config.xml中配置实体类和映射文件。
<mapper namespace="com.example.mapper.UserMapper">
<resultMap id="userMap" type="com.example.entity.User">
<result column="id" property="id" />
<result column="username" property="username" />
<result column="deleted" property="deleted" />
</resultMap>
</mapper>
- 编写SQL语句
在映射文件中编写软删除的SQL语句。
<select id="listUsers" resultMap="userMap">
SELECT * FROM user WHERE deleted = 0
</select>
- 实现软删除
在服务层实现软删除逻辑。
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<User> listUsers() {
return userMapper.listUsers();
}
}
方法五:使用MyBatis-Plus
- 添加依赖
在pom.xml中添加MyBatis-Plus依赖。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.4</version>
</dependency>
- 配置MyBatis-Plus
在application.properties中配置数据源和相关参数。
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
- 实现软删除
在实体类上添加@TableLogic注解,并在服务层实现软删除逻辑。
@Entity
@TableLogic
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// ...其他字段...
}
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<User> listUsers() {
return userMapper.selectList(new QueryWrapper<User>().eq("deleted", 0));
}
}
总结
以上介绍了五种Java实现软删除的方法,包括使用注解、自定义注解、Lombok、MyBatis和MyBatis-Plus。每种方法都有其特点和适用场景,开发者可以根据实际需求选择合适的方法。在实际应用中,软删除可以提高数据安全性,方便数据恢复和审计。
