0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MyBatis-Plus的使用与测试

Android编程精选 来源:稀土掘金威廉希尔官方网站 社区 作者:我犟不过你 2022-08-22 11:56 次阅读

本文主要介绍mybatis-plus这款插件,针对springboot用户。包括引入,配置,使用,以及扩展等常用的方面做一个汇总整理,尽量包含大家常用的场景内容。

关于mybatis-plus是什么,不多做介绍了,看官方文档:baomidou.com ,咱们直接代码撸起来。

一、快速开始

本文基于springboot、maven、jdk1.8、mysql开发,所以开始前我们需要准备好这套环境。我的环境使用了nacos作为注册中心,不了解或需要搭建的参考:https://juejin.cn/post/7053977860612030477

新建如下数据库:

398240ba-205d-11ed-ba43-dac502259ad0.jpg

建议大家选择utf8mb4这种字符集,做过微信的同学应该会知道,微信用户名称的表情,是需要这种字符集才能存储的。

我就默认其他环境已经准备好了,咱们直接从mybatis-plus开始。

1.1 依赖准备

想要什么依赖版本的去maven仓库查看:https://mvnrepository.com/

引入mybatis-plus依赖:

<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>3.5.0version>
dependency>

引入mysql依赖:

<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.27version>
dependency>

目前,多数项目会有多数据源的要求,或者是主从部署的要求,所以我们还需要引入mybatis-plus关于多数据源的依赖:


<dependency>
<groupId>com.baomidougroupId>
<artifactId>dynamic-datasource-spring-boot-starterartifactId>
<version>3.5.0version>
dependency>

1.2 配置准备

springboot启动类。配置@MapperScan注解,用于扫描Mapper文件位置:

importorg.mybatis.spring.annotation.MapperScan;
importorg.springframework.boot.SpringApplication;
importorg.springframework.boot.autoconfigure.SpringBootApplication;
importorg.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient
@MapperScan("com.wjbgn.user.mapper")
@SpringBootApplication
publicclassRobNecessitiesUserApplication{

publicstaticvoidmain(String[]args){
SpringApplication.run(RobNecessitiesUserApplication.class,args);
}

}

数据源配置,此处配置一主一从的环境,当前我只有一台,所以此处配置一样的:

spring:
datasource:
dynamic:
primary:master#设置默认的数据源或者数据源组,默认值即为master
strict:false#严格匹配数据源,默认false.true未匹配到指定数据源时抛异常,false使用默认数据源
datasource:
master:
url:jdbc//127.0.0.1:3306/rob_necessities?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username:root
password:123456
slave_1:
url:jdbc//127.0.0.1:3306/rob_necessities?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username:root
password:123456

补充:这里面因为默认使用的是HikariCP数据源,目前也推荐使用这个,相比于druid有更高的性能,但是不能忽略下面的配置,否则服务会不断抛出异常,原因是数据库的连接时常和连接池的配置没有做好。

spring:
datasource:
dynamic:
hikari:
max-lifetime:1800000
connection-timeout:5000
idle-timeout:3600000
max-pool-size:12
min-idle:4
connection-test-query:/**ping*/

1.3 启动服务

下面直接启动服务:

398f50de-205d-11ed-ba43-dac502259ad0.jpg

得到如上结果表示启动成功了。

二、使用

前面我们成功的集成进来了mybatis-plus,配合springboot使用不要太方便。下面我们看看如何使用它来操作我们的数据库。介绍一下常规的用法。

2.1 实体类注解

mybatis-plus为使用者封装了很多的注解,方便我们使用,我们首先看下实体类中有哪些注解。有如下的实体类:

@TableName(value="user")
publicclassUserDO{

/**
*主键
*/
@TableId(value="id",type=IdType.AUTO)
privateLongid;

/**
*昵称
*/
@TableField("nickname")
privateStringnickname;

/**
*真实姓名
*/
privateStringrealName;
}
  • @TableName 表名注解,用于标识实体类对应的表。其说明如下,关于这些书写,常规情况基本很少用到,不做多余解释了:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.ANNOTATION_TYPE})
public@interfaceTableName{

/**
*实体对应的表名
*/
Stringvalue()default"";

/**
*schema
*
*@since3.1.1
*/
Stringschema()default"";

/**
*是否保持使用全局的tablePrefix的值
*

只生效于既设置了全局的tablePrefix也设置了上面{@link#value()}的值

*
  • 如果是false,全局的tablePrefix不生效
  • * *@since3.1.1 */
    booleankeepGlobalPrefix()defaultfalse; /** *实体映射结果集, *只生效与mp自动注入的method */ StringresultMap()default""; /** *是否自动构建resultMap并使用, *只生效与mp自动注入的method, *如果设置resultMap则不会进行resultMap的自动构建并注入, *只适合个别字段设置了typeHandler或jdbcType的情况 * *@since3.1.2 */ booleanautoResultMap()defaultfalse; /** *需要排除的属性名 * *@since3.3.1 */ String[]excludeProperty()default{}; }
    • @TableId 主键注解,看看其源码:
    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.FIELD,ElementType.ANNOTATION_TYPE})
    public@interfaceTableId{
    
    /**
    *字段值(驼峰命名方式,该值可无)
    */
    Stringvalue()default"";
    
    /**
    *主键ID
    *{@linkIdType}
    */
    IdTypetype()defaultIdType.NONE;
    }
    

    其中IdType很重要:

    名称 描述
    AUTO 数据库自增ID
    NONE 该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
    INPUT 用户自己设置的ID
    ASSIGN_ID 当用户传入为空时,自动分配类型为Number或String的主键(雪花算法
    ASSIGN_UUID 当用户传入为空时,自动分配类型为String的主键
    • @TableFiled 表字段标识,下面看看其主要常用属性:

      名称 描述
      value 数据库字段名
      condition 字段 where 实体查询比较条件,通过SqlCondition设置 如果未设置条件,则按照正常相等来查询 若设置则按照以下规则:等于:EQUAL = "%s=#{%s}"; 不等于:NOT_EQUAL = "%s<>#{%s}"; 左右模糊:LIKE = "%s LIKE CONCAT('%%',#{%s},'%%')"; oracle左右模糊ORACLE_LIKE = "%s LIKE CONCAT(CONCAT('%%',#{%s}),'%%')"; 左模糊:LIKE_LEFT = "%s LIKE CONCAT('%%',#{%s})"; 右模糊:LIKE_RIGHT = "%s LIKE CONCAT(#{%s},'%%')";
      fill 自动填充策略,通过FieldFill设置 不处理:FieldFill.DEFAULT 插入时填充字段:FieldFill.INSERT 更新时填充字段:FieldFill.UPDATE 插入或新增时填充字段:FieldFill.INSERT_UPDATE

      关于其他的属性,我不太推荐使用,用得越多,越容易蒙圈。可以通过wapper查询去设置。

    2.2 CRUD

    mybatis-plus封装好了一条接口供我们直接调用。关于内部的具体方法,在使用时候自己体会吧,此处不列举了。

    2.2.1 Service层CRUD

    我们使用的时候,需要在自己定义的service接口当中继承IService接口:

    importcom.baomidou.mybatisplus.extension.service.IService;
    importcom.wjbgn.user.entity.UserDO;
    
    /**
    *@description:用户服务接口
    *@author:weirx
    *@date:2022/1/17 15:02
    *@version:3.0
    */
    publicinterfaceIUserServiceextendsIService<UserDO>{
    }
    

    同时要在我们的接口实现impl当中继承ServiceImpl,实现自己的接口:

    importcom.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
    importcom.wjbgn.user.entity.UserDO;
    importcom.wjbgn.user.mapper.UserMapper;
    importcom.wjbgn.user.service.IUserService;
    
    /**
    *@description:用户接口实现
    *@author:weirx
    *@date:2022/1/17 15:03
    *@version:3.0
    */
    publicclassUserServiceImplextendsServiceImpl<UserMapper,UserDO>implementsIUserService{
    
    }
    

    2.2.2 Mapper层CRUD

    mybatis-plus将常用的CRUD接口封装成了BaseMapper接口,我们只需要在自己的Mapper中继承它就可以了:

    /**
    *@description:用户mapper
    *@author:weirx
    *@date:2022/1/17 14:55
    *@version:3.0
    */
    @Mapper
    publicinterfaceUserMapperextendsBaseMapper<UserDO>{
    }
    

    2.3 分页

    使用分页话需要增加分页插件的配置:

    importcom.baomidou.mybatisplus.annotation.DbType;
    importcom.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
    importcom.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
    importorg.mybatis.spring.annotation.MapperScan;
    importorg.springframework.context.annotation.Bean;
    importorg.springframework.context.annotation.Configuration;
    
    @Configuration
    @MapperScan("com.wjbgn.*.mapper*")
    publicclassMybatisPlusConfig{
    
    @Bean
    publicMybatisPlusInterceptormybatisPlusInterceptor(){
    MybatisPlusInterceptorinterceptor=newMybatisPlusInterceptor();
    interceptor.addInnerInterceptor(newPaginationInnerInterceptor(DbType.MYSQL));
    returninterceptor;
    }
    
    }
    

    如上配置后,我们直接使用分页方法就行。

    2.4 逻辑删除配置

    很多情况下我们的系统都需要逻辑删除,方便恢复查找误删除的数据。

    通过mybatis-plus可以通过全局配置的方式,而不需要再去手动处理。针对更新和查询操作有效,新增不做限制。

    通常以我的习惯逻辑删除字段通常定义为is_delete,在实体类当中就是isDelete。那么在配置文件中就可以有如下的配置:

    mybatis-plus:
    global-config:
    db-config:
    logic-delete-field:isDelete#全局逻辑删除的实体字段名(since3.3.0,配置后可以忽略不配置步骤2)
    logic-delete-value:1#逻辑已删除值(默认为1)
    logic-not-delete-value:0#逻辑未删除值(默认为0)
    

    或者通过注解@TableLogic

    @TableLogic
    privateIntegerisDelete;
    

    2.5 通用枚举配置

    相信后端的同学都经历过一个情况,比如性别这个字段,分别值和名称对应1男2女,这个字段在数据库时是数值类型,而前端展示则是展示字符串的名称。有几种常见实现方案呢?

    • 数据库查询sql通过case判断,返回名称,以前oracle经常这么做
    • 数据库返回的值,重新遍历赋值进去,这时候还需要判断这个值到底是男是女。
    • 前端写死,返回1就是男,返回2就是女。

    相信无论哪种方法都有其缺点,所以我们可以使用mybatis-plus提供的方式。我们在返回给前端时:

    • 只需要在遍历时get这个枚举,直接赋值其名称,不需要再次判断。
    • 直接返回给前端,让前端去去枚举的name

    这样大家都不需要写死这个值。

    下面看看如何实现这个功能:

    • 性别枚举,实现IEnum接口:
    importcom.baomidou.mybatisplus.annotation.IEnum;
    importcom.fasterxml.jackson.annotation.JsonFormat;
    
    /**
    *@description:性别枚举
    *@author:weirx
    *@date:2022/1/17 16:26
    *@version:3.0
    */
    @JsonFormat(shape=JsonFormat.Shape.OBJECT)
    publicenumSexEnumimplementsIEnum{
    MAN(1,"男"),
    WOMAN(2,"女");
    privateIntegercode;
    privateStringname;
    
    SexEnum(Integercode,Stringname){
    this.code=code;
    this.name=name;
    }
    
    @Override
    publicIntegergetValue(){
    returncode;
    }
    
    publicStringgetName(){
    returnname;
    }
    
    }
    

    @JsonFormat注解为了解决枚举类返回前端只展示构造器名称的问题。

    • 实体类性别字段
    @TableName(value="user")
    publicclassUserDO{
    
    /**
    *主键
    */
    @TableId(value="id",type=IdType.AUTO)
    privateLongid;
    
    /**
    *昵称
    */
    @TableField(value="nickname",condition=SqlCondition.EQUAL)
    privateStringnickname;
    
    /**
    *性别
    */
    @TableField(value="sex")
    privateSexEnumsex;
    
    /**
    *版本
    */
    @TableField(value="version",update="%s+1")
    privateIntegerversion;
    
    /**
    *时间字段,自动添加
    */
    @TableField(value="create_time",fill=FieldFill.INSERT)
    privateLocalDateTimecreateTime;
    }
    
    • 配置文件扫描枚举
    mybatis-plus:
    #支持统配符*或者;分割
    typeEnumsPackage:com.wjbgn.*.enums
    
    • 定义配置文件
    @Bean
    publicMybatisPlusPropertiesCustomizermybatisPlusPropertiesCustomizer(){
    returnproperties->{
    GlobalConfigglobalConfig=properties.getGlobalConfig();
    globalConfig.setBanner(false);
    MybatisConfigurationconfiguration=newMybatisConfiguration();
    configuration.setDefaultEnumTypeHandler(MybatisEnumTypeHandler.class);
    properties.setConfiguration(configuration);
    };
    }
    
    • 序列化枚举值为数据库值,以下我是使用的fastjson,全局(添加在前面的配置文件中):

    Bean
    publicMybatisPlusPropertiesCustomizermybatisPlusPropertiesCustomizer(){
    //序列化枚举值为数据库存储值
    FastJsonConfigconfig=newFastJsonConfig();
    config.setSerializerFeatures(SerializerFeature.WriteEnumUsingToString);
    
    returnproperties->{
    GlobalConfigglobalConfig=properties.getGlobalConfig();
    globalConfig.setBanner(false);
    MybatisConfigurationconfiguration=newMybatisConfiguration();
    configuration.setDefaultEnumTypeHandler(MybatisEnumTypeHandler.class);
    properties.setConfiguration(configuration);
    };
    }
    
    • 局部
    JSONField(serialzeFeatures=SerializerFeature.WriteEnumUsingToString)
    privateSexEnumsex;
    

    2.6 自动填充

    还记得前面提到的实体类当中的注解@TableFeild吗?当中有个属性叫做fill,通过FieldFill设置属性,这个就是做自动填充用的。

    publicenumFieldFill{
    /**
    *默认不处理
    */
    DEFAULT,
    /**
    *插入填充字段
    */
    INSERT,
    /**
    *更新填充字段
    */
    UPDATE,
    /**
    *插入和更新填充字段
    */
    INSERT_UPDATE
    }
    

    但是这个直接是不能使用的,需要通过实现mybatis-plus提供的接口,增加如下配置:

    importcom.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
    importorg.apache.ibatis.reflection.MetaObject;
    importorg.springframework.stereotype.Component;
    
    importjava.time.LocalDateTime;
    
    /**
    *description:启动自动填充功能
    
    *@return:
    *@author:weirx
    *@time:2022/1/1717:00
    */
    @Component
    publicclassMyMetaObjectHandlerimplementsMetaObjectHandler{
    
    @Override
    publicvoidinsertFill(MetaObjectmetaObject){
    //起始版本3.3.0(推荐使用)
    this.strictInsertFill(metaObject,"createTime",LocalDateTime.class,LocalDateTime.now());
    }
    
    @Override
    publicvoidupdateFill(MetaObjectmetaObject){
    //起始版本3.3.0(推荐)
    this.strictUpdateFill(metaObject,"updateTime",LocalDateTime.class,LocalDateTime.now());
    }
    }
    

    字段如下:

    /**
    *时间字段,自动添加
    */
    @TableField(value="create_time",fill=FieldFill.INSERT)
    privateLocalDateTimecreateTime;
    

    2.7 多数据源

    前面提到过,配置文件当中配置了主从的方式,其实mybatis-plus还支持更多的方式:

    • 多主多从
    spring:
    datasource:
    dynamic:
    primary:master#设置默认的数据源或者数据源组,默认值即为master
    strict:false#严格匹配数据源,默认false.true未匹配到指定数据源时抛异常,false使用默认数据源
    datasource:
    master_1:
    master_2:
    slave_1:
    slave_2:
    slave_3:
    
    • 多种数据库
    spring:
    datasource:
    dynamic:
    primary:mysql#设置默认的数据源或者数据源组,默认值即为master
    strict:false#严格匹配数据源,默认false.true未匹配到指定数据源时抛异常,false使用默认数据源
    datasource:
    mysql:
    oracle:
    postgresql:
    h2:
    sqlserver:
    
    • 混合配置
    spring:
    datasource:
    dynamic:
    primary:master#设置默认的数据源或者数据源组,默认值即为master
    strict:false#严格匹配数据源,默认false.true未匹配到指定数据源时抛异常,false使用默认数据源
    datasource:
    master_1:
    slave_1:
    slave_2:
    oracle_1:
    oracle_2:
    

    上面的三种方式,除了混合配置,我觉得都有肯能出现的吧。

    • @DS注解

    可以注解在方法上或类上,同时存在就近原则 【方法上注解】 优先于 【类上注解】

    @DS("slave_1")
    publicclassUserServiceImplextendsServiceImpl<UserMapper,UserDO>implementsIUserService{
    
    
    @DS("salve_1")
    @Override
    publicListgetList(){
    returnthis.getList();
    }
    
    @DS("master")
    @Override
    publicintsaveUser(UserDOuserDO){
    booleansave=this.save(userDO);
    if(save){
    return1;
    }else{
    return0;
    }
    }
    }
    

    三、测试

    经过上面的配置,下面开始进入测试验证阶段。

    建立一张表:

    CREATETABLE`user`(
    `id`int(11)NOTNULLAUTO_INCREMENT,
    `nickname`varchar(255)NOTNULLCOMMENT'昵称',
    `sex`tinyint(1)NOTNULLCOMMENT'性别,1男2女',
    `create_time`datetimeNOTNULLCOMMENT'创建时间',
    `is_delete`tinyint(1)NOTNULLDEFAULT'0'COMMENT'是否删除1是,0否',
    PRIMARYKEY(`id`)
    )ENGINE=InnoDBAUTO_INCREMENT=50DEFAULTCHARSET=utf8mb4;
    

    controller:

    /**
    *@description:用户controller
    *@author:weirx
    *@date:2022/1/17 17:39
    *@version:3.0
    */
    @RestController
    @RequestMapping("/user")
    publicclassUserController{
    
    @Autowired
    privateIUserServiceuserService;
    
    /**
    *description:新增
    
    *@return:boolean
    *@author:weirx
    *@time:2022/1/1719:11
    */
    @RequestMapping("/save")
    publicbooleansave(){
    UserDOuserDO=newUserDO();
    userDO.setNickname("大漂亮");
    userDO.setSex(SexEnum.MAN);
    
    returnuserService.save(userDO);
    }
    
    /**
    *description:修改
    *@paramnickname
    *@paramid
    *@return:boolean
    *@author:weirx
    *@time:2022/1/1719:11
    */
    @RequestMapping("/update")
    publicbooleanupdate(@RequestParamStringnickname,@RequestParamLongid){
    UserDOuserDO=newUserDO();
    userDO.setNickname(nickname);
    userDO.setId(id);
    returnuserService.updateById(userDO);
    }
    
    /**
    *description:删除
    *@paramid
    *@return:boolean
    *@author:weirx
    *@time:2022/1/1719:11
    */
    @RequestMapping("/delete")
    publicbooleandelete(@RequestParamLongid){
    UserDOuserDO=newUserDO();
    userDO.setId(id);
    returnuserService.removeById(userDO);
    }
    
    /**
    *description:列表
    *@return:java.util.List
    *@author:weirx
    *@time:2022/1/1719:11
    */
    @RequestMapping("/list")
    publicListlist(){
    returnuserService.list();
    }
    
    /**
    *description:分页列表
    *@paramcurrent
    *@paramsize
    *@return:com.baomidou.mybatisplus.extension.plugins.pagination.Page
    *@author:weirx
    *@time:2022/1/1719:11
    */
    @RequestMapping("/page")
    publicPagepage(@RequestParamintcurrent,@RequestParamintsize){
    returnuserService.page(newPage<>(current,size),newQueryWrapper(newUserDO()));
    }
    
    }
    

    记过上面的接口验证,功能没有问题,集成成功。

    项目源码地址

    https://gitee.com/wei_rong_xin/rob-necessities

    审核编辑:汤梓红


    声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
    • spring
      +关注

      关注

      0

      文章

      340

      浏览量

      14340
    • mybatis
      +关注

      关注

      0

      文章

      60

      浏览量

      6709

    原文标题:看了我的MyBatis-Plus用法,同事也开始悄悄模仿了...

    文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

    收藏 人收藏

      评论

      相关推荐

      mybatis plus的常规用法

      上篇文章我们介绍过通过 Mybatis Plus 进行增删改查,如下这段代码: /** * 根据id修改 * UPDATE user SET user_name=?, user_age
      的头像 发表于 09-25 15:06 904次阅读
      <b class='flag-5'>mybatis</b> <b class='flag-5'>plus</b>的常规用法

      #硬声创作季 Java项目实战:MyBatis-Plus简介

      PlusJAVA编程语言
      Mr_haohao
      发布于 :2022年09月07日 10:15:17

      #硬声创作季 Java项目实战:Mybatis-plus的乐观锁方案

      PlusJAVA编程语言
      Mr_haohao
      发布于 :2022年09月07日 10:30:56

      一篇让你熟练掌握 MyBatis-Plus

      MyBatis-plus 是一款 Mybatis 增强工具,用于简化开发,提高效率。下文使用缩写 mp来简化表示 MyBatis-plus,本文主要介绍 mp 搭配 Spring Boot
      的头像 发表于 06-01 09:30 2600次阅读
      一篇让你熟练掌握 <b class='flag-5'>MyBatis-Plus</b>!

      Mybatis-Plus Mybatis增强工具包

      ./oschina_soft/gitee-mybatis-plus.zip
      发表于 06-13 11:34 1次下载
      <b class='flag-5'>Mybatis-Plus</b> <b class='flag-5'>Mybatis</b>增强工具包

      Fluent Mybatis、原生MybatisMybatis Plus对比

      mapper中再组装参数。那对比原生Mybatis, Mybatis Plus或者其他框架,FluentMybatis提供了哪些便利呢?
      的头像 发表于 09-15 15:41 1431次阅读

      SpringBoot中MybatisX插件的简单使用教程

      MybatisX 是一款基于 IDEA 的快速开发插件,方便在使用mybatis以及mybatis-plus开始时简化繁琐的重复操作,提高开发速率。
      的头像 发表于 02-21 09:49 1285次阅读

      MyBatis-Plus为什么不支持联表

      MyBatis Plus Join`一款专门解决MyBatis Plus 关联查询问题的扩展框架,他并不一款全新的框架,而是基于`MyBatis
      的头像 发表于 02-28 15:19 2453次阅读
      <b class='flag-5'>MyBatis-Plus</b>为什么不支持联表

      介绍一款基于Mybatis-Plus的代码自助生成器

      在基于Mybatis的开发模式中,很多开发者还会选择Mybatis-Plus来辅助功能开发,以此提高开发的效率。
      的头像 发表于 05-23 14:16 1140次阅读
      介绍一款基于<b class='flag-5'>Mybatis-Plus</b>的代码自助生成器

      如何调优MyBatis 25倍性能

      最近在压测一批接口,发现接口处理速度慢的有点超出预期,感觉很奇怪,后面定位发现是数据库批量保存这块很慢。 这个项目用的是 mybatis-plus,批量保存直接用的是 mybatis-plus 提供的 saveBatch。 我点进去看了下源码,感觉有点不太对劲
      的头像 发表于 05-30 09:56 601次阅读
      如何调优<b class='flag-5'>MyBatis</b> 25倍性能

      你还在手写join联表查询?MyBatis-Plus这样写太香了!

      众所周知,mybatis plus 封装的 mapper 不支持 join,如果需要支持就必须自己去实现。但是对于大部分的业务场景来说,都需要多表 join,要不然就没必要采用关系型数据库了。
      的头像 发表于 07-07 10:19 2681次阅读
      你还在手写join联表查询?<b class='flag-5'>MyBatis-Plus</b>这样写太香了!

      Mybatis-Plus使用技巧与隐患分析

      MP 从出现就一直有争议 感觉一直 都存在两种声音
      的头像 发表于 07-27 10:39 692次阅读
      <b class='flag-5'>Mybatis-Plus</b>使用技巧与隐患分析

      Mybatis-plus批量插入太慢?

      「内置代码生成器:」 采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
      的头像 发表于 08-25 15:24 751次阅读
      <b class='flag-5'>Mybatis-plus</b>批量插入太慢?

      MyBatis Plus如何简化开发

      本篇文章,我们通过 MyBatis Plus 来对一张表进行 CRUD 操作,来看看是如何简化我们开发的。 1、创建测试表 创建 USER 表: DROP TABLE IF EXISTS
      的头像 发表于 10-09 15:08 424次阅读
      <b class='flag-5'>MyBatis</b> <b class='flag-5'>Plus</b>如何简化开发

      mybatis和mybatisplus的区别

      MyBatisMyBatis Plus是两个非常受欢迎的Java持久层框架。这两个框架在设计和功能上有一些区别,下面我将详细介绍它们之间的差异以及各自的特点。 设计理念与目标: MyBati
      的头像 发表于 12-03 11:53 2547次阅读