在 Java 中,逻辑删除是一种常用的做法,它不会真正从数据库中删除记录,而是通过一个标记字段来标识记录是否被删除。这种方式可以保留数据历史,便于数据恢复。


下面是一个逻辑删除的实现示例:


首先,我们需要在实体类中添加一个表示删除状态的字段:


java

运行

import javax.persistence.*;@Entity
@Table(name = "user")
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String username;private String email;// 逻辑删除标记:0-未删除,1-已删除@Column(name = "is_deleted")private Integer isDeleted = 0;// 省略构造方法、getter和setterpublic User() {}public User(String username, String email) {this.username = username;this.email = email;}// getter和setter方法public Long getId() { return id; }public void setId(Long id) { this.id = id; }public String getUsername() { return username; }public void setUsername(String username) { this.username = username; }public String getEmail() { return email; }public void setEmail(String email) { this.email = email; }public Integer getIsDeleted() { return isDeleted; }public void setIsDeleted(Integer isDeleted) { this.isDeleted = isDeleted; }
}

































java实现逻辑删除举例_User


接下来是数据访问层(Repository):


java

运行

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;public interface UserRepository extends JpaRepository<User, Long> {// 查询未删除的用户@Query("SELECT u FROM User u WHERE u.isDeleted = 0")List<User> findAllNotDeleted();// 逻辑删除用户@Modifying@Transactional@Query("UPDATE User u SET u.isDeleted = 1 WHERE u.id = :id")void logicallyDelete(Long id);// 恢复被逻辑删除的用户@Modifying@Transactional@Query("UPDATE User u SET u.isDeleted = 0 WHERE u.id = :id")void restoreDeleted(Long id);
}


服务层实现:


java

运行

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;@Service
public class UserService {@Autowiredprivate UserRepository userRepository;// 获取所有未删除的用户public List<User> getAllUsers() {return userRepository.findAllNotDeleted();}// 逻辑删除用户public void deleteUser(Long id) {userRepository.logicallyDelete(id);}// 恢复被删除的用户public void restoreUser(Long id) {userRepository.restoreDeleted(id);}// 其他业务方法...
}


使用示例:


java

运行

public class UserController {@Autowiredprivate UserService userService;// 删除用户(逻辑删除)public void deleteUser(Long id) {userService.deleteUser(id);}// 获取所有有效用户(不包含已逻辑删除的)public List<User> getActiveUsers() {return userService.getAllUsers();}// 恢复误删的用户public void restoreUser(Long id) {userService.restoreUser(id);}
}


这种实现方式的优点:


  1. 保留了数据的完整性和历史记录
  2. 可以方便地恢复误删除的数据
  3. 不会破坏数据库的外键关联


在实际开发中,还可以结合 MyBatis-Plus 等框架,它提供了更便捷的逻辑删除功能,通过注解即可实现,无需手动编写 SQL。