MybatisPlus使用总结 (SpringBoot项目)

MybatisPlus使用总结

MybatisPlus 能够大大简化我们对于单表操作的效率

基础环境搭建

首先是MybatisPlus 的Maven 环境引入

当然,要想项目能够正常运行 还需要引入SpringBoot的相关依赖

<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.mybatis</groupId>
                    <artifactId>mybatis</artifactId>
                </exclusion>
            </exclusions>
            <version>3.4.2</version>
 </dependency>

项目的 yml配置文件如下

spring:
  mvc:
    favicon:
      enabled: false
    servlet:
      load-on-startup: 1
    log-resolved-exception: true
    throw-exception-if-no-handler-found: true
    date-format: yyyy-MM-dd HH:mm:ss
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss #定制jackson的Date格式化

  #    配置数据源
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatisplustest?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
    username: root
    password: root


swagger2:
  base-package: com.fy.Employee
  verison: 1.0.0
  title: 测试接口

#程序启动和运行时需要的配置参数,其中的参数由业务定义,或者功能组件定义,例如数据源配置。业务相关的配置都应该放在该配置文件中
mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapper-locations: mapper/*.xml #该处表示对应的Mapper会在 Resources文件的Mapper文件中

建立表和实体类

依赖引用完成后,需要建立对应的实体类和相应的数据库表

实体类如下

@TableName("user") //该注解表示此实体类 与数据库中的 user表相互映射
@Data
public class User implements Serializable {
    /**
     * userid
     */
    @ApiModelProperty(name = "userid", notes = "")
    @TableId
    private String userId;
    /**
     * 用户名称
     */
    @ApiModelProperty(name = "用户名称", notes = "")
    private String name;
    /**
     * 用户年龄
     */
    @ApiModelProperty(name = "用户年龄", notes = "")
    private Integer age;
    /**
     * 邮箱
     */
    @ApiModelProperty(name = "邮箱", notes = "")
    private String email;
    /**
     * 逻辑删除
     * */
    @ApiModelProperty(name = "逻辑删除",notes = "")
    @TableLogic
    @TableField(fill= FieldFill.INSERT)
    private Integer deleted ;
    /**
     * 创建人
     */
    @ApiModelProperty(name = "创建人", notes = "")
    @TableField(fill=FieldFill.INSERT)
    private String createdBy;
    /**
     * 创建时间
     */
    @ApiModelProperty(name = "创建时间", notes = "")
    @TableField(fill=FieldFill.INSERT)
    private String createdTime;
    /**
     * 更新人
     */
    @ApiModelProperty(name = "更新人", notes = "")
    @TableField(fill=FieldFill.INSERT_UPDATE)
    private String updatedBy;
    /**
     * 更新时间
     */
    @ApiModelProperty(name = "更新时间", notes = "")
    @TableField(fill=FieldFill.INSERT_UPDATE)
    private String updatedTime;
}

数据库脚本如下

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `USER_ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'userid',
  `NAME` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名称',
  `AGE` int(11) NULL DEFAULT NULL COMMENT '用户年龄',
  `EMAIL` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮箱',
  `DELETED` int(11) NULL DEFAULT NULL COMMENT '逻辑删除',
  `CREATED_BY` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',
  `CREATED_TIME` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建时间',
  `UPDATED_BY` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人',
  `UPDATED_TIME` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`USER_ID`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

在这里插入图片描述

创建Mapper

这里是 Mybatisplus 的通用写法,我们将自己的 Mapper 继承自 MybatisPlus提供的 BaseMapper 并且将我们自己的实体类对象传入对应的泛型当中。

继承完成后,就可以使用 MybatisPlus中封装的方法

@Mapper
public interface UserMapper extends BaseMapper<User> {


}

以下将是对基本操作的一些操作案例

@RunWith(SpringRunner.class)
@SpringBootTest(classes = MainApplication.class)
public class TestProject {
        @Autowired
        UserMapper userMapper;


        /**
         * 添加功能
         */
        @Test
        public void addOneUser(){
                User user=new User();
                user.setAge(10);
                user.setEmail("132@qq.com");
                user.setName("小猪");
                userMapper.insert(user);
        }

        /**
         * 更新
         */
        @Test
        public void UpdateTest(){
                String id="1605757257864192001";
                User user = userMapper.selectById(id);
                user.setName("小牛");
                userMapper.updateById(user);
        }

        @Test
        public void SelectAll(){
                userMapper.selectList(null);
        }

        /**
         * 根据 ID删除
         */
        @Test
        public void deleteById(){
                String id="1605757257864192001";
                userMapper.deleteById(id);
        }

}

下面我总结几点MybatisPlus 几点在项目当中较实用的地方

公共字段的自动填充

项目中难免会遇到 create_time 、create_id、 update_time 、update_id这种的公共属性,如果都是用 Setter方法去设置属性的话会显得我们的代码非常的冗长

首先,需要构建一个config配置

/**
 * 自动填充功能
 * 其核心是给实体类的属性赋值
 * 如下图定义了5个常量,这些都是每个实体类所具有的属性
 * 我们的自动填充的功能就是给实体类的属性赋值、
 * 然后插入或者是更新数据库中表的内容
 */
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
/*
* 增加新的内容时 ,需要填充deleted属性为0
* 新增时 需要填充 四个属性
* 更新时 需要填充 两个属性
* */
    private static final String CREATE_BY_FIELD_NAME = "createdBy";
    private static final String CREATE_TIME_FIELD_NAME = "createdTime";
    private static final String UPDATE_BY_FIELD_NAME = "updatedBy";
    private static final String UPDATE_TIME_FIELD_NAME = "updatedTime";
    private static final String DELETED_FIELD_NAME = "deleted";

//    模拟生成两个用户id
    private static final String USER_1="xiaoming";
    private static final String USER_2="xiaohong";


    /* (non Javadoc)
     * @Title: insertFill
     * @Description: {简单描述}
     * @param arg0
     * @see com.baomidou.mybatisplus.core.handlers.MetaObjectHandler#insertFill(org.apache.ibatis.reflection.MetaObject)
     */
    @Override
    public void insertFill(MetaObject metaObject) {
//        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)
        log.info("start 自动填充");

        //1、自动设置创建人信息
        this.strictInsertFill(metaObject,CREATE_BY_FIELD_NAME,String.class,USER_1);
        //2、自动设置创建时间
        this.strictInsertFill( metaObject,CREATE_TIME_FIELD_NAME, String.class,DateUtil.now());
        //3、自动设置更新人信息,当外部接口调用时,用户可能为空
        this.strictInsertFill(metaObject,UPDATE_BY_FIELD_NAME,String.class,USER_1);
        //4、自动设置更新时间
        this.strictInsertFill( metaObject,UPDATE_TIME_FIELD_NAME, String.class,DateUtil.now());
        //5.设置逻辑删除的值为0
        this.strictInsertFill(metaObject,DELETED_FIELD_NAME,Integer.class,0);
    }

   
    @Override
    public void updateFill(MetaObject metaObject) {
        //1、自动设置更新人信息,当外部接口调用时,用户可能为空
        this.setFieldValByName(UPDATE_BY_FIELD_NAME,USER_2,metaObject);
        //2、自动设置更新时间
        this.setFieldValByName(UPDATE_TIME_FIELD_NAME, DateUtil.now(), metaObject);
    }
}

配置类添加完毕后需要在实体类的对应属性中添加相应的注解
在这里插入图片描述

最后就可以试试构造数据,你会发现就算不填写这些属性,他们依然会被赋上预期的值

实体类与数据库字段匹配问题

在实际开发过程中,我们可能遇到自身实体类和数据库中字段不能完全对应的问题。如果不处理该问题,则会报错。

Error querying database. Cause:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column in ‘field list’!

解决方案,在属性上加入 @tableField(exist = false)这样就能避免问题的属性

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值