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

整合Mybatis-plus及最佳实践

项目引入Mybatis-plus


第一步: 引入starter依赖

<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>

第二步: 使用@MapperScan扫描mapper文件夹

@SpringBootApplication
@MapperScan("com.shier.shierusercenterbackend.mapper")
public class ShierUserCenterBackendApplication {

    public static void main(String[] args) {
        SpringApplication.run(ShierUserCenterBackendApplication.class, args);
    }

}

第三步: 在application.yml文件里加上相应配置

mybatis-plus:
  configuration:
    map-underscore-to-camel-case: false # 驼峰转换
#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 日志
  global-config:
    db-config:
      logic-delete-field: delFlag # 全局逻辑删除的实体字段名
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
  1. **map-underscore-to-camel-case: false**

默认情况下,MyBatis-Plus 会将数据库中的下划线命名方式映射为驼峰命名方式(例如:user_name 转 为 userName)。通过将这个配置项设置为 false,禁用了这个默认的下划线转驼峰的功能。

  1. **log-impl: org.apache.ibatis.logging.stdout.StdOutImpl**

这是 MyBatis-Plus 的日志输出实现配置。在注释状态下,将使用 MyBatis 默认的日志输出实现,即输出到控制台。

  1. **global-config** 这个部分是 MyBatis-Plus 的全局配置项。
    • **db-config** 数据库配置部分。
      • **logic-delete-field: isDelete** 配置逻辑删除的实体字段名,即表示数据是否被删除的字段。在这里,配置为 isDelete,表明使用 isDelete 字段进行逻辑删除的标记。
      • **logic-delete-value: 1** 配置逻辑已删除的值。在这里,配置为 1,表示逻辑删除状态。
      • **logic-not-delete-value: 0** 配置逻辑未删除的值。在这里,配置为 0,表示逻辑未删除状态。

第四步: 加上Config文件

@Configuration
@EnableTransactionManagement
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        PaginationInnerInterceptor pii = new PaginationInnerInterceptor();
        pii.setDbType(DbType.MYSQL);
        pii.setMaxLimit(500L);
        interceptor.addInnerInterceptor(pii);
        return interceptor;
    }

    @Bean
    public ConfigurationCustomizer configurationCustomizer() {
        return configuration -> configuration.setUseDeprecatedExecutor(false);
    }
}


常用注解:


@TableName

用于指定数据库表名, 通常在实体类Entity上使用

例如: @TableName("user")

@TableId

用于指定表中的主键字段, 通常在实体类的主键属性上使用

例如: @TableId(value = "id", type = IdType.AUTO)

其中 value 表示主键字段名, type 表示主键生成策略

@TableField

用于指定表中的非主键字段, 可以用于实体类的属性上, 以映射属性和数据库字段

例如: @TableField(value = "user_name", exist = true)

value 表示数据库中的字段名,

exist 表示该字段是否存在, 默认为true, 设置为false表示在数据库中不存在该字段

@TableLogic

用于指定逻辑删除字段, 逻辑删除是指在数据库中标记,某个记录已删除, 而不是真正删除

例如: @TableLogic(value = "0", delval = "1")

value 表示未删除状态的默认值

delval 表示删除状态的值

@Version

用于指定乐观锁字段, 乐观锁是一种并发控制策略, 用于解决多线程同时修改同一条记录的问题

例如: @Version private Integer version

@EnumValue

用于指定枚举类型字段的映射

例如: @EnumValue private Integer status

@InterceptorIgnore

用于忽略MP拦截器的处理

例如: @InterceptorIgnore(tenantLine = "true")

表示忽略拦截器

@FieldFill 相关文章

解析Java中的MyBatis Plus注解 @FieldFill:优雅处理字段填充-阿里云开发者社区

条件构造器:


Mybatis-plus 的 Wrapper 是一个条件构造器, 用于简化复杂的SQL查询条件的构建

它提供了一系列易于使用的API, 让你能够以链式编程的方式编写查询条件

举个荔枝~

QueryWrapper

@Test
    public void testWrapper(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.like("username", "o")
                .eq("status", 1);
        userMapper.selectList(wrapper).forEach(System.out::println);
    }

看到左上角这玩意绿了说明单元测试通过了~

接下来我们用更进阶的方法进行查询, 也就是Lambda~

LambdaQueryWrapper

@Test
    public void testWrapper2(){
        PageParam pageParam = new PageParam();
        pageParam.setPageNum(1);
        pageParam.setPageSize(10);

        LambdaQueryWrapper<User> query = Wrappers.lambdaQuery();
        query.like(User::getUsername, "o")
                .eq(User::getStatus, 1)
                .orderByDesc(User::getBalance)
                .last("limit " + pageParam.getPageNum() + ", " + pageParam.getPageSize());

        List<User> users = userMapper.selectList(query);
        users.forEach(System.out::println);
    }

这里的代码有个小小的优化点

就是用户的状态status可以单独做一个枚举类去存放

因为状态是比较固定的值 不是0就是1 , 直接写死并不美观, 所以可以封装

LambdaQueryWrapper更好用, 因为它构建sql语句的时候, 需要用到数据库字段名,

上面一种方法很明显是直接在代码里写死字段名了, 一旦数据库的某些字段更改就寄了

所以我们采取第二种方法, 使用LambdaQueryWrapper<User> query = Wrappers.lambdaQuery()

这样就巧妙地避开了数据库某些字段的变更而导致代码失效~

静态工具Db:


这个可是重头戏了~

查询用户状态为 1 的所有用户信息

@Test
	public void testQuery(){
		List<User> users = Db.lambdaQuery(User.class).eq(User::getStatus, 1).list();
		users.forEach(System.out::println);
	}

查询多个用户的地址

        // 2.2根据用户ids查询地址
		List<Address> addresses = Db.lambdaQuery(Address.class)
									.in(Address::getUserId, userIds)
									.list();

查询用户Ids相关的用户信息, 根据Id分组, 存入Map

userMap = users.stream().collect(Collectors.groupingBy(User::getId));

这行代码用Id进行了数据分组, 便于存入hashMap中

@Test
	void testQueryByIds(){
		List<User> users = Db.lambdaQuery(User.class)
				.in(User::getId, 1L, 2L, 3L)
				.list();
		Map<Long, List<User>> userMap = new HashMap<>(0);
		if(CollUtil.isNotEmpty(users)){
			userMap = users.stream().collect(Collectors.groupingBy(User::getId));
		}
		userMap.forEach((k, v) -> {
			System.out.println("key = " + k);
			v.forEach(System.out::println);
		});
	}

Mybatis-plus 相关文章:

最新版MyBatis-Plus使用详解_Intelligent_M的博客-CSDN博客


http://www.kler.cn/a/371079.html

相关文章:

  • synchronized与ReentrantLock的区别
  • 【51 Pandas+Pyecharts | 深圳市共享单车数据分析可视化】
  • Ubuntu20.04 更新Nvidia驱动 + 安装CUDA12.1 + cudnn8.9.7
  • JavaSE笔记2】面向对象
  • 练习LabVIEW第二十一题
  • php怎么并发处理
  • Android中SurfaceView与GLSurfaceView 的关系
  • 3GPP协议解读_NTN系列(一)_38.811_非地面网络(NTN)的背景、应用场景和信道建模
  • 京东双十一高并发场景下的分布式锁性能优化
  • PHP显示数据库中图片BLOB格式
  • lvgl
  • 今日总结10.28
  • Android WebView加载不到cookie
  • Trains-03练习-结构
  • Android -- 调用系统相册之图片裁剪保存
  • java-web-day5
  • 科东软件荣获2024年广州科技创新创业大赛轨道交通行业赛“创新突围奖”
  • 有符号除法 简单的带小数计算及权重约束_2024年10月7日
  • Java Lock CountDownLatch 总结
  • 机器人转人工时,开启实时质检(mod_cti基于FreeSWITCH)
  • 计算机网络IP地址分类,子网掩码,子网划分复习资料
  • kafka 的高可用机制是什么?
  • zabbix 6.0 监控clickhouse(单机)
  • Spring 启动流程分析
  • 橘子多开同步器 v6.0 免费版
  • Redis-README官方入门文档