当前位置: 首页 > news >正文

【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层用,其他高级的功能需要用到再持续记录。

相关文章:

  • esp32-idf Linux 环境安装教程
  • 【Code】《代码整洁之道》笔记-Chapter9-单元测试
  • 《Vue Router实战教程》1.设置
  • c#和form实现WebSocket在线聊天室
  • MATLAB求和∑怎么用?
  • CAP 定理与 BASE 定理在 .NET Core 中的应用
  • 操作系统学习笔记——进程间通信方式详解及优缺点对比,僵尸进程,孤儿进程,守护进程
  • 抗干扰CAN总线通信技术在分布式电力系统中的应用
  • 科技自立+产业周期:透视人工智能的配置机遇
  • RTP Payload Format for H.264 Vide(1)
  • Java Lambda 表达式详解:发展史、语法、使用场景及代码示例
  • Vue3性能优化全攻略:从原理到极致性能实战
  • vue入门:指令
  • 蓝桥杯 2025 C++组 省 B 题解
  • 面试算法高频05-bfs-dfs
  • 科技赋能记忆共生-郑州
  • 【Java学习笔记】Java第一课,梦开始的地方!!!
  • (八)lerobot开源项目扩展so100的仿真操控(操作记录)
  • 【NIO番外篇】之组件 Channel
  • 《车辆人机工程-》实验报告
  • 商务部新闻发言人就中美经贸对话磋商情况答记者问
  • 此前显示售罄的火车票“五一”前大量放出来了?12306回应
  • 人民日报评论员:焕发风雨无阻、奋勇前行的精气神
  • 国家网信办举办在欧中资企业座谈会,就数据跨境流动等进行交流
  • 中央网信办:重点整治违规AI产品、利用AI制作发布谣言等突出问题
  • 【社论】法治是对民营经济最好的促进