mybatis-plus中的常用注解
作者:十年(Sugar)
一.前言
1.mybatis-plus简介
MyBatis-Plus(简称 MP)是一个基于 MyBatis 的增强工具,它对 Mybatis 的基础功能进行了增强,但未做任何改变。
使得我们可以可以在 Mybatis 开发的项目上直接进行升级为 Mybatis-plus,正如它对自己的定位,它能够帮助我们进一步简化开发过程,提高开发效率。
Mybatis-Plus 其实可以看作是对 Mybatis 的再一次封装,升级之后,对于单表的 CRUD 操作,调用 Mybatis-Plus 所提供的 API 就能够轻松实现,此外还提供了各种查询方式、分页等行为。
最最重要的,开发人员还不用去编写 XML,这就大大降低了开发难度.
2.mybatis-plus的优点
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作,BaseMapper
- 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求,简单的CRUD操作不用自己编写。
- 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
- 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
- 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
- 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
- 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用(自动生成代码)
- 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
- 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
- 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
- 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
3.mybatis-plus依赖包
注:我的配置是基于MyBatis-plus 3.3.1的版本
<!--MyBatis-plus starter--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.1</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>3.3.1</version> </dependency>
二.mybatis-plus常用注解
1.@Tablename注解
@Tablename注解注解用来将指定的数据库表和 JavaBean 进行映射。
多用于项目中entity包下 实体类中
@Tablename("user") public class User { private Long id; private String name; private Integer age; private String email; }
看一下源码对@Tablename注解的解释
2.@Tableld注解
注:一般的写法
写法:@TableId(value=“数据库主键字段”,type = IdType.六种类型之一)
将该属性对应的字段指定为主键
属性 | 类型 | 默认值 | 描述 |
---|---|---|---|
value | string | "" | 主键字段名 |
type | Enum | IdType.NONE | 主键类型 |
类型:
值 | 描述 |
---|---|
Auto | 数据库自增 |
Input | 自行输入 |
ID_Worker | 分布式全局唯一ID 长整型类型 |
UUID | 32位UUID字符串 |
NONE | 无状态 |
ID_WORKER_STR | 分布式全局唯一ID 字符串类型 |
3.@TableField注解
1、主要用来解决实体类的字段名与数据库中的字段名不匹配的问题(数据库user_addr,字段useraddr未驼峰)
2、实体类中的属性字段在表中不存在的问题
3、表示自动填充字段一般用于字段名
属性 | 类型 | 必须指定 | 默认值 | 描述 |
value | String | 否 | "" | 数据库字段名 |
exist | boolean | 否 | true | 是否为数据库表字段 |
condition | String | 否 | "" | 字段 where 实体查询比较条件,有值设置则按设置的值为准,没有则为默认全局的 %s=#{%s},参考(opens new window) |
update | String | 否 | "" | 字段 update set 部分注入,例如:当在version字段上注解update="%s+1" 表示更新时会 set version=version+1 (该属性优先级高于 el 属性) |
insertStrategy | Enum | 否 | FieldStrategy.DEFAULT | 举例:NOT_NULLinsert into table_a(<if test="columnProperty != null">column</if>) values (<if test="columnProperty != null">#{columnProperty}</if>) |
updateStrategy | Enum | 否 | FieldStrategy.DEFAULT | 举例:IGNOREDupdate table_a set column=#{columnProperty} |
whereStrategy | Enum | 否 | FieldStrategy.DEFAULT | 举例:NOT_EMPTYwhere <if test="columnProperty != null and columnProperty!=''">column=#{columnProperty}</if> |
fill | Enum | 否 | FieldFill.DEFAULT | 字段自动填充策略 |
select | boolean | 否 | true | 是否进行 select 查询 |
keepGlobalFormat | boolean | 否 | false | 是否保持使用全局的 format 进行处理 |
jdbcType | JdbcType | 否 | JdbcType.UNDEFINED | JDBC 类型 (该默认值不代表会按照该值生效) |
typeHandler | Class<? extends TypeHandler> | 否 | UnknownTypeHandler.class | 类型处理器 (该默认值不代表会按照该值生效) |
numericScale | String | 否 | "" | 指定小数点后保留的位数 |
4.@TableLogic注解
逻辑删除注解: 一般用于项目中的逻辑删除字段上添加该注解
效果:在字段上加上这个注解再执行BaseMapper的删除方法时,删除方法会变成修改
执行是效果:
- 加@TableLogic的情况下
- sql:UPDATE 表名 SET deleted=2 WHERE id=? AND deleted=0
- 不加@TableLogic的情况下
- 走 delete from 表名 where id=值
@TableLogic注解参数:
- value = "" 默认的原值
- delval = "" 删除后的值
- @TableLogic(value="原值",delval="改值")
5.@EnumValue注解
注:mp框架对枚举进行处理的一个注解
使用场景:创建枚举类,在需要存储数据库的属性上添加@EnumValue注解
代码展示
public enum SexEnum { MAN(1, "男"), WOMAN(2, "女"); @EnumValue private Integer key; }
三.项目中用到其他的注解
1.@JsonFormat注解
Jackson依赖
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.11.2</version> </dependency>
注: 是Jackson提供注解
导包:
import com.fasterxml.jackson.annotation.JsonFormat;
作用:日期格式化注解,方便前段解析,通常日期格式都是以时间戳的形式存放在数据库里,当前端页面通过接口查询时,我们会将一个对象的某些属性查出来返回给页面。
格式:
@JsonFormat(pattern = “yyyy-MM-dd'T'HH:mm:ss”, locale = “zh”, timezone = “GMT+8”)
属性:
- 1.pattern 指定转化的格式SSSZ(S指的是微秒,Z指时区),此处的pattern和java.text.SimpleDateFormat中的Time Patterns一致
- 2.locale主要指语言,如果中文的话,月份输出是五月,但是英文就是May,尤其是在反序列化的时候特别重要
- 3.timezone主要解决“8小时”问题
2.@JsonIgnore注解
注: 是Jackson提供注解
导包:
import com.fasterxml.jackson.annotation.JsonIgnore;
作用:在json序列化时将java Bean中的一些属性忽略掉,标记在属性或者方法上,返回的json数据即不包含该属性。
3.@JsonTypeId注解
作用:属性注解用来表示属性值应该作为Type Idfor对象使用,而不是使用类名或外部类型名。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。