MyBatisPlus 快速入门

快速入门

MyBatisPlus可以节省大量工作时间,所有CRUD操作可以自动完成

1、创建数据库mybatis_plus
2、创建user

真实开发中,还需要version(乐观锁)deleted(逻辑删除)gmt_create(创建时间) gmt_modified(修改时间)

DROP TABLE IF EXISTS user;

CREATE TABLE user
(
	id BIGINT(20) NOT NULL COMMENT '主键ID',
	name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
	age INT(11) NULL DEFAULT NULL COMMENT '年龄',
	email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
	PRIMARY KEY (id)
);

DELETE FROM user;

INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');

3、编写项目
启动SpringBoot项目

  • 不要同时导入mybatismybatisplus
<!--lombok-->
<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<optional>true</optional>
</dependency>
<!--mybatisplus-->
<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>mybatis-plus-boot-starter</artifactId>
	<version>3.3.2</version>
</dependency>
<dependency>
	<groupId>com.h2database</groupId>
	<artifactId>h2</artifactId>
	<scope>runtime</scope>
</dependency>

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<scope>runtime</scope>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-test</artifactId>
	<scope>test</scope>
	<exclusions>
		<exclusion>
			<groupId>org.junit.vintage</groupId>
			<artifactId>junit-vintage-engine</artifactId>
		</exclusion>
	</exclusions>
</dependency>

4、POJO对象和Dao接口
对象创建使用lombok只需要输入变量

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

dao只需要继承BaseMapper<泛型>并且传入泛型

@Mapper
@Repository
public interface UserDao extends BaseMapper<User> {
    //目前所有CRUD已经实现,不需要自己写基础功能
}

测试

@Test
public void testMybatisPlus(){
	//wrapper 条件构造器
	System.out.println(userDao.selectList(null));
}

配置日志

配置日志,可以选择不同的日志,需要倒入依赖,这里选择控制台输出

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

输出可以看到SQL语句
在这里插入图片描述

CURD扩展

方法介绍

增删改查的方法基本类似

输入主键ID进行操作
例如: deleteById() selectById()

输入Collection<> List进行批量操作,输入ID列表
例如:deleteBatchIds() selectBatchIds()

输入Map增加条件,key是属性,value是条件
例如:deleteByMap() selectMaps()

输入Wrapper条件

Insert 分布式系统唯一ID生成

雪花算法:

  • 最高位是符号位,始终为0,不可用。
  • 41位的时间序列,精确到毫秒级,41位的长度可以使用69年。时间位还有一个很重要的作用是可以根据时间进行排序。注意,41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截) 后得到的值,这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的(如下下面程序SnowFlake类的START_STMP属性)。41位的时间截,可以使用69年,年T = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69
  • 10位的机器标识,10位的长度最多支持部署1024个节点。
  • 12位的计数序列号,序列号即一系列的自增id,可以支持同一节点同一毫秒生成多个ID序号,12位的计数序列号支持每个节点每毫秒产生4096个ID序号。

1、变量上增加自增注解

//主键自增
@TableId(type = IdType.AUTO)

2、数据库中将key设置为自增

public enum IdType {
    AUTO(0), 数据库自增ID
    NONE(1), 未设置主键
    INPUT(2), 手动输入
    ASSIGN_ID(3),  分配ID代替ID_WORKER,ID_WORKER_STR
    ASSIGN_UUID(4), 分配UUID代替UUID
    /** @deprecated */
    @Deprecated
    ID_WORKER(3), 默认全局ID
    /** @deprecated */
    @Deprecated
    ID_WORKER_STR(3), 全局ID字符串表示
    /** @deprecated */
    @Deprecated
    UUID(4);  全局唯一ID
}

自动填充

首先在数据库中增加属性create_timeupdate_time并且在User对象中加入变量

//字段自动填充,插入时填充和插入更新时填充
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;

实现MetaObjectHandler接口,实现公共字段自动填写

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill ...");
        //名称要和POJO对象变量名一样,而不是和数据库一样
        this.setFieldValByName("createTime",new Date(),metaObject);
        this.strictUpdateFill(metaObject,"updateTime",Date.class,new Date());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill ...");
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }

通过以上代码可以实现,在插入和更新数据的时候,对创建时间和修改时间进行更新。

insert新数据

在这里插入图片描述
修改数据

在这里插入图片描述


乐观锁

在数据库中加入属性version记录当前数据的版本,并且增加注解@Version

@Version //乐观锁注解
private Integer version;

增加乐观锁的配置组件

@Configuration
@EnableTransactionManagement
public class MybatisPlusConfig {

    //乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }
}

测试乐观锁

//测试乐观锁
@Test
public void optimisticLocker(){
	User user = userDao.selectById(6L);
	user.setName("crj111");

	User user2 = userDao.selectById(6L);
	user2.setName("crj222");
	if(userDao.updateById(user2) != 0){
		System.out.println("user更新成功");
	} else {
		System.out.println("user更新失败");
	}


	if(userDao.updateById(user) != 0){
		System.out.println("user2更新成功");
	} else {
		System.out.println("user2更新失败");
	}
}

可以看出修改语句自动检查版本号,user2更新时,版本号已经改变,所以更新失败

在这里插入图片描述


分页查询

MybatisPlus内置了分页查询,先导入分页的拦截器组件

//拦截器插件
@Bean
public PaginationInterceptor paginationInterceptor() {
    PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
    // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false
    // paginationInterceptor.setOverflow(false);
    // 设置最大单页限制数量,默认 500 条,-1 不受限制
    // pagina
    tionInterceptor.setLimit(500);
    // 开启 count 的 join 优化,只针对部分 left join
    paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
    return paginationInterceptor;
}
//测试分页查询
@Test
public void pageSearch(){
	//current当前页 size页大小
	Page<User> page = new Page<>(1,5);

	userDao.selectPage(page, null);
	page.getRecords().forEach(System.out::println);
}

逻辑删除

  • 物理删除:直接从数据库中删除
  • 逻辑删除:在数据库中没有被移除,只是标记为删除,例如deleted字段

高版本中只需要加入变量就行

@TableLogic
private Integer deleted;

配置application.properties配置文件

#逻辑删除,没删设0,删了设1
mybatis-plus.global-config.db-config.logic-delete-field=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0
@Test
public void delete(){
	userDao.deleteById(1304673079976280066L);
}

可以看出delete方法执行时时update语句,查询的时候也会自动判断deleted属性,被标记删除的数据,就查询不到

在这里插入图片描述
在这里插入图片描述


条件构造器Wrapper

遇到复杂的sql可以使用wrapper,AbstractWrapperQueryWrapperUpdateWrapper 的父类,用于生成sql的where条件,entity属性也用于生成sql的where条件

MyBatis-Plus官方文本

@Test
public void test1(){
    //查询name邮箱不为空,年龄大于等于12的用户
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.isNotNull("name")
            .isNotNull("email")
            .ge("age",12);
    userDao.selectList(wrapper).forEach(System.out::println);
}

代码自动生成器

AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值