一、基本使用
(一)基本使用流程
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