官网:http://mp.baomidou.com/
参考教程:http://mp.baomidou.com/guide/
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
基本步骤
- 引入依赖
- 创建实体类User
- UserMapper的interface接口,继承BaseMapper
- 启动类上添加@MapperScan注解
查看mp的sql输出日志
#mybatis日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
insert
1、插入操作
注意:数据库插入id值默认为:全局唯一id
2、主键生成策略
(1)ID_WORKER
MyBatis-Plus默认的主键策略是:ID_WORKER 全局唯一ID
参考资料:分布式系统唯一ID生成方案汇总:https://www.cnblogs.com/haoxinyue/p/5208136.html
(2)自增策略
要想主键自增需要配置如下主键策略
需要在创建数据表的时候设置主键自增
实体字段中配置 @TableId(type = IdType.AUTO)
@TableId(type = IdType.AUTO)
private Long id;
要想影响所有实体的配置,可以设置全局主键配置
#全局设置主键生成策略
mybatis-plus.global-config.db-config.id-type=auto
其它主键策略:分析 IdType 源码可知
@Getter
public enum IdType {
/**
* 数据库ID自增
*/
AUTO(0),
/**
* 该类型为未设置主键类型
*/
NONE(1),
/**
* 用户输入ID
* 该类型可以通过自己注册自动填充插件进行填充
*/
INPUT(2),
/* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */
/**
* 全局唯一ID (idWorker)
*/
ID_WORKER(3),
/**
* 全局唯一ID (UUID)
*/
UUID(4),
/**
* 字符串全局唯一ID (idWorker 的字符串表示)
*/
ID_WORKER_STR(5);
private int key;
IdType(int key) {
this.key = key;
}
}
update
1、根据Id更新操作
注意:
update时生成的sql自动是动态sql:UPDATE user SET age=? WHERE id=?
2、自动填充
项目中经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。
我们可以使用MyBatis Plus的自动填充功能,完成这些字段的赋值工作:
(1)数据库表中添加自动填充字段
在User表中添加datetime类型的新的字段 create_time
、update_time
(2)实体上添加注解
@Data
public class User {
......
@TableField(fill = FieldFill.INSERT)
private Date createTime;
//@TableField(fill = FieldFill.UPDATE)
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}
(3)实现元对象处理器接口注意:不要忘记添加 @Component 注解
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(MyMetaObjectHandler.class);
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
3、乐观锁
建议使用配置类,使用@Configuration,springboot工程启动的时候,配置类也会被加载
丢失更新:多人同时修改同一调数据,最后提交的把之前的提交数据覆盖掉
悲观锁-乐观锁:
悲观锁:一般是不用的,lucy在操作数据的时候,别人都不能操作,等lucy操作完成之后别人才可以操作(串行,只有一个人能操作)
乐观锁:依靠version版本号,
**主要适用场景:**当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新
乐观锁实现方式:
- 取出记录时,获取当前version
- 更新时,带上这个version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果version不对,就更新失败
测试乐观锁,先查询再修改
//查询
User user = userMapper.selectById(1397578853580333057L);
user.setAge(30);
//修改
int i = userMapper.updateById(user);
三、select
- 根据id查询
- 通过多个id批量查询
- 简单的条件查询
- 分页
简单条件查询使用map封装条件;
四、delete
- 1、根据id删除记录
- 2、批量删除
int result = userMapper.deleteBatchIds(Arrays.asList(8, 9, 10));
- 3、简单的条件查询删除
map.put("name", "Helen");
map.put("age", 18);
int result = userMapper.deleteByMap(map);
- 4、逻辑删除
可加可不加,默认如此
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0
查询已经被删掉的数据
:自己写xml文件查询
QueryWrapper
一般使用QueryWrapper
1、ge、gt、le、lt、isNull、isNotNull
2、eq、ne
3、between、notBetween
4、allEq
5、like、notLike、likeLeft、likeRight
6、in、notIn、inSql、notinSql、exists、notExists
…