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: usernamepassword: passwordtype: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:mysql://${ip}:${port}/database?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8druid:initial-size: 1max-active: 30max-wait: 60filter: statremove-abandoned-timeout: 1000time-between-eviction-runs-millis: 30000driver-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 {@TableIdprivate 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;@TableLogicprivate 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{@Autowiredprivate 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 {/*** 分页插件*/@Beanpublic 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 {@TableIdprivate 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 {@TableIdprivate 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
MyBatis Plus最全面的使用总结相关推荐
- mybatis查询报错:com.mysql.cj.exceptions.DataConversionException: Cannot determine value type from string
mybatis查询报错: com.mysql.cj.exceptions.DataConversionException: Cannot determine value type from strin ...
- MyBatis的插入后获得主键的方式
需求: 使用MyBatis往MySQL数据库中插入一条记录后,需要返回该条记录的自增主键值. 方法: 在mapper中指定keyProperty属性,示例如下: <insert id=" ...
- mybatis使用注解开发
mybatis使用注解开发 面向接口编程 在之前我们是通过面向对象编程,但是在真正开发的时候我们会选择面向接口编程. 根本原因 : 解耦 , 可拓展 , 提高复用 , 分层开发中 , 上层不用管具体的 ...
- mybatis ResultMap
ResultMap 解决属性名和字段的名称不一致的问题. 查询为null的问题 创建java实体类: public class User {private int id; //idprivate St ...
- mybatis配置文件解析
mybatis配置文件解析 mybatis核心配置文件`mybatis-config.xml文件. mybatis的配置文件包含了会深深影响mybatis行为的设置和属性信息. 能配置的内容: con ...
- mybatis CRUD操作
mybatis CRUD操作 select select标签是mybatis最常用的标签之一. select语句有很多属性可以详细的配置每一天sql语句. id 命名空间唯一的标识. 接口中的方法名与 ...
- java mybatis基础
java mybatis基础 1.1 什么是mybatis? mybatis是一个优秀的持久层框架. 避免几乎所有的JDBC代码和手动设置参数以及获取结果集的过程. 可以使用简单的xml或者注解来配置 ...
- mybatis的资源过滤错误及xml文件编码错误
mybatis 解决maven项目内资源过滤的问题 写的配置文件无法被导出或者生效的问题. 解决方案: <build><resources><resource>&l ...
- Mybatis传递多个参数的4种方式
现在大多项目都是使用Mybatis了,但也有些公司使用Hibernate.使用Mybatis最大的特性就是sql需要自己写,而写sql就需要传递多个参数.面对各种复杂的业务场景,传递参数也是一种学问. ...
- SpringBoot (五) :SpringBoot整合mybatis
说在前面 mybatis刚开始使用的时候比较麻烦,需要各种配置文件.实体类.dao层映射关联.还有一大推其它配置.初期开发了generator可以根据表结果自动生产实体类.配置文件和dao层代码,可以 ...
最新文章
- DPM2007轻松恢复Exchange邮件,DPM2007系列之三
- python编程小知识_分享Python开发中要注意的十个小贴士
- matlab fopen wt,matlab的fopen和fprintf
- C++内存管理变革(3):另类内存管理
- 检查gzip是否起效
- 【解题报告】SRM-08
- Linux修改命令行样式
- TiDB 在平安核心系统的引入及应用
- 固定资产分类(仅供参考 2005年),
- 微软高性能缓存AppFabric(二)使用
- php程序员自我描述_php程序员自我评价简历范文
- python按条件删除行_python – 根据条件删除行组
- cjavapy在线正则表达式测试工具
- 设置表头QHeaderView
- python学习之旅_第1天
- 什么是AVIF?如何在你的网站上使用AV1格式图像
- [软件工程] 面向对象设计
- js实现kmp算法_基于KMP算法JavaScript的实现方法分析
- Spring Data JPA REST Query QueryDSL
- access查找出生日期年份_access中时间日期查询的一些总结
热门文章
- C语言实现--快速排序
- Google Earth Engine(区域统计)
- 小福利,带你使用scrapy框架爬取苏宁图书海量信息
- WORDPRESS WOOCOMMERCE购物网站安装AB跳转支付插件接口的教程
- 语音调节 变调不变速
- PPM Object中对于Delegated Owner的错误图标指示问题
- Ceph安装后 ImportError: No module named rados
- Linux下使用nc命令测试TCP、UDP
- 2022-2028年全球与中国露营家具行业市场需求预测分析
- wincc的画面怎么用博图打开_如何把西门子精智面板画面直接转换成博图WINCC RT ADV画面...