image.png

好几把炫酷

入门案例

导入坐标

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>

yml配置

1
2
3
4
5
6
7
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
username: root
password: root
url: jdbc:mysql:///db1?serverTimezone=UTC
type: com.alibaba.druid.pool.DruidDataSource

数据层接口

接口继承一个mybatisplus写好的mapper。

1
2
3
@Mapper
public interface BookDao extends BaseMapper<Book> {
}

注意,这里搜索的数据库表是按泛型中的类名来搜索的,比如这里就是连接的db1下的book表,如果要更改,要到实体类上添加注解。

1
2
@TableName("tb_book")
public class Book {

完成

mybatisplus会自动写好一些sql语句

1
2
3
4
5
6
7
8
9
10
11
12
@SpringBootTest
class MybatisPlusApplicationTests {
@Autowired
private BookDao bookDao;

@Test
void contextLoads() {
List<Book> books = bookDao.selectList(null);
System.out.println(books);
}

}

标准CRUD制作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@SpringBootTest
class MybatisPlusApplicationTests {
@Autowired
private BookDao bookDao;

@Test
void testSave(){
Book book = new Book("111","aaa","ddd");
bookDao.insert(book);
}

@Test
void testDelete(){
bookDao.deleteById(5);
}

@Test
void testUpdate(){
Book book = new Book();
book.setId(1);
book.setName("999999");
bookDao.updateById(book);
}

@Test
void testGetById(){
Book book = bookDao.selectById(1);
System.out.println(book);
}

注意,改操作是一个动态sql语句,可以随意更改。

分页查找

1
2
3
4
5
6
7
8
9
10
@Test
void testGetByPage() {
IPage page = new Page(1, 2);
bookDao.selectPage(page, null);
System.out.println("当前页码值" + page.getCurrent());
System.out.println("每页显示数: " + page.getSize());
System.out.println("一共多少页: " + page.getPages());
System.out.println("一共多少条数据: " + page.getTotal());
System.out.println("数据: " + page.getRecords());
}

需要配置mybatisplus拦截器

1
2
3
4
5
6
7
8
9
10
11
@Configuration
public class MpConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
// 创建mp拦截器
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
// 在mp拦截器中添加分页拦截器
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mybatisPlusInterceptor;
}
}

DQL编程控制

条件查询

需要封装wrapper对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    @Test
void testByCondition(){
// 按条件查询
// QueryWrapper queryWrapper = new QueryWrapper();
// queryWrapper.lt("id",3);
// List books = bookDao.selectList(queryWrapper);
// System.out.println(books);

// lambda格式
// QueryWrapper<Book> queryWrapper = new QueryWrapper();
// queryWrapper.lambda().lt(Book::getId,3);
// List books = bookDao.selectList(queryWrapper);
// System.out.println(books);

// lambda格式
// LambdaQueryWrapper<Book> lambdaQueryWrapper = new LambdaQueryWrapper<>();
// lambdaQueryWrapper.lt(Book::getId,3);
// List books = bookDao.selectList(lambdaQueryWrapper);
// System.out.println(books);

// 多条件查询
LambdaQueryWrapper<Book> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.lt(Book::getId,2).or().gt(Book::getId,3);
List books = bookDao.selectList(lambdaQueryWrapper);
System.out.println(books);
}

条件查询NULL判定

可在lt,gt方法中添加condition变量,,略过,,

查询投影

1
2
3
4
5
QueryWrapper<Book> queryWrapper = new QueryWrapper<Book>();
queryWrapper.select("count(*) as count,description");
queryWrapper.groupBy("description");
List<Map<String, Object>> maps = bookDao.selectMaps(queryWrapper);
System.out.println(maps);

查询条件设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//        等同
// LambdaQueryWrapper<Book> lambdaQueryWrapper = new LambdaQueryWrapper<>();
// lambdaQueryWrapper.eq(Book::getName,"444");
// Book book = bookDao.selectOne(lambdaQueryWrapper);
// System.out.println(book);

// 范围查询
// LambdaQueryWrapper<Book> lambdaQueryWrapper = new LambdaQueryWrapper<>();
// lambdaQueryWrapper.between(Book::getId,1,4);
// List<Book> books = bookDao.selectList(lambdaQueryWrapper);
// System.out.println(books);

// 模糊匹配
LambdaQueryWrapper<Book> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.like(Book::getType,"2");
List<Book> books = bookDao.selectList(lambdaQueryWrapper);
System.out.println(books);

字段映射和表名映射

在实体类中用@TableField注解中的属性Value来映射。列名和表名都可以。

属性exist可以去除数据库中实际没有的属性。

属性select可以使该属性不参与查询,例如密码。

DML编程控制

id生成策略

使用@TableId注解定义里面的type属性。

还可以在配置文件yml中全局配置。

多记录删除

传入一个list集合即可。

逻辑删除

在数据库(要有默认值)和实体类中添加一个状态字段,表示数据是否可用。

在实体类状态属性上添加一个注解@TableLogic,其中的value属性表示可用,delval表示不可用。

也可以在配置文件中全局配置 logic-delete-field, logic-delete-value。

之后所有的数据库操作都会带上and deleted=0这个条件。

乐观锁

在配置中添加一个拦截器。

1
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());

在实体类中version属性添加注解@version。