目录

一、依赖及配置

使用下面的SQL创建数据库与添加数据

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');

1、在idea中创建一个SpringBoot项目,在pom.xml中添需要的依赖

添加MyBatis-Plus、mysql连接驱动、lombok的依赖

<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>

2、配置数据库连接

application.yml

spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/mp
username: root
password: 1234

3、在启动类中添加注解 @MapperScan 扫描Mapper接口包

@SpringBootApplication
@MapperScan("com.jikedaquan.study.mp.mapper")
public class MpApplication { public static void main(String[] args) {
SpringApplication.run(MpApplication.class, args);
} }

4、编写实体类,使用lombok

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

5、编写UserMapper接口

UserMapper接口继承MyBatis-Plus提供的BaseMapper接口即可拥有CRUD的方法,泛型中填写操作的实体类,这里为User

public interface UserMapper extends BaseMapper<User> {
}

6、测试查询数据

@RunWith(SpringRunner.class)
@SpringBootTest
public class MpApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void contextLoads() {
List<User> userList = userMapper.selectList(null);//条件为null时查询所有数据
userList.forEach(System.out::println);
}
}

二、日志配置

配置日志到控制台输出

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

三、主键生成策略

MyBatis-Plus提供了多种主键生成策略以应对不同的场景

策略 说明
AUTO 数据库ID自增
NONE 该类型为未设置主键类型
INPUT 用户输入ID,该类型可以通过自己注册自动填充插件进行填充
ID_WORKER 全局唯一ID (idWorker)
UUID 全局唯一ID (UUID)
ID_WORKER_STR 字符串全局唯一ID (idWorker 的字符串表示)

1、注解控制主键生成策略

在实体类的主键字段上添加注解(自增时注意配合数据库设置)

@Data
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
}

2、全局配置控制主键生成策略

application.yml

mybatis-plus:
global-config:
db-config:
id-type: id_worker

四、自动填充

在常用业务中有些属性需要配置一些默认值,MyBatis-Plus提供了实现此功能的插件。在这里修改user表添加 create_time 字段和 update_time 字段,在User类中添加对应属性。

1、为需要自动填充的属性添加注解 @TableField

提供了4种自动填充策略:DEFAULT,默认不处理。INSERT,插入填充字段。UPDATE,更新填充字段。INSERT_UPDATE,插入和更新填充字段。

@Data
public class User {
private Long id;
private String name;
private Integer age;
private String email; @TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}

2、实现字段填充控制器,编写自定义填充规则

实现 MetaObjectHandler 接口,实现 insertFill 和 updateFill 方法,此处的 create_timeupdate_time字段需要插入时填充值, 只有 update_time 字段在修改时需要填充,所以策略如下。

//需要将自定义填充控制器注册为组件
@Component
public class MyMetaObjectHandler implements MetaObjectHandler { private static final Logger LOGGER= LoggerFactory.getLogger(MyMetaObjectHandler.class); //insert操作时要填充的字段
@Override
public void insertFill(MetaObject metaObject) {
LOGGER.info("start insert fill ...");
//根据属性名字设置要填充的值
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
} //update操作时要填充的字段
@Override
public void updateFill(MetaObject metaObject) {
LOGGER.info("start insert fill ...");
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}

3、插入数据测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class CRUDTest {
@Autowired
private UserMapper userMapper; @Test
public void testInsert(){
User user = new User();
user.setName("jack11");
user.setAge(20);
user.setEmail("4849111@qq.com"); int result= userMapper.insert(user);
System.out.println(result);
System.out.println(user);
}
}

4、修改数据测试

@Test
public void testUpdate(){
User user = new User();
user.setId(2L);
user.setName("Jackie");
int result = userMapper.updateById(user);
System.out.println(result);
}

一次插入数据后,create_timeupdate_time都被填充了设置的时间,做update操作后只有update_time的进行了填充修改。

五、乐观锁插件

乐观锁的核心原理就是提交版本必须等于记录当前版本才能执行更新

意图:

  • 当要更新一条记录的时候,希望这条记录没有被别人更新

乐观锁实现方式:

  • 取出记录时,获取当前version
  • 更新时,带上这个version
  • 执行更新时, set version = newVersion where version = oldVersion
  • 如果version不对,就更新失败

1、添加version到表和类中,为属性添加 @Version 注解

@Version
private Integer version;

2、配置插件

@Configuration
public class MyBatisPlusConfig { @Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
}

3、测试修改的两种情况

@Test
public void testOptimisticLocker1() {
User user = userMapper.selectById(1128212430124097543L);
user.setName("修改后");
int result = userMapper.updateById(user);
if (result == 1) {
System.out.println("修改成功");
} else {
System.out.println("修改失败");
}
} @Test
public void testOptimisticLocker2() {
User user = userMapper.selectById(1128212430124097543L);
user.setName("修改后");
user.setVersion(user.getVersion()-1);//测试旧版本
int result = userMapper.updateById(user);
if (result == 1) {
System.out.println("修改成功");
} else {
System.out.println("修改失败");
}
}

六、分页插件

启用分页插件和启用乐观锁插件都是通过注册一个Bean完成

1、启用分页插件

@Bean
public PaginationInterceptor paginationInterceptor(){
return new PaginationInterceptor();
}

2、测试分页查询

@Test
public void testSelectPage(){
//构建分页条件第二页每页显示3条
Page<User> page=new Page<>(2,3);
//使用分页条件查询,不使用其他条件
userMapper.selectPage(page, null);
//获取分页后查询出的记录
List<User> records = page.getRecords();
records.forEach(System.out::println);
System.out.println("是否有下一页:"+page.hasNext());
System.out.println("是否有上一页:"+page.hasPrevious());
System.out.println("总记录数:"+page.getTotal());
}

七、逻辑删除插件

有些数据希望不再展示,但在物理上仍然存在,这时可以使用逻辑删除。逻辑删除就是在表中添加一个逻辑字段(在上面基础上添加字段 deleted),删除的实质操作就是操作这个逻辑值,在查询、修改时根据此逻辑值进行近一步操作。

1、启用逻辑删除插件

@Bean
public LogicSqlInjector logicSqlInjector(){
return new LogicSqlInjector();
}

2、添加逻辑映射配置

mybatis-plus:
global-config:
db-config:
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

3、逻辑字段添加注解 @TableLogic

@TableLogic
private Integer deleted;

4、测试逻辑删除

@Test
public void testLogicDelete(){
int result=userMapper.deleteById(1L);
System.out.println(result);
}

观察日志可以看到生成的sql是update语句

八、性能分析插件

在开发和测试时观察sql执行耗时

1、配置SpringBoot为开发环境

spring:
profiles:
active: dev

2、启用插件

@Bean
@Profile({"dev","test"}) //设置 dev test 环境开启
public PerformanceInterceptor performanceInterceptor(){
return new PerformanceInterceptor();
}

九、CRUD其他操作

@Test
public void testSelectById() {
User user = userMapper.selectById(1L);
System.out.println(user);
} @Test
public void testSelectBatchIds() {
List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
users.forEach(System.out::println);
} @Test
public void testSelectByMap() {
Map<String, Object> param = new HashMap<>();
param.put("name", "jack");
param.put("age", 18);
List<User> users = userMapper.selectByMap(param);
users.forEach(System.out::println);
} @Test
public void testSelectMap(){
Page<User> page = new Page<>(2, 3);
IPage<Map<String, Object>> mapIPage = userMapper.selectMapsPage(page, null);
} @Test
public void testDeleteById(){
int result = userMapper.deleteById(1L);
System.out.println(result);
} @Test
public void testDeleteBatchIds(){
int result = userMapper.deleteBatchIds(Arrays.asList(2L,3L,4L));
System.out.println(result);
}

欢迎热爱技术的小伙伴和我交流

一文MyBatis-Plus快速入门的更多相关文章

  1. MyBatis(1)——快速入门

    MyBatis 简介 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为 ...

  2. (转) MyBatis(1)——快速入门

    MyBatis 简介 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为 ...

  3. mybatis框架快速入门

    通过快速入门示例,我们发现使用mybatis 是非常容易的一件事情,因为只需要编写 Dao 接口并且按照 mybatis要求编写两个配置文件,就可以实现功能.远比我们之前的jdbc方便多了.(我们使用 ...

  4. mybatis的快速入门

    说明: 在这个部分,会写个简单的入门案例. 然后,会重新写一个,更加严格的程序案例. 一:案例一 1.最终的目录结构 2.新建一个普通的Java项目,并新建lib 在项目名上右键,不是src. 3.导 ...

  5. spring3.0+mybatis+spring快速入门

    一.首先奉上项目目录结构: 说明: dao,mapping,model包下的所有内容可以使用Generator工具自助生成. 具体用法,可以网上学习一下,比较简单,主要做以下工作: 1.提供相关的数据 ...

  6. MyBatis框架——快速入门

    主流的ORM框架(帮助开发者实现数据持久化工作的框架): 1.MyBatis: 半自动化ORM框架,半自动:指框架只完成一部分功能,剩下的工作仍需开发者手动完成. MyBatis 框架没有实现 POJ ...

  7. 一文让你快速入门pytest框架

    pytest是什么 官方文档描述: pytest is a framework that makes building simple and scalable tests easy. Tests ar ...

  8. Java基础-SSM之mybatis快速入门篇

    Java基础-SSM之mybatis快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 其实你可能会问什么是SSM,简单的说就是spring mvc + Spring + m ...

  9. 一文快速入门分库分表中间件 Sharding-JDBC (必修课)

    书接上文 <一文快速入门分库分表(必修课)>,这篇拖了好长的时间,本来计划在一周前就该写完的,结果家庭内部突然人事调整,领导层进行权利交接,随之宣布我正式当爹,紧接着家庭地位滑落至第三名, ...

  10. Mybatis框架 的快速入门

    MyBatis 简介 什么是 MyBatis? MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果 ...

随机推荐

  1. Python基础:常用函数

    1:enumerate enumerate(sequence, start=0) 该函数返回一个enumerate对象(一个迭代器).其中的sequence参数可以是序列.迭代器或者支持迭代的其他对象 ...

  2. @codeforces - 1205C@ Palindromic Paths

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 这是一道交互题. 现在有一个 n*n 的矩阵,每个位置是 0 或 ...

  3. HZOJ 通讯

    B. 通讯 题目描述 “这一切都是命运石之门的选择.” 试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短 信,并由此得知了伦太郎制作出了电话微波炉(仮). 为了掌握时间机器的技术, ...

  4. adam调参

    微调 #阿尔法 "learning_rate": 3e-5, #学习率衰减 "weight_decay": 0.1,// "weight_decay& ...

  5. H3C 星型以太网拓扑扩展

  6. jieba分词工具的使用方法

    作为我这样的萌新,python代码的第一步是:#coding=utf-8 环境:python3.5+jieba0.39 一.jieba包安装方法: 方法1:使用conda安装 conda instal ...

  7. 2019-1-29-C#-Task.Run-和-Task.Factory.StartNew-区别

    title author date CreateTime categories C# Task.Run 和 Task.Factory.StartNew 区别 lindexi 2019-01-29 16 ...

  8. Python--day38--多进程的方法属性总结

    多进程的方法属性:

  9. H3C 环路避免机制二:水平分割

  10. linux设备驱动文件结构

    struct file, 定义于 <linux/fs.h>, 是设备驱动中第二个最重要的数据结构. 注意 file 与用户空间程序的 FILE 指针没有任何关系. 一个 FILE 定义在 ...