使用 Mybatis-Plus 实现用户管理系统

在 Web 开发中,用户管理系统是一个常见的模块,涉及用户信息的存储、权限控制、角色管理等功能。Mybatis-Plus 作为 MyBatis 的增强工具,可以大幅减少 SQL 代码,提高开发效率。本文将介绍如何使用 Mybatis-Plus 快速构建一个完整的用户管理系统。


1. 用户实体类与数据库设计

在用户管理系统中,我们通常需要设计以下数据库表:

  • 用户表(user):存储用户的基本信息,如用户名、密码、邮箱、状态等。
  • 角色表(role):存储系统中的角色,如管理员、普通用户等。
  • 用户角色关联表(user_role):用于实现多对多的角色分配。

数据库表设计

CREATE TABLE `user` (
    `id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID',
    `username` VARCHAR(50) NOT NULL COMMENT '用户名',
    `password` VARCHAR(255) NOT NULL COMMENT '密码',
    `email` VARCHAR(100) COMMENT '邮箱',
    `status` TINYINT DEFAULT 1 COMMENT '用户状态(1:正常,0:禁用)',
    `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `update_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
);

CREATE TABLE `role` (
    `id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '角色ID',
    `role_name` VARCHAR(50) NOT NULL COMMENT '角色名称',
    `description` VARCHAR(255) COMMENT '角色描述'
);

CREATE TABLE `user_role` (
    `user_id` BIGINT NOT NULL COMMENT '用户ID',
    `role_id` BIGINT NOT NULL COMMENT '角色ID',
    PRIMARY KEY (`user_id`, `role_id`),
    FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON DELETE CASCADE,
    FOREIGN KEY (`role_id`) REFERENCES `role`(`id`) ON DELETE CASCADE
);

2. 实现常见的用户操作(增删改查)

2.1 用户实体类

@Data
@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String username;
    private String password;
    private String email;
    private Integer status;
    private LocalDateTime createTime;
    private LocalDateTime updateTime;
}

2.2 用户数据访问层(Mapper)

@Mapper
public interface UserMapper extends BaseMapper<User> {
}

2.3 用户服务层(Service)

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    // 查询所有用户
    public List<User> getAllUsers() {
        return userMapper.selectList(null);
    }

    // 根据ID查询用户
    public User getUserById(Long id) {
        return userMapper.selectById(id);
    }

    // 添加用户
    public boolean addUser(User user) {
        user.setPassword(encryptPassword(user.getPassword())); // 密码加密存储
        return userMapper.insert(user) > 0;
    }

    // 更新用户信息
    public boolean updateUser(User user) {
        return userMapper.updateById(user) > 0;
    }

    // 删除用户
    public boolean deleteUser(Long id) {
        return userMapper.deleteById(id) > 0;
    }

    // 密码加密方法
    private String encryptPassword(String password) {
        return new BCryptPasswordEncoder().encode(password);
    }
}

2.4 用户控制层(Controller)

@RestController
@RequestMapping("/users")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping
    public List<User> getAllUsers() {
        return userService.getAllUsers();
    }

    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        return userService.getUserById(id);
    }

    @PostMapping
    public boolean addUser(@RequestBody User user) {
        return userService.addUser(user);
    }

    @PutMapping
    public boolean updateUser(@RequestBody User user) {
        return userService.updateUser(user);
    }

    @DeleteMapping("/{id}")
    public boolean deleteUser(@PathVariable Long id) {
        return userService.deleteUser(id);
    }
}

3. 权限管理与角色分配

在用户管理系统中,通常需要控制不同用户的访问权限。可以使用 user_role 关联表来管理用户的角色关系,并在业务逻辑中进行权限控制。

3.1 角色实体类

@Data
@TableName("role")
public class Role {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String roleName;
    private String description;
}

3.2 用户角色关系实体类

@Data
@TableName("user_role")
public class UserRole {
    private Long userId;
    private Long roleId;
}

3.3 角色管理 Mapper

@Mapper
public interface RoleMapper extends BaseMapper<Role> {
}

@Mapper
public interface UserRoleMapper extends BaseMapper<UserRole> {
}

3.4 角色服务层(分配角色)

@Service
public class RoleService {
    @Autowired
    private RoleMapper roleMapper;
    @Autowired
    private UserRoleMapper userRoleMapper;

    // 分配角色给用户
    public boolean assignRole(Long userId, Long roleId) {
        UserRole userRole = new UserRole();
        userRole.setUserId(userId);
        userRole.setRoleId(roleId);
        return userRoleMapper.insert(userRole) > 0;
    }

    // 获取用户的角色
    public List<Role> getUserRoles(Long userId) {
        return roleMapper.selectList(
            new QueryWrapper<Role>()
                .inSql("id", "SELECT role_id FROM user_role WHERE user_id = " + userId)
        );
    }
}

3.5 角色管理接口

@RestController
@RequestMapping("/roles")
public class RoleController {
    @Autowired
    private RoleService roleService;

    @PostMapping("/assign")
    public boolean assignRole(@RequestParam Long userId, @RequestParam Long roleId) {
        return roleService.assignRole(userId, roleId);
    }

    @GetMapping("/user/{userId}")
    public List<Role> getUserRoles(@PathVariable Long userId) {
        return roleService.getUserRoles(userId);
    }
}

4. 用户管理功能的实现与优化

4.1 增加分页查询

public Page<User> getUsersWithPagination(int pageNum, int pageSize) {
    Page<User> page = new Page<>(pageNum, pageSize);
    return userMapper.selectPage(page, null);
}

4.2 增加用户名模糊查询

public List<User> searchUsersByName(String keyword) {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.like("username", keyword);
    return userMapper.selectList(queryWrapper);
}

4.3 软删除用户(逻辑删除)

@TableLogic
private Integer deleted;

使用逻辑删除后,删除操作将不会真正删除数据,而是修改 deleted 字段。

public boolean deleteUser(Long id) {
    return userMapper.deleteById(id) > 0;
}

4.4 Redis 缓存优化

4.4.1 查询用户时使用@Cacheable

@Cacheable 用于缓存查询结果,第一次执行时会执行数据库查询,并将结果存入 Redis,后续相同请求将直接从缓存读取,提高查询效率。

@Service
public class UserService{

    @Autowired
    private UserMapper userMapper;

    /**
     * 通过 ID 查询用户,并缓存结果
     * key:"user:{id}"
     */
    @Cacheable(value="user",key="#id")
    public User getUserById(Long id){
        return userMapper.selectById(id);
    }
}
  • value = “user”: 指定缓存名称,可以理解为 Redis 的 user 命名空间。
  • key=“#id”:缓存 key 为 user:{id},例如"user:1001"
  • 当 getUserById被调用时 如果redis 缓存有数据,直接返回,否则查询数据库并存入缓存。
4.4.2 修改用户后清除缓存

当用户信息被更新或删除时,缓存需要被清理,否则会导致数据不一致问题。@CacheEvict 用于移除特定缓存。
更新用户

/**
 * 更新用户信息,同时清除缓存
 */
@CacheEvict(value="user",key="#user.id")
public boolean updateUser(User user){
    return userMapper.updateById(user) > 0;
}
  • **@CacheEvict(value=“user”,key=“#user.id”)**作用
  • 当 updateUser(user)被调用时,会先执行数据库更新操作
  • 然后清除 Redis 中"user:{id}"缓存,使下次查询时重新加载数据

4.4.3 删除用户
/**
 * 删除用户,同时清除缓存
 */
@CacheEvict(value="user",key="#id")
public boolean deleteUser(Long id){
    return userMapper.deleteById(id) > 0;
}

@CacheEvict 确保当用户被删除时,Redis 缓存也被移除,避免查询到已删除的数据。

总结

本文介绍了如何使用 Mybatis-Plus 实现一个用户管理系统,包括:

  • 数据库表设计
  • 用户管理的增删改查
  • 角色管理与权限分配
  • 优化用户管理功能(分页、模糊查询、缓存)

通过 Mybatis-Plus,可以简化 SQL 编写,提高开发效率,使用户管理系统更加高效和易维护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值