or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

active-record.mdcondition-builders.mdindex.mdkotlin-extensions.mdpagination.mdplugin-system.mdservice-layer.mdstatic-utilities.md

index.mddocs/

0

# MyBatis-Plus Extension

1

2

MyBatis-Plus Extension is an advanced toolkit that enhances MyBatis-Plus with comprehensive service layers, Kotlin extensions, SQL parsers, caching mechanisms, and various interceptors. It provides higher-level abstractions and utilities that build upon the core MyBatis-Plus functionality to significantly reduce boilerplate code and improve development productivity in enterprise Java applications.

3

4

## Package Information

5

6

- **Package Name**: mybatis-plus-extension

7

- **Package Type**: maven

8

- **Language**: Java/Kotlin

9

- **Group ID**: com.baomidou

10

- **Artifact ID**: mybatis-plus-extension

11

- **Installation**: Add to your Maven dependencies:

12

13

```xml

14

<dependency>

15

<groupId>com.baomidou</groupId>

16

<artifactId>mybatis-plus-extension</artifactId>

17

<version>3.5.7</version>

18

</dependency>

19

```

20

21

Or Gradle:

22

23

```gradle

24

implementation 'com.baomidou:mybatis-plus-extension:3.5.7'

25

```

26

27

## Core Imports

28

29

```java

30

import com.baomidou.mybatisplus.extension.service.IService;

31

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

32

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

33

import com.baomidou.mybatisplus.extension.conditions.query.QueryWrapper;

34

import com.baomidou.mybatisplus.extension.toolkit.Db;

35

```

36

37

## Basic Usage

38

39

```java

40

import com.baomidou.mybatisplus.extension.service.IService;

41

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

42

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

43

import com.baomidou.mybatisplus.extension.conditions.query.QueryWrapper;

44

45

// Define a service interface

46

public interface UserService extends IService<User> {

47

// Custom methods can be added here

48

}

49

50

// Implement the service

51

@Service

52

public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

53

// ServiceImpl provides all CRUD operations automatically

54

}

55

56

// Use the service

57

@Autowired

58

private UserService userService;

59

60

// Basic CRUD operations

61

User user = new User("John", "john@example.com");

62

userService.save(user);

63

64

List<User> users = userService.list();

65

User foundUser = userService.getById(1L);

66

67

// Query with conditions

68

List<User> activeUsers = userService.list(

69

new QueryWrapper<User>().eq("active", true)

70

);

71

72

// Pagination

73

Page<User> page = userService.page(new Page<>(1, 10));

74

```

75

76

## Architecture

77

78

MyBatis-Plus Extension is built around several key architectural components:

79

80

- **Service Layer**: `IService` interface and `ServiceImpl` base class providing comprehensive CRUD operations

81

- **Condition Builders**: Chain-style query and update wrappers for fluent API construction

82

- **Plugin System**: Interceptor-based architecture for cross-cutting concerns like pagination, multi-tenancy, and data permissions

83

- **Active Record**: Model base class enabling entity-level CRUD operations

84

- **Static Utilities**: `Db` class providing service-layer operations without dependency injection

85

- **Kotlin Extensions**: Type-safe Kotlin DSL wrappers for enhanced developer experience

86

- **SQL Parser Integration**: JSqlParser-based SQL manipulation and analysis capabilities

87

88

## Capabilities

89

90

### Service Layer

91

92

Comprehensive service layer with `IService` interface providing all common CRUD operations, batch processing, and method chaining. The `ServiceImpl` base class offers ready-to-use implementations.

93

94

```java { .api }

95

public interface IService<T> {

96

int DEFAULT_BATCH_SIZE = 1000;

97

98

// Save operations

99

boolean save(T entity);

100

boolean saveBatch(Collection<T> entityList);

101

boolean saveBatch(Collection<T> entityList, int batchSize);

102

boolean saveOrUpdate(T entity);

103

boolean saveOrUpdateBatch(Collection<T> entityList);

104

boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);

105

106

// Query operations

107

T getById(Serializable id);

108

Optional<T> getOptById(Serializable id);

109

List<T> list();

110

List<T> list(Wrapper<T> queryWrapper);

111

List<T> listByIds(Collection<? extends Serializable> idList);

112

List<T> listByMap(Map<String, Object> columnMap);

113

T getOne(Wrapper<T> queryWrapper);

114

T getOne(Wrapper<T> queryWrapper, boolean throwEx);

115

Optional<T> getOneOpt(Wrapper<T> queryWrapper);

116

Optional<T> getOneOpt(Wrapper<T> queryWrapper, boolean throwEx);

117

Map<String, Object> getMap(Wrapper<T> queryWrapper);

118

<V> V getObj(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);

119

Page<T> page(IPage<T> page);

120

<E extends IPage<T>> E page(E page, Wrapper<T> queryWrapper);

121

long count();

122

long count(Wrapper<T> queryWrapper);

123

boolean exists(Wrapper<T> queryWrapper);

124

125

// Update operations

126

boolean updateById(T entity);

127

boolean update(T entity, Wrapper<T> updateWrapper);

128

boolean update(Wrapper<T> updateWrapper);

129

boolean updateBatchById(Collection<T> entityList);

130

boolean updateBatchById(Collection<T> entityList, int batchSize);

131

132

// Remove operations

133

boolean removeById(Serializable id);

134

boolean removeById(Serializable id, boolean useFill);

135

boolean removeById(T entity);

136

boolean removeByIds(Collection<?> list);

137

boolean removeByIds(Collection<?> list, boolean useFill);

138

boolean removeByMap(Map<String, Object> columnMap);

139

boolean remove(Wrapper<T> queryWrapper);

140

boolean removeBatchByIds(Collection<?> list);

141

boolean removeBatchByIds(Collection<?> list, boolean useFill);

142

143

// Chain operations

144

QueryChainWrapper<T> query();

145

LambdaQueryChainWrapper<T> lambdaQuery();

146

LambdaQueryChainWrapper<T> lambdaQuery(T entity);

147

KtQueryChainWrapper<T> ktQuery();

148

UpdateChainWrapper<T> update();

149

LambdaUpdateChainWrapper<T> lambdaUpdate();

150

KtUpdateChainWrapper<T> ktUpdate();

151

152

// Utility methods

153

BaseMapper<T> getBaseMapper();

154

Class<T> getEntityClass();

155

}

156

157

public abstract class ServiceImpl<M extends BaseMapper<T>, T> implements IService<T> {

158

@Autowired

159

protected M baseMapper;

160

protected final Log log;

161

private Class<T> entityClass;

162

private Class<M> mapperClass;

163

private volatile SqlSessionFactory sqlSessionFactory;

164

165

public M getBaseMapper();

166

public Class<T> getEntityClass();

167

public Class<M> getMapperClass();

168

protected SqlSessionFactory getSqlSessionFactory();

169

}

170

```

171

172

[Service Layer](./service-layer.md)

173

174

### Condition Builders

175

176

Fluent API for building complex database queries and updates with method chaining. Supports both traditional and lambda-based property references.

177

178

```java { .api }

179

public class QueryChainWrapper<T> implements ChainQuery<T> {

180

public QueryChainWrapper(BaseMapper<T> baseMapper);

181

public QueryChainWrapper(Class<T> entityClass);

182

183

public List<T> list();

184

public T one();

185

public long count();

186

public Page<T> page(IPage<T> page);

187

}

188

189

public class UpdateChainWrapper<T> implements ChainUpdate<T> {

190

public UpdateChainWrapper(BaseMapper<T> baseMapper);

191

public UpdateChainWrapper(Class<T> entityClass);

192

193

public boolean update();

194

public boolean remove();

195

}

196

```

197

198

[Condition Builders](./condition-builders.md)

199

200

### Plugin System

201

202

Interceptor-based plugin architecture supporting pagination, multi-tenancy, data permissions, optimistic locking, and SQL security features.

203

204

```java { .api }

205

public class MybatisPlusInterceptor implements Interceptor {

206

public void addInnerInterceptor(InnerInterceptor innerInterceptor);

207

public List<InnerInterceptor> getInterceptors();

208

}

209

210

public interface InnerInterceptor {

211

void willDoQuery(Executor executor, MappedStatement ms, Object parameter,

212

RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql);

213

void beforeQuery(Executor executor, MappedStatement ms, Object parameter,

214

RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql);

215

}

216

```

217

218

[Plugin System](./plugin-system.md)

219

220

### Pagination

221

222

Advanced pagination support with automatic total count queries and database-specific SQL dialect handling for optimal performance across different database systems.

223

224

```java { .api }

225

public class Page<T> implements IPage<T> {

226

// Constructors

227

public Page();

228

public Page(long current, long size);

229

public Page(long current, long size, long total);

230

public Page(long current, long size, boolean searchCount);

231

public Page(long current, long size, long total, boolean searchCount);

232

233

// Core getters

234

public List<T> getRecords();

235

public long getTotal();

236

public long getSize();

237

public long getCurrent();

238

public long getPages();

239

public List<OrderItem> orders();

240

241

// Fluent setters

242

public Page<T> setRecords(List<T> records);

243

public Page<T> setTotal(long total);

244

public Page<T> setSize(long size);

245

public Page<T> setCurrent(long current);

246

public Page<T> addOrder(OrderItem... items);

247

public Page<T> addOrder(List<OrderItem> items);

248

249

// Pagination utilities

250

public boolean hasPrevious();

251

public boolean hasNext();

252

public boolean searchCount();

253

public boolean optimizeCountSql();

254

public Page<T> setSearchCount(boolean searchCount);

255

public Page<T> setOptimizeCountSql(boolean optimizeCountSql);

256

257

// Static factory methods

258

public static <T> Page<T> of(long current, long size);

259

public static <T> Page<T> of(long current, long size, long total);

260

public static <T> Page<T> of(long current, long size, boolean searchCount);

261

public static <T> Page<T> of(long current, long size, long total, boolean searchCount);

262

}

263

```

264

265

[Pagination](./pagination.md)

266

267

### Active Record Pattern

268

269

Base `Model` class enabling entity objects to perform their own database operations, following the Active Record pattern for simplified data access.

270

271

```java { .api }

272

public abstract class Model<T extends Model<?>> implements Serializable {

273

public boolean insert();

274

public boolean deleteById();

275

public boolean updateById();

276

public T selectById();

277

public List<T> selectAll();

278

public Page<T> selectPage(IPage<T> page, Wrapper<T> queryWrapper);

279

}

280

```

281

282

[Active Record](./active-record.md)

283

284

### Static Database Utilities

285

286

`Db` utility class providing static methods for direct database operations without requiring service layer dependency injection, ideal for utility classes and static contexts.

287

288

```java { .api }

289

public class Db {

290

// Save operations

291

public static <T> boolean save(T entity);

292

public static <T> boolean saveBatch(Collection<T> entityList);

293

public static <T> boolean saveBatch(Collection<T> entityList, int batchSize);

294

public static <T> boolean saveOrUpdate(T entity);

295

public static <T> boolean saveOrUpdateBatch(Collection<T> entityList);

296

public static <T> boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);

297

298

// Query operations

299

public static <T> T getById(Serializable id, Class<T> entityClass);

300

public static <T> List<T> list(Class<T> entityClass);

301

public static <T> List<T> list(Class<T> entityClass, Wrapper<T> queryWrapper);

302

public static <T> List<T> listByIds(Collection<? extends Serializable> idList, Class<T> entityClass);

303

public static <T> List<T> listByMap(Map<String, Object> columnMap, Class<T> entityClass);

304

public static <T> T getOne(Class<T> entityClass, Wrapper<T> queryWrapper);

305

public static <T> Map<String, Object> getMap(Class<T> entityClass, Wrapper<T> queryWrapper);

306

public static <T> <V> V getObj(Class<T> entityClass, Wrapper<T> queryWrapper, Function<? super Object, V> mapper);

307

public static <T> long count(Class<T> entityClass);

308

public static <T> long count(Class<T> entityClass, Wrapper<T> queryWrapper);

309

public static <T> boolean exists(Class<T> entityClass, Wrapper<T> queryWrapper);

310

311

// Update operations

312

public static <T> boolean updateById(T entity);

313

public static <T> boolean update(T entity, Wrapper<T> updateWrapper);

314

public static <T> boolean update(Class<T> entityClass, Wrapper<T> updateWrapper);

315

public static <T> boolean updateBatchById(Collection<T> entityList);

316

public static <T> boolean updateBatchById(Collection<T> entityList, int batchSize);

317

318

// Remove operations

319

public static <T> boolean removeById(Serializable id, Class<T> entityClass);

320

public static <T> boolean removeByIds(Collection<? extends Serializable> idList, Class<T> entityClass);

321

public static <T> boolean removeByMap(Map<String, Object> columnMap, Class<T> entityClass);

322

public static <T> boolean remove(Class<T> entityClass, Wrapper<T> queryWrapper);

323

324

// Pagination operations

325

public static <T, E extends IPage<T>> E page(E page, Class<T> entityClass);

326

public static <T, E extends IPage<T>> E page(E page, Class<T> entityClass, Wrapper<T> queryWrapper);

327

public static <E extends IPage<Map<String, Object>>> E pageMaps(E page, Class<?> entityClass, Wrapper<?> queryWrapper);

328

329

// Chain operations

330

public static <T> QueryChainWrapper<T> query(Class<T> entityClass);

331

public static <T> LambdaQueryChainWrapper<T> lambdaQuery(Class<T> entityClass);

332

public static <T> KtQueryChainWrapper<T> ktQuery(Class<T> entityClass);

333

public static <T> UpdateChainWrapper<T> update(Class<T> entityClass);

334

public static <T> LambdaUpdateChainWrapper<T> lambdaUpdate(Class<T> entityClass);

335

public static <T> KtUpdateChainWrapper<T> ktUpdate(Class<T> entityClass);

336

}

337

```

338

339

[Static Database Utilities](./static-utilities.md)

340

341

### Kotlin Extensions

342

343

Type-safe Kotlin DSL providing enhanced developer experience with property-based query building and Kotlin-specific language features.

344

345

```kotlin { .api }

346

class KtQueryWrapper<T>(entity: T? = null) : AbstractKtWrapper<T, KtQueryWrapper<T>>() {

347

fun select(vararg columns: KProperty<*>): KtQueryWrapper<T>

348

fun getSqlSelect(): String

349

}

350

351

class KtUpdateWrapper<T>(entity: T? = null) : AbstractKtWrapper<T, KtUpdateWrapper<T>>()

352

```

353

354

[Kotlin Extensions](./kotlin-extensions.md)

355

356

## Core Types

357

358

```java { .api }

359

// Base service interface providing CRUD operations

360

public interface IService<T> {

361

int DEFAULT_BATCH_SIZE = 1000;

362

}

363

364

// Base service implementation

365

public abstract class ServiceImpl<M extends BaseMapper<T>, T> implements IService<T> {

366

@Autowired

367

protected M baseMapper;

368

protected final Log log;

369

private Class<T> entityClass;

370

private Class<M> mapperClass;

371

private volatile SqlSessionFactory sqlSessionFactory;

372

}

373

374

// Pagination container

375

public class Page<T> implements IPage<T> {

376

protected List<T> records;

377

protected long total;

378

protected long size;

379

protected long current;

380

protected List<OrderItem> orders;

381

protected boolean optimizeCountSql = true;

382

protected boolean searchCount = true;

383

protected boolean optimizeJoinOfCountSql = true;

384

protected Long maxLimit;

385

protected String countId;

386

}

387

388

// Active Record base class

389

public abstract class Model<T extends Model<?>> implements Serializable {

390

protected Serializable pkVal();

391

}

392

393

// Main interceptor coordinator

394

public class MybatisPlusInterceptor implements Interceptor {

395

private List<InnerInterceptor> interceptors;

396

}

397

```