7.4 MyBatis-Plus扩展功能

面试重要程度:⭐⭐⭐⭐

常见提问方式:代码生成器使用、条件构造器、分页插件配置

预计阅读时间:25分钟

开场白

兄弟,MyBatis-Plus绝对是提升开发效率的神器!在面试中,如果你能展现出对MP的深度理解,绝对是加分项。特别是它的条件构造器和代码生成器,能让面试官看出你对现代化开发工具的掌握。

今天我们就把MyBatis-Plus的核心功能全部搞定,让你在面试中展现出对开发效率工具的深度理解。

🛠️ 代码生成器

快速生成基础代码

面试加分项:

面试官:"你们项目中如何提升开发效率?用过哪些代码生成工具?"

代码生成器配置:

// MyBatis-Plus 3.5.x 版本代码生成器
public class CodeGenerator {
    
    public static void main(String[] args) {
        // 1. 数据源配置
        FastAutoGenerator.create("jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8", 
                                "root", "password")
                // 2. 全局配置
                .globalConfig(builder -> {
                    builder.author("developer")                    // 作者
                           .enableSwagger()                        // 开启swagger模式
                           .outputDir(System.getProperty("user.dir") + "/src/main/java") // 输出目录
                           .commentDate("yyyy-MM-dd")              // 注释日期格式
                           .disableOpenDir();                      // 禁止打开输出目录
                })
                // 3. 包配置
                .packageConfig(builder -> {
                    builder.parent("com.example")                 // 父包名
                           .entity("entity")                       // 实体类包名
                           .mapper("mapper")                       // Mapper包名
                           .service("service")                     // Service包名
                           .serviceImpl("service.impl")            // ServiceImpl包名
                           .controller("controller")               // Controller包名
                           .xml("mapper.xml");                     // XML文件包名
                })
                // 4. 策略配置
                .strategyConfig(builder -> {
                    builder.addInclude("user", "order", "product") // 需要生成的表名
                           .addTablePrefix("t_", "tb_")            // 过滤表前缀
                           
                           // Entity策略配置
                           .entityBuilder()
                           .enableLombok()                         // 启用Lombok
                           .enableTableFieldAnnotation()           // 启用字段注解
                           .naming(NamingStrategy.underline_to_camel)     // 数据库表映射到实体的命名策略
                           .columnNaming(NamingStrategy.underline_to_camel) // 字段映射命名策略
                           .addSuperEntityColumns("id", "create_time", "update_time") // 父类公共字段
                           .enableActiveRecord()                   // 启用ActiveRecord模式
                           .versionColumnName("version")           // 乐观锁字段名
                           .logicDeleteColumnName("deleted")       // 逻辑删除字段名
                           .enableChainModel()                     // 启用链式模型
                           
                           // Mapper策略配置
                           .mapperBuilder()
                           .enableMapperAnnotation()               // 启用@Mapper注解
                           .enableBaseResultMap()                  // 启用BaseResultMap
                           .enableBaseColumnList()                 // 启用BaseColumnList
                           
                           // Service策略配置
                           .serviceBuilder()
                           .formatServiceFileName("%sService")     // Service接口名格式
                           .formatServiceImplFileName("%sServiceImpl") // ServiceImpl名格式
                           
                           // Controller策略配置
                           .controllerBuilder()
                           .enableRestStyle()                      // 启用RestController
                           .enableHyphenStyle();                   // 启用驼峰转连字符
                })
                // 5. 模板引擎配置
                .templateEngine(new FreemarkerTemplateEngine())
                // 6. 执行生成
                .execute();
    }
}

生成的代码示例:

// 生成的Entity
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("user")
@ApiModel(value="User对象", description="用户表")
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "主键ID")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    @ApiModelProperty(value = "用户名")
    @TableField("username")
    private String username;

    @ApiModelProperty(value = "邮箱")
    @TableField("email")
    private String email;

    @ApiModelProperty(value = "状态")
    @TableField("status")
    private Integer status;

    @ApiModelProperty(value = "创建时间")
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    @ApiModelProperty(value = "更新时间")
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    @ApiModelProperty(value = "逻辑删除")
    @TableField("deleted")
    @TableLogic
    private Integer deleted;

    @ApiModelProperty(value = "版本号")
    @TableField("version")
    @Version
    private Integer version;
}

// 生成的Mapper
@Mapper
public interface UserMapper extends BaseMapper<User> {
    
    // 自定义查询方法
    List<User> selectUserWithOrders(@Param("userId") Long userId);
    
    // 分页查询
    IPage<User> selectUserPage(Page<User> page, @Param("query") UserQuery query);
}

// 生成的Service
public interface UserService extends IService<User> {
    
    // 自定义业务方法
    boolean registerUser(UserRegisterDTO registerDTO);
    
    PageResult<UserVO> pageUsers(UserQuery query);
}

🔍 条件构造器

强大的查询构建能力

面试重点:

面试官:"MyBatis-Plus的条件构造器有什么优势?如何避免SQL注入?"

QueryWrapper使用:

@Service
public class UserQueryService {
    
    @Autowired
    private UserMapper userMapper;
    
    // 

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

Java面试圣经 文章被收录于专栏

Java面试圣经,带你练透java圣经

全部评论
欢迎讨论
点赞 回复 分享
发布于 09-06 11:27 江西
坐标南京,OD岗位多多,欢迎私聊
点赞 回复 分享
发布于 08-23 15:37 贵州

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务