MyBatis Plus最全面的使用总结

一、基本使用

(一)基本使用流程

springboot集成mybatis-plus
引入依赖

<dependency>
	<groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>

创建一个表来做示例

create table if not exists `app_project`(
	`id` BIGINT(20) not null AUTO_INCREMENT comment 'id',
	`name` varchar(100) default null comment '项目名称',
	`detail` text default null comment '项目详情',
	`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  	`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  	`create_user_id` BIGINT(20) DEFAULT NULL COMMENT '创建用户',
  	`platform_id` BIGINT(20) DEFAULT NULL COMMENT '平台ID',
  	`update_user_id` BIGINT(20) DEFAULT NULL,
  	`is_deleted` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '0:未删除,1:已删除',
  	PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COMMENT='项目表';

数据库连接

spring:
  datasource:
    username: username
    password: password
    type: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://${ip}:${port}/database?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8
    druid:
      initial-size: 1
      max-active: 30
      max-wait: 60
      filter: stat
      remove-abandoned-timeout: 1000
      time-between-eviction-runs-millis: 30000
      driver-class-name: com.mysql.jdbc.Driver

编写entity实体类

import com.alibaba.fastjson.annotation.JSONField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.Date;

/**
 * @program: xxx
 * @description:
 * @author: 谢小鱼 xxx@qq.com
 * @create: 2021-10-19 11:34
 **/
 /**
 * lombok的注解,如果找不到就需要安装一下lombok的plugs
 */
@Data
/**
 * 支持链式编程
 */
@Accessors(chain = true)
@TableName("app_project")
public class AppProjectEntity extends Model<AppProjectEntity> implements Serializable {
    @TableId
    private Long id;
    private String name;
    private String detail;
    //JsonFormat来源于jackson
//    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    //JSONField来源于fastjson
    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
    private Long createUserId;
    private Long platformId;
    private Long updateUserId;
    @TableLogic
    private Integer isDeleted;
}

编写Dao数据关系层

import cn.sinvie.oauthserver.Entity.license.AppProjectEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface AppProjectDao extends BaseMapper<AppProjectEntity> {
    ......
}

服务层、业务逻辑层

import cn.sinvie.oauthserver.Entity.license.AppProjectEntity;
import com.baomidou.mybatisplus.extension.service.IService;

public interface AppProjectService extends IService<AppProjectEntity> {
	......
}

import cn.sinvie.oauthserver.Entity.license.AppProjectEntity;
import cn.sinvie.oauthserver.dao.AppProjectDao;
import cn.sinvie.oauthserver.service.AppProjectService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;


/**
 * @program: xxx
 * @description:
 * @author: 谢小鱼 xxx@qq.com
 * @create: 2021-10-19 11:42
 **/
@Service("AppProjectService")
public class AppProjectServiceImpl extends ServiceImpl<AppProjectDao, AppProjectEntity> implements AppProjectService {
	......
}

Controller控制器层

import cn.sinvie.oauthserver.service.AppProjectService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @program: xxx
 * @description: project相关接口
 * @author: 谢小鱼 xxx@qq.com
 * @create: 2021-10-19 16:19
 **/
@Log4j2
@RestController
@RequestMapping("/xxx/xxx")
public class AppProjectController{
    @Autowired
    private AppProjectService appProjectService;

	......
}

(二)时间处理

时间类型有哪些

一、数据库中的日期数据类型
  数据库中的日期数据类型有四种:date、datetime、timestimp、time。date类型只保存年月日,不保存时分秒,datetime和timestimp保 存年月日时分秒,time只保存时分秒。数据库字段值进行比较时,date只比较年月日,datetime和timestimp比较年月日时分秒,time只比较 时分秒。
  datetime、timestimp在数据库中的存储结构不一样,timestimp更节省空间,但对于java对象的存取都是一样的。

二、java中的四种日期类型:java.util.Date、java.sql.date、timestimp、time。
  (1)java.sql.date、timestimp、time都在java.sql包下,都是java.util.date类的子类。java.sql包下的date显示年月日, timestimp显示年月日时分秒,time显示时分秒,java.sql.date显示年月日时分秒。
  (2)这四种日期类型内部保存的都是时间戳。虽然java.sql.date、time值显示年月日或时分秒,但其内部保存的都是完整的时间 戳,因此当把java.sql.date、time转型为java.uitl.Date类型时,还是能显示完整的年月日时分秒。
  (3)直接System.out.println(java.sql.date)显示年月日,System.out.println(java.sql.time)显示时分秒。但是通过
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);
    String str = simpleDateFormat.format(objDate)
  无论objDate是四种类型中的任何类型,返回的str字符串都是准确的完整的年月日时分秒。因simpleDateFormat.format()方法的 参数是类型时java.util.Date类型,java.sql.date、timestimp、time会自动转为java.util.Date类型。

三、数据库中的四种日期数据类型通过mybatis逆向工程生成的实体类对应属性的类型都是java.util.Date(不是java.sql.Date)类型。

后端接受前端传值

import java.util.Date;

@RequestMapping("/add")
public ResponseJSON add(@RequestParam(value = "date")@DateTimeFormat(pattern = "yyyy-MM-dd") Date date){
	xxx;
}

后端传值给前端

在实体类的属性上加注解
第一种,在springboot项目中,默认集成的是jackson解析json数据,默认用@JsonFormat。用法为在属性值上 @JsonFormat(pattern=”yyyy-MM-dd”,timezone=”GMT+8”),如果直接使用 @JsonFormat(pattern=”yyyy-MM-dd”)就会出现2018-08-01 08:00:00的情况, 会相差8个小时,因为我们是东八区(北京时间)。所以我们在格式化的时候要指定时区(timezone )

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date createTime;

第二种,当我们引入了FastJson时,@JsonFormat注解会失效,这时要使用@JSONField注解,这个注解最常用的两个属性是那么和format
name:@JSONField(name=”resType”)主要用于指定前端传到后台时对应的key值,如果bean中没有这个注解,则默认前端传过来的key是field本身,即如果是private String name,name前端对应的key就是name才能对应上。
format @JSONField(format=”yyyy-MM-dd”)主要用于格式化日期,比如前台传过来的时间是2018-07-12 17:44:08,但是通过这个注解,你存到数据库的时间就是2018-07-12 00:00:00。

@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Date createTime;

(三)mybatis-plus自带的分页查询工具使用

一般我们查询数据的时候都需要后端坐分页,然后返回给前端,mybatis自带的page工具很好的支持了这一功能,如下,在AppProjectServiceImpl类(继承了ServiceImpl<AppProjectDao, AppProjectEntity>)中:

QueryWrapper<AppProjectEntity> wrapper = new QueryWrapper<>();
Page<AppProjectEntity> appProjectEntityPage = baseMapper.selectPage(
		new Page<AppProjectEntity>(page, size),
		wrapper);

到这还没结束,需要注入一个分页插件到spring容器中:

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * mybatis-plus配置
 *
 * @author xxx
 */
@Configuration
public class MybatisPlusConfig {

    /**
     * 分页插件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }

}

这样就可以正常使用了。

(四)引入lombok简化bean代码量,支持链式编程

在idea的plugs中安装lombok插件

在这里插入图片描述

使用@Data注解自动生成构造函数、toString、Hash等函数

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;

@Data
@TableName("app_project")
public class AppProjectEntity extends Model<AppProjectEntity> implements Serializable {
    @TableId
    private Long id;
    private String name;
    private String detail;
}

使用@Accessors(chain = true)支持链式编程

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;

@Data
/**
 * 支持链式编程
 */
@Accessors(chain = true)
@TableName("app_project")
public class AppProjectEntity extends Model<AppProjectEntity> implements Serializable {
    @TableId
    private Long id;
    private String name;
    private String detail;
}

链式编程构造对象:

AppProjectEntity entity = new AppProjectEntity()
                .setName(name)
                .setDetail(detail)
                .setCreateUserId(userId)
                .setPlatformId(platformId);

二、填坑

1、逻辑删除:当使用@TableLogic注解给实体类标注了逻辑删除字段后,如果想要删除数据的话一定要用baseMapper.deleteById(),而不是根据id查询出来一个实体对象,然后将逻辑删除字段标记为删除(默认11为删除),然后通过updateById()去更新这个字段,因为mabatis将该字段设置为逻辑删除后,update操作会忽略这个字段,默认将它设置为0。


持续更新ing

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值