MyBatis-Plus UserMpper接口示例

UserMapper 接口示例

在 MyBatis-Plus 中,UserMapper 是一个非常简单但功能强大的接口。它通常长这样:

基本结构

java

java 复制代码
package com.example.mapper; // 根据你的项目结构调整包名

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.entity.User; // 你的User实体类所在的包
import org.apache.ibatis.annotations.Mapper;

// 使用@Mapper注解让Spring管理这个接口,并生成实现类
@Mapper
public interface UserMapper extends BaseMapper<User> {
    // 不需要写任何方法,就已经继承了BaseMapper中的所有CRUD方法
    
    // 但你也可以根据需要添加自定义方法
}

详细解释

1. 必需的组成部分

  • 继承 BaseMapper<T> :这是最关键的部分,通过继承并指定泛型类型为你的实体类(这里是 User),你的 UserMapper 就自动获得了 BaseMapper 中定义的约 20 个常用 CRUD 方法。

  • @Mapper 注解:这个注解告诉 MyBatis 这是一个映射器接口,Spring 启动时会自动为其创建代理实现类。

2. 完整的示例(包含实体类和配置)

为了让示例更完整,这里也展示一下相关的 User 实体类和 Spring Boot 配置:

User 实体类 (User.java)

java

kotlin 复制代码
package com.example.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableField;

// 指定实体类对应的数据库表名
@TableName("user")
public class User {
    // 主键字段
    @TableId
    private Long id;
    
    // 普通字段,如果字段名与数据库列名一致,可以不加注解
    private String name;
    
    private Integer age;
    
    // 如果数据库列名与字段名不一致,可以使用@TableField指定
    @TableField("email_address")
    private String email;
    
    // 省略构造函数、getter和setter方法...
    
    public User() {
    }
    
    public User(Long id, String name, Integer age, String email) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.email = email;
    }
    
    // getter 和 setter 方法
    public Long getId() {
        return id;
    }
    
    public void setId(Long id) {
        this.id = id;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    // 其他getter和setter...
}
Spring Boot 配置 (application.yml)

yaml

yaml 复制代码
# 数据源配置
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: your_username
    password: your_password

# MyBatis-Plus 配置
mybatis-plus:
  mapper-locations: classpath*:mapper/**/*.xml  # 如果有自定义XML查询文件,指定路径
  type-aliases-package: com.example.entity      # 实体类包路径
  configuration:
    map-underscore-to-camel-case: true          # 自动开启驼峰命名转换
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印SQL日志

3. 如何使用 UserMapper

在你的 Service 或 Controller 中,你可以直接注入 UserMapper 并使用它:

java

typescript 复制代码
package com.example.service;

import com.example.mapper.UserMapper;
import com.example.entity.User;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class UserService {
    
    @Autowired
    private UserMapper userMapper;
    
    public List<User> getAllUsers() {
        // 查询所有用户
        return userMapper.selectList(null);
    }
    
    public User getUserById(Long id) {
        // 根据ID查询用户
        return userMapper.selectById(id);
    }
    
    public List<User> getUsersByName(String name) {
        // 条件查询:使用Lambda表达式避免硬编码字段名
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        wrapper.like(User::getName, name);
        
        return userMapper.selectList(wrapper);
    }
    
    public int addUser(User user) {
        // 插入用户
        return userMapper.insert(user);
    }
    
    public int updateUser(User user) {
        // 更新用户
        return userMapper.updateById(user);
    }
    
    public int deleteUser(Long id) {
        // 删除用户
        return userMapper.deleteById(id);
    }
}

4. 自定义方法

虽然 BaseMapper 提供了丰富的通用方法,但有时你可能需要添加自定义查询:

java

less 复制代码
@Mapper
public interface UserMapper extends BaseMapper<User> {
    
    // 自定义查询方法:查询年龄大于指定值的用户
    @Select("SELECT * FROM user WHERE age > #{minAge}")
    List<User> selectUsersOlderThan(@Param("minAge") Integer minAge);
    
    // 或者使用XML配置的方式
    List<User> selectUsersByComplexCondition(Map<String, Object> params);
}

然后在 resources/mapper/UserMapper.xml 中:

xml

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
    
    <select id="selectUsersByComplexCondition" resultType="com.example.entity.User">
        SELECT * FROM user 
        WHERE name LIKE CONCAT('%', #{name}, '%')
        AND age BETWEEN #{minAge} AND #{maxAge}
    </select>
    
</mapper>

总结

UserMapper 接口的核心特点是:

  1. 继承 BaseMapper<User>,自动获得大量CRUD方法

  2. 使用 @Mapper 注解标记为MyBatis映射器

  3. 不需要编写任何实现代码,MyBatis-Plus会自动生成代理实现

  4. 可以添加自定义方法满足特定业务需求

这种设计极大地减少了传统MyBatis中需要编写的模板代码,让开发者能够更专注于业务逻辑的实现。

相关推荐
鬼火儿15 小时前
SpringBoot】Spring Boot 项目的打包配置
java·后端
cr7xin16 小时前
缓存三大问题及解决方案
redis·后端·缓存
间彧17 小时前
Kubernetes的Pod与Docker Compose中的服务在概念上有何异同?
后端
间彧17 小时前
从开发到生产,如何将Docker Compose项目平滑迁移到Kubernetes?
后端
间彧17 小时前
如何结合CI/CD流水线自动选择正确的Docker Compose配置?
后端
间彧17 小时前
在多环境(开发、测试、生产)下,如何管理不同的Docker Compose配置?
后端
间彧17 小时前
如何为Docker Compose中的服务配置健康检查,确保服务真正可用?
后端
间彧17 小时前
Docker Compose和Kubernetes在编排服务时有哪些核心区别?
后端
间彧17 小时前
如何在实际项目中集成Arthas Tunnel Server实现Kubernetes集群的远程诊断?
后端
brzhang18 小时前
读懂 MiniMax Agent 的设计逻辑,然后我复刻了一个MiniMax Agent
前端·后端·架构