一、引入依赖
引入MybatisPlus依赖,将Mybatis依赖注释,因为MybatisPlus依赖覆盖Mybatis依赖
引用官方的一句话:
MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window) 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.5</version>
</dependency>
适当还能添加一些工具包依赖
<!-- Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。 --> <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all --> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.25</version> </dependency> <!-- 代码生成器 --> <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-generator --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.5.5</version> </dependency>
二、配置application.yml
将原本的mybatis的配置注释,替换新配置
注意:type-aliases-package里面是项目实体类的路径,对应mapper的操作对象
#mybatis:
# #mapper配置文件
# mapper-locations: classpath:mapper/*.xml
# type-aliases-package: com.sky.entity
# configuration:
# #开启驼峰命名
# map-underscore-to-camel-case: true
mybatis-plus:
type-aliases-package: com.sky.entity
global-config:
db-config:
id-type: auto #配置实体类中id默认自增
logic-delete-field: deleted # 配置逻辑删除字段
configuration:
default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
mybatis-plus: mapper-locations: "classpath*:/mapper/**/*.xml" # Mapper.xml文件地址,当前这个是默认值。
可以看到默认值是
classpath*:/mapper/**/*.xml
,也就是说我们只要把mapper.xml文件放置这个目录下就一定会被加载。
在之前数据库的配置项里面加上&rewriteBatchedStatements=true 实现mp的批处理
datasource:
# &rewriteBatchedStatements=true 批处理,在下面的url里面添加
url: jdbc:mysql://127.0.0.1:3306/mp?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
driver-class-name: com.mysql.cj.jdbc.Driver
三、在 Spring Boot 启动类中添加 @MapperScan
注解,扫描 Mapper 文件夹
@SpringBootApplication
@EnableTransactionManagement //开启注解方式的事务管理
@Slf4j
@EnableCaching//开启缓存注解功能
@EnableScheduling//开启任务调度
@MapperScan("com.sky.mapper")
public class QupaiServerApplication {
public static void main(String[] args) {
SpringApplication.run(QupaiServerApplication.class, args);
log.info("server started");
}
}
三、在需要使用mp的mapper接口上继承BaseMapper<xxx>
上面xxx表示该接口操作对应的实体类
@Mapper
public interface OrderMapper extends BaseMapper<Orders> {}
四、CRUD接口
先说service和serviceImpl应该继承什么
//service
public interface OrderService extends IService<Orders> {}
//serviceImpl
@Service
@Slf4j
public class OrderServiceImpl extends ServiceImpl<OrderMapper,Orders> implements OrderService {}
extends IService<Orders>里面的Orders指的是对应操作的对象
extends ServiceImpl<OrderMapper,Orders>里面的指的是该对象对应的mapper和该对象
五、有需要的话还有必要的注解加在对象的类里面
MybatisPlus就是根据PO实体的信息来推断出表的信息,从而生成SQL的。默认情况下:
MybatisPlus会把PO实体的类名驼峰转下划线作为表名
MybatisPlus会把PO实体的所有变量名驼峰转下划线作为表的字段名,并根据变量类型推断字段类型
MybatisPlus会把名为id的字段作为主键
但很多情况下,默认的实现与实际场景不符,因此MybatisPlus提供了一些注解便于我们声明表信息
@TableName
描述:表名注解,标识实体类对应的表
使用位置:实体类
@TableName("user")
public class User {
private Long id;
private String name;
}
TableName注解除了指定表名以外,还可以指定很多其它属性:
属性
类型
必须指定
默认值
描述
value
String
否
""
表名
schema
String
否
""
schema
keepGlobalPrefix
boolean
否
false
是否保持使用全局的 tablePrefix 的值(当全局 tablePrefix 生效时)
resultMap
String
否
""
xml 中 resultMap 的 id(用于满足特定类型的实体类对象绑定)
autoResultMap
boolean
否
false
是否自动构建 resultMap 并使用(如果设置 resultMap 则不会进行 resultMap 的自动构建与注入)
excludeProperty
St
ring[]
否
{}
需要排除的属性名 @since 3.3.1
@TableId
描述:主键注解,标识实体类中的主键字段
使用位置:实体类的主键字段
@TableName("user")
public class User {
@TableId
private Long id;
private String name;
}
TableId
注解支持两个属性:
属性
类型
必须指定
默认值
描述
value
String
否
""
表名
type
Enum
否
IdType.NONE
指定主键类型
IdType
支持的类型有:
值
描述
AUTO
数据库 ID 自增
NONE
无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
INPUT
insert 前自行 set 主键值
ASSIGN_ID
分配 ID(主键类型为 Number(Long 和 Integer)或 String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法)
ASSIGN_UUID
分配 UUID,主键类型为 String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默认 default 方法)
ID_WORKER分布式全局唯一 ID 长整型类型(please use ASSIGN_ID)
UUID32 位 UUID 字符串(please use ASSIGN_UUID)
ID_WORKER_STR分布式全局唯一 ID 字符串类型(please use ASSIGN_ID)
这里比较常见的有三种:
AUTO
:利用数据库的id自增长
INPUT
:手动生成id
ASSIGN_ID
:雪花算法生成Long
类型的全局唯一id,这是默认的ID策略
@TableField
描述:普通字段注解
@TableName("user")
public class User {
@TableId
private Long id;
private String name;
private Integer age;
@TableField("isMarried")
private Boolean isMarried;
@TableField("concat")
private String concat;
}
一般情况下我们并不需要给字段添加
@TableField
注解,一些特殊情况除外:
成员变量名与数据库字段名不一致
成员变量是以
isXXX
命名,按照JavaBean
的规范,MybatisPlus
识别字段时会把is
去除,这就导致与数据库不符。成员变量名与数据库一致,但是与数据库的关键字冲突。使用
@TableField
注解给字段名添加转义字符:``
支持的其它属性如下:
属性
类型
必填
默认值
描述
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_NULL insert into table_a(<if test="columnProperty != null">column</if>) values (<if test="columnProperty != null">#{columnProperty}</if>)
updateStrategy
Enum
否
FieldStrategy.DEFAULT
举例:IGNORED update table_a set column=#{columnProperty}
whereStrategy
Enum
否
FieldStrategy.DEFAULT
举例:NOT_EMPTY where <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
TypeHander
否
类型处理器 (该默认值不代表会按照该值生效)
numericScale
String
否
""
指定小数点后保留的位数