【Mybatis-plus】应用笔记及用例(持续更新)
前言
公司架构层面推 Mybatis-plus,这里花半天学习下,记录点笔记。内容包括:
- 使用
- 查询构造器使用
- 分页插件使用
- 代码生成
- 技巧
- 打印完整sql方便验证结论
- Mybatis-plus 新的官网域名有问题,用这个 https://baomidou.com/getting-started/
- 其他
- 本来想把代码推到代码仓的,但是网络有问题…后面补
- 使用 Spring Boot 3 集成
完整sql打印
为了测试效果,用了官方推荐的sql日志依赖,官方没有提到的是这个依赖兼容 druid,而且无侵入。用的是代理数据库驱动的方式。重点是引入依赖不需要任何配置就能用起来
<dependency>
<groupId>com.github.gavlyukovskiy</groupId>
<artifactId>p6spy-spring-boot-starter</artifactId>
<version>1.11.0</version>
</dependency>
单表CRUD 快速支持
以下代码都可以用代码生成器做出来,后文贴出所有配置
public interface ActivityInfoMapper extends BaseMapper<ActivityInfo> {
}
@Data
@TableName("xx_activity_info")
public class ActivityInfo implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@TableField("name")
private String name;
}
复杂sql代码化
以下sql映射
SELECT id,name FROM tm_activity_info
WHERE (name = 'A' AND (name LIKE '%A%' OR name LIKE '%B%' OR name LIKE '%C%') AND name = 'D');
@Test
public void testUsingNested() {
// 查询条件
LambdaQueryWrapper<ActivityInfo> wrapper = Wrappers.lambdaQuery();
wrapper.eq(ActivityInfo::getName, "A")
.nested(w ->
w.like(ActivityInfo::getName, "A")
.or().like(ActivityInfo::getName, "B")
.or().like(ActivityInfo::getName, "C"))
.eq(ActivityInfo::getName, "D");
activityInfoMapper.selectList(wrapper);
}
分页插件
配置
@Configuration
@MapperScan("com.james.initializr.mapper")
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 如果配置多个插件, 切记分页最后添加
return interceptor;
}
}
以下sql映射
SELECT id,name FROM xx_activity_info LIMIT 2,2;
@Test
public void testGetAllRecordsWhenPage() {
IPage<ActivityInfo> pageQuery = new Page<>(2, 2);
// pageQuery.setSize(-1); 如果加上行代码,表示查所有数据
IPage<ActivityInfo> pageResult = activityInfoMapper.selectPage(pageQuery, null);
log(pageResult, "分页用例");
}
private void log(IPage<ActivityInfo> page, String remark) {
logger.info("==== {} ==== 记录总数={} 一页数量={} 总页数={} 当前页={} ",
remark, page.getTotal(), page.getSize(), page.getPages(), page.getCurrent());
page.getRecords().forEach(r -> logger.info(r.toString()));
logger.info("==== {} ====", remark);
}
代码生成
用的最新版的生成方式,并列出官网没有给齐的依赖声明
@Test
public void test() {
FastAutoGenerator.create(url, username, password)
.globalConfig(builder -> {
String dateStr = new SimpleDateFormat("MM月dd日hh时mm分").format(new Date());
String dir = "D://mp-gen/" + dateStr + "/";
builder.author("yangchenghan").outputDir(dir) ; // 指定输出目录
})
.packageConfig(builder ->
builder.parent("com.james.initializr") // 包名
.entity("entity")
.mapper("mapper")
.xml("mapperXml")
)
.strategyConfig(builder -> {
builder.addInclude("xx_activity_info") // 设置需要生成的表名
.addTablePrefix("xx_", "xxx_")
.entityBuilder()
.enableTableFieldAnnotation()
.serviceBuilder().disable()
.controllerBuilder().disable()
.mapperBuilder().enableBaseColumnList().enableBaseResultMap()
;
}
)
.templateEngine(new FreemarkerTemplateEngine())
.execute();
}
默认的交互方式是弹出文件目录,自行复制到项目中
依赖声明
<properties>
<java.version>17</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-bom</artifactId>
<version>3.5.11</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-3-starter</artifactId>
<version>1.2.22</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-jsqlparser</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>com.github.gavlyukovskiy</groupId>
<artifactId>p6spy-spring-boot-starter</artifactId>
<version>1.11.0</version>
</dependency>
</dependencies>
后记
一开始接触 Mybatis-plus,应该是5年前刚入行,那会 QueryWrapper 被到处封装和使用,污染了 Service层。
目前依旧坚持只在mapper层用,其他高级的功能需要用到再持续记录。