快速上手MybatisPlus

本文详细介绍如何在SpringMVC项目中集成MyBatisPlus,包括依赖配置、代码生成器使用、配置启用流程及常见问题解答。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先附上mybatis-plus官方文档
本篇参考官方文档记录spring mvc项目接入mybatis plus的全流程及一些问题的解决方案,建议优先参考官方文档
开始之前,假设数据库已建好并已能正常访问

依赖配置

此处使用maven,gradle参考gradle依赖配置

核心依赖

查看最新版本

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus</artifactId>
    <version>3.1.0</version>
</dependency>

!!!注:如之前已引入mybatis相关依赖,请去除,mybatis plus会自行管理

代码生成器相关依赖

如不需要代码生成,请跳过

  • AutoGenerator 查看最新版本

    <dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>mybatis-plus-generator</artifactId>
      <version>3.1.0</version>
    </dependency>
    
  • 模版引擎,这里选择freemarker供生成器使用

    <dependency>
       <groupId>org.freemarker</groupId>
       <artifactId>freemarker</artifactId>
       <version>2.3.23</version>
    </dependency>
    
  • lombok,使用注解代替set-get方法

    <dependency>
       <groupId>org.projectlombok</groupId>
       <artifactId>lombok</artifactId>
       <version>1.18.2</version>
       <scope>provided</scope>
    </dependency>
    

代码生成

要使用此功能,需添加代码生成器相关依赖

代码生成器

根据官方代码改了个较为简洁方便适合懒人直接使用的生成器, 如需更多配置可查看官方生成器模版或参考文末附的全配置项自行配置

import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;


/**
 * @description: 代码生成器
 * @author: 04637@163.com
 * @date: 2019/3/3
 **/
public class CodeGenerator {

    public static void main(String[] args) {
        // ================= 必须修改的配置 start =================

        // 数据源配置
        String jdbcUrl = "jdbc:mysql://localhost:3306/deva?serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false&characterEncoding=utf8";
        String jdbcDriver = "com.mysql.cj.jdbc.Driver";
        String jdbcUsername = "root";
        String jdbcPassword = "123456";

        // 父级包名配置
        String parentPackage = "com.ty.mp";

        // 生成代码的 @author 值
        String author = "04637@163.com";

        // 要生成代码的表名配置
        String[] tables = {
                "question_info",
                "answer_info",
                "message_info",
        };

        // ================= 必须修改的配置 end =================




        AutoGenerator mpg = new AutoGenerator();
        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath + "/src/main/java");
        gc.setAuthor(author);
        gc.setBaseResultMap(true);
        gc.setBaseColumnList(true);
        // 生成完毕后是否打开输出目录
        gc.setOpen(false);
        // 为true时生成entity将继承Model类,单类即可完成基于单表的业务逻辑操作,按需开启
        gc.setActiveRecord(false);
        mpg.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl(jdbcUrl);
        dsc.setDriverName(jdbcDriver);
        dsc.setUsername(jdbcUsername);
        dsc.setPassword(jdbcPassword);
        mpg.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
        // 父级包名,按需修改
        pc.setParent(parentPackage);
        // 设置模块名, 会在parent包下生成一个指定的模块包
        pc.setModuleName(null);
        mpg.setPackageInfo(pc);


        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        strategy.setRestControllerStyle(false);
        strategy.setInclude(tables);
        strategy.setSuperEntityColumns("id");
        // Controller驼峰连字符,如开启,则requestMapping由 helloWorld 变为 hello-world 默认false
        strategy.setControllerMappingHyphenStyle(false);
        strategy.setTablePrefix(pc.getModuleName() + "_");
        // 开启后将使用lombok注解代替set-get方法,false则生成set-get方法
        strategy.setEntityLombokModel(true);
        // 在实体类中移除is前缀
        strategy.setEntityBooleanColumnRemoveIsPrefix(true);
        mpg.setStrategy(strategy);
        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        mpg.execute();
    }

}

执行后会生成这些文件

16817462-304b92c5205f59a4
生成结果

可将生成的xml放到resources目录或者配置xml目录为resource目录方便扫描

配置启用mybatis-plus

mapperScanner配置

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="你的mapper目录"/>
</bean>

sqlSessionFactory配置

<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="mapperLocations" value="mapper xml的资源路径"/>
</bean>

CRUD接口

mapper CRUD接口

生成的mapper接口会继承BaseMapper接口,查看mapper CRUD接口支持的操作

service CRUD接口

生成的service接口会继承 IService接口,查看service CRUD接口支持的操作

条件构造器

QueryWrapper<TagInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("uk_name", tagName);
TagInfo newTag = tagInfoMapper.selectOne(queryWrapper);

查看条件构造器所有条件写法

分页插件

待更新

问题记录及解决

生成的@Data @Accessors等注解是什么意思?

  • 有了@Data注解就无需再写那些get set方法了
  • @Accessors(chain = true) chain为true时,set方法会return该对象,false时则return void
  • @EqualsAndHashCode(callSuper = false) 会自动生成equals 和 hashCode方法,callSuper = false时不会用super的equals比较

已经有了@Data注解,却不能调用set get方法?

需要安装插件 IDEA为例:
File->settings->Plugins 查找lombok plugin安装

待更新

附:生成器全配置项

GlobalConfig 全局配置项

```
/**
 * 生成文件的输出目录【默认 D 盘根目录】
 */
private String outputDir = "D://";

/**
 * 是否覆盖已有文件
 */
private boolean fileOverride = false;

/**
 * 是否打开输出目录
 */
private boolean open = true;

/**
 * 是否在xml中添加二级缓存配置
 */
private boolean enableCache = false;

/**
 * 开发人员
 */
private String author;

/**
 * 开启 Kotlin 模式
 */
private boolean kotlin = false;

/**
 * 开启 swagger2 模式
 */
private boolean swagger2 = false;

/**
 * 开启 ActiveRecord 模式
 */
private boolean activeRecord = false;

/**
 * 开启 BaseResultMap
 */
private boolean baseResultMap = false;

/**
 * 时间类型对应策略
 */
private DateType dateType = DateType.TIME_PACK;

/**
 * 开启 baseColumnList
 */
private boolean baseColumnList = false;
/**
 * 各层文件名称方式,例如: %sAction 生成 UserAction
 * %s 为占位符
 */
private String entityName;
private String mapperName;
private String xmlName;
private String serviceName;
private String serviceImplName;
private String controllerName;
/**
 * 指定生成的主键的ID类型
 */
private IdType idType;
```

StrategyConfig策略配置项

```
/**
 * 是否大写命名
 */
private boolean isCapitalMode = false;
/**
 * 是否跳过视图
 */
private boolean skipView = false;
/**
 * 数据库表映射到实体的命名策略
 */
private NamingStrategy naming = NamingStrategy.no_change;
/**
 * 数据库表字段映射到实体的命名策略
 * <p>未指定按照 naming 执行</p>
 */
private NamingStrategy columnNaming = null;
/**
 * 表前缀
 */
@Setter(AccessLevel.NONE)
private String[] tablePrefix;
/**
 * 字段前缀
 */
@Setter(AccessLevel.NONE)
private String[] fieldPrefix;
/**
 * 自定义继承的Entity类全称,带包名
 */
@Setter(AccessLevel.NONE)
private String superEntityClass;
/**
 * 自定义基础的Entity类,公共字段
 */
@Setter(AccessLevel.NONE)
private String[] superEntityColumns;
/**
 * 自定义继承的Mapper类全称,带包名
 */
private String superMapperClass = ConstVal.SUPER_MAPPER_CLASS;
/**
 * 自定义继承的Service类全称,带包名
 */
private String superServiceClass = ConstVal.SUPER_SERVICE_CLASS;
/**
 * 自定义继承的ServiceImpl类全称,带包名
 */
private String superServiceImplClass = ConstVal.SUPER_SERVICE_IMPL_CLASS;
/**
 * 自定义继承的Controller类全称,带包名
 */
private String superControllerClass;
/**
 * 需要包含的表名,允许正则表达式(与exclude二选一配置)
 */
@Setter(AccessLevel.NONE)
private String[] include = null;
/**
 * 需要排除的表名,允许正则表达式
 */
@Setter(AccessLevel.NONE)
private String[] exclude = null;
/**
 * 【实体】是否生成字段常量(默认 false)<br>
 * -----------------------------------<br>
 * public static final String ID = "test_id";
 */
private boolean entityColumnConstant = false;
/**
 * 【实体】是否为构建者模型(默认 false)<br>
 * -----------------------------------<br>
 * public User setName(String name) { this.name = name; return this; }
 */
private boolean entityBuilderModel = false;
/**
 * 【实体】是否为lombok模型(默认 false)<br>
 * <a href="https://projectlombok.org/">document</a>
 */
private boolean entityLombokModel = false;
/**
 * Boolean类型字段是否移除is前缀(默认 false)<br>
 * 比如 : 数据库字段名称 : 'is_xxx',类型为 : tinyint. 在映射实体的时候则会去掉is,在实体类中映射最终结果为 xxx
 */
private boolean entityBooleanColumnRemoveIsPrefix = false;
/**
 * 生成 <code>@RestController</code> 控制器
 * <pre>
 *      <code>@Controller</code> -> <code>@RestController</code>
 * </pre>
 */
private boolean restControllerStyle = false;
/**
 * 驼峰转连字符
 * <pre>
 *      <code>@RequestMapping("/managerUserActionHistory")</code> -> <code>@RequestMapping("/manager-user-action-history")</code>
 * </pre>
 */
private boolean controllerMappingHyphenStyle = false;
/**
 * 是否生成实体时,生成字段注解
 */
private boolean entityTableFieldAnnotationEnable = false;
/**
 * 乐观锁属性名称
 */
private String versionFieldName;
/**
 * 逻辑删除属性名称
 */
private String logicDeleteFieldName;
/**
 * 表填充字段
 */
private List<TableFill> tableFillList = null;
```
### SpringBoot 和 MyBatis-Plus 快速入门 #### 项目依赖引入 为了快速使用 Spring Boot 和 MyBatis-Plus 开发接口,首先需要在项目的 `pom.xml` 文件中引入必要的依赖项。以下是常用的 Maven 配置: ```xml <dependencies> <!-- Spring Boot Starter Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- MyBatis Plus Starter --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.1</version> </dependency> <!-- MySQL Driver --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- Lombok (可选, 自动生成getter/setter等方法) --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies> ``` 以上配置包含了 Spring Boot 的基础功能模块、MyBatis-Plus 增强工具包以及数据库驱动程序[^1]。 --- #### 数据库连接配置 在 `application.yml` 或 `application.properties` 中完成数据库的连接设置。以下是一个典型的 YAML 配置示例: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: mapper-locations: classpath*:mapper/*.xml # 自定义 Mapper XML 文件路径 configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印 SQL 日志 ``` 上述配置指定了数据库 URL、用户名、密码以及其他参数,并设置了 MyBatis-Plus 的 Mapper 文件位置和日志打印方式[^3]。 --- #### 创建实体类 假设有一个名为 `User` 的表,其字段包括 `id`, `name`, 和 `age`。对应的 Java 实体类如下所示: ```java import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; @TableName("user") // 映射到 user 表 public class User { @TableField(value = "id", exist = true) private Long id; @TableField(value = "name", exist = true) private String name; @TableField(value = "age", exist = true) private Integer age; // Getter 和 Setter 方法省略(如果使用 Lombok,则无需手动编写) } ``` 通过注解的方式将实体类映射至数据库中的对应表格。 --- #### 定义 Mapper 接口 创建一个继承自 `BaseMapper<T>` 的 Mapper 接口即可获得基本 CRUD 功能的支持: ```java import com.baomidou.mybatisplus.core.mapper.BaseMapper; public interface UserMapper extends BaseMapper<User> { // 可在此扩展其他查询方法 } ``` 由于 MyBatis-Plus 提供了通用 Mapper 支持,因此不需要额外实现该接口的方法就可以直接调用内置的功能[^2]。 --- #### Service 层设计 通常会封装一层服务来处理业务逻辑。这里可以通过集成 `IService<T>` 来减少重复代码量: ```java @Service public class UserService implements IService<User> { @Autowired private UserMapper userMapper; public List<User> getAllUsers() { return userMapper.selectList(null); // 查询所有记录 } public boolean addUser(User user) { return userMapper.insert(user) > 0; // 插入新用户 } } ``` 此部分实现了简单的增删改查操作,其中利用了 MyBatis-Plus 提供的基础 API 进行交互。 --- #### 控制器层开发 最后一步是在控制器中暴露 RESTful 风格的 HTTP 请求入口点: ```java @RestController @RequestMapping("/users") public class UserController { @Autowired private UserService userService; @GetMapping("") public ResponseEntity<List<User>> getUsers() { List<User> users = userService.getAllUsers(); return ResponseEntity.ok(users); } @PostMapping("") public ResponseEntity<String> createUser(@RequestBody User user) { if (userService.addUser(user)) { return ResponseEntity.status(HttpStatus.CREATED).body("User created successfully."); } else { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Failed to create user."); } } } ``` 这段代码展示了如何基于前面的服务构建对外公开的 API 路径。 --- #### 测试运行效果 启动应用程序之后访问 `/users` 地址能够获取全部用户的列表;发送 POST 请求携带 JSON 格式的请求体会新增一条新的用户数据条目。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值