目录

一、依赖及配置

使用下面的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. oracle函数 add_months(d1,n1)

    [功能]:返回在日期d1基础上再加n1个月后新的日期. [参数]:d1,日期型,n1数字型 [返回]:日期

  2. oracle函数 SUBSTR(c1,n1[,n2])

    [功能]取子字符串 [说明]多字节符(汉字.全角符等),按1个字符计算 [参数]在字符表达式c1里,从n1开始取n2个字符;若不指定n2,则从第y个字符直到结束的字串. [返回]字符型 [示例] SQ ...

  3. git 本地仓库操作

    一.git对象模型和存储 二.常用命令 1)git checkout branch 切换分支 假设现在有两个分支,master和dev分支 i dev分支上没有readme.txt 在master分支 ...

  4. Strange Way to Express Integers

    I. Strange Way to Express Integers 题目描述 原题来自:POJ 2891 给定 2n2n2n 个正整数 a1,a2,⋯,ana_1,a_2,\cdots ,a_na​ ...

  5. ThinkPHP商城实战

    ThinkPHP3.2.3商城实战教程,需要的联系我,QQ:1844912514 千万级php电商秒杀项目实战  ,需要的联系我,QQ:1844912514

  6. [转]Android Studio实现代码混淆

     1,在build.grandle添加,其中规则写在proguard-rules.pro中,也可以自定义一个文件,将其代替,比如eclipse常用的 proguard-project.txt: bui ...

  7. pytorch之expand,gather,squeeze,sum,contiguous,softmax,max,argmax

    目录 gather squeeze expand sum contiguous softmax max argmax gather torch.gather(input,dim,index,out=N ...

  8. html(三)注册页面与重定向

    注册和登陆的建立是通过界面post提交表单然后在测试界面获取提交的值,进行判断. 1.测试传来的值,是否为空,将值传回到测试界面: ("Reg.jsp?errorCode=" + ...

  9. Python--day41--threading中的定时器Timer

    定时器Timer:定时开启线程 代码示例: #定时开启线程 import time from threading import Timer def func(): print('时间同步') #1-3 ...

  10. 【codeforces 789A】Anastasia and pebbles

    [题目链接]:http://codeforces.com/contest/789/problem/A [题意] 有n种物品,每种物品有wi个; 你有两个口袋,每个口袋最多装k个物品; 且口袋里面只能装 ...