Mybatis-Plus的入门心得,太好用了吧,事倍功半。

2023-11-01 03:50

本文主要是介绍Mybatis-Plus的入门心得,太好用了吧,事倍功半。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

MyBatisPlus概述

需要的基础:把我的MyBatis、Spring、SpringMVC就可以学习这个了!
为什么要学习它呢?MyBatisPlus可以节省我们大量工作时间,所有的CRUD代码它都可以自动化完成!
JPA 、 tk-mapper、MyBatisPlus

简介

是什么? MyBatis 本来就是简化 JDBC 操作的!
官网:https://mp.baomidou.com/ MyBatis Plus,简化 MyBatis !
在这里插入图片描述
在这里插入图片描述

特性

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作, BaseMapper
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分
    CRUD 操作,更有强大的条件构造器,满足各类使用需求, 以后简单的CRUD操作,它不用自己编写
    了!
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配
    置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大
    的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、
    Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用(自动帮你生成代码)
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同
    于普通 List 查询
  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、
    Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢
    查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误
    操作

快速入门

地址:https://mp.baomidou.com/guide/quick-start.html#初始化工程
使用第三方组件:
1、导入对应的依赖
2、研究依赖如何配置
3、代码如何编写
4、提高扩展技术能力!

1、创建数据库相应的表

1、创建数据库 mybatis_plus,运行下方代码创建数据表user

CREATE TABLE user 
(id BIGINT(20) NOT NULL COMMENT '主键ID', name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',age INT(11) NULL DEFAULT NULL COMMENT '年龄', email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱', PRIMARY KEY (id) );INSERT INTO user (id, name, age, email) VALUES (1, 'Jone', 18, 'test1@baomidou.com'), (2, 'Jack', 20, 'test2@baomidou.com'), (3, 'Tom', 28, 'test3@baomidou.com'), (4, 'Sandy', 21, 'test4@baomidou.com'),(5, 'Billie', 24, 'test5@baomidou.com');

慢慢改善:最后完善的sql表格
在这里插入图片描述

2、编写项目,初始化项目!使用SpringBoot初始化!

2.1、导入依赖

<dependencies><!-- 数据库驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!-- mybatis-plus --> <!-- mybatis-plus 是自己开发,并非官方的! --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.0.5</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency></dependencies>

说明:我们使用 mybatis-plus 可以节省我们大量的代码,尽量不要同时导入 mybatis 和 mybatis-plus!版本的差异!

2.2、、连接数据库!这一步和 mybatis 相同!

最初开始测试的环境:

# mysql 5 驱动不同 com.mysql.jdbc.Driver
# mysql 8 驱动不同com.mysql.cj.jdbc.Driver、需要增加时区的配置 serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis-plus?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8&zeroDateTimeBehavior=convertToNull
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

下面是完善的环境:
在这里插入图片描述

2.3、建立实体类pojo和对应的Mapper进行测试

pojo实体类:

@Data@AllArgsConstructor@NoArgsConstructor public class User {private Long id; private String name; private Integer age; private String email; }

下面是测试之后的慢慢进行:
在这里插入图片描述
mapper接口:

package com.xiaotang.demo.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xiaotang.demo.pojo.User;
import org.springframework.stereotype.Repository;// 在对应的Mapper上面继承基本的类 BaseMapper
@Repository // 代表持久层
public interface UserMapper extends BaseMapper<User> {// 所有的CRUD操作都已经编写完成了// 你不需要像以前的配置一大堆文件了!}

注意点,我们需要在主启动类上去扫描我们的mapper包下的所有接口

在这里插入图片描述

2.4、测试类中测试

先测试数据库的连接:

@AutowiredDataSource dataSource;@AutowiredUserMapper userMapper;@Testvoid contextLoads() throws SQLException {System.out.println(dataSource.getConnection());System.out.println(dataSource.getClass());}

在这里插入图片描述

3、开始进行简化的测试,直接可用

3.1、测试查询所有信息

    //参数是一个wrapper ,条件构造器,这里我们先不用nu1l//查询全部用户@Testvoid Test(){List<User> users = userMapper.selectList(null);users.forEach(System.out::println);System.out.println();}

新建的数据表也能查询成功

这是完善的数据表结果:

在这里插入图片描述
思考一个问题
1、SQL谁帮我们写的 ? MyBatis-Plus 都写好了
2、方法哪里来的? MyBatis-Plus 都写好了

3.2、配置日志

我们所有的sql现在是不可见的,我们希望知道它是怎么执行的,所以我们必须要看日志!
在配置环境中配置日志:

# 配置日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

配置完毕日志之后,后面的学习就需要注意这个自动生成的SQL,你们就会喜欢上 MyBatis-Plus!
在运行上方的测试sql就会打印出来了

完善的表格信息再下图:

在这里插入图片描述

4、CRUD扩展

4.1、Insert 插入

测试插入:

 @Testvoid testInsert(){User user = new  User();user.setName("永远的神");user.setAge(18);user.setEmail("123456789@qq.com");int i=userMapper.insert(user);System.out.println(i);System.out.println(user);}

结果:
在这里插入图片描述
数据库插入的id的默认值为:全局的唯一id
在数据库中可以直接设置:这种方式中间被删了不太直观
在这里插入图片描述
下方是雪花算法:
1、实体类字段上 @TableId(type = IdType.AUTO)
2、数据库字段一定要是自增!

在这里插入图片描述

阅读源码:ctrl+鼠标左键
在这里插入图片描述
3、再次测试插入即可!

4.2、更新操作

 @Testvoid testUpdate(){User user = new User();user.setId(6l);user.setName("龙飞飞");// int i= userMapper.updateById(user);int i= userMapper.updateById(user);System.out.println(i);}

在这里插入图片描述

所有的sql都是自动帮你动态配置的!

4.3、自动填充操作的时间

创建时间、修改时间!这些个操作一遍都是自动化完成的,我们不希望手动更新!
阿里巴巴开发手册:所有的数据库表:gmt_create、gmt_modified几乎所有的表都要配置上!而且需要自动化!
1、在表中新增字段 create_time, update_time
2、我们需要先把实体类同步!实体类字段属性上需要增加注解

private Date createTime; 
private Date updateTime;

在这里插入图片描述
3、编写处理器来处理这个注解即可!

package com.xiaotang.demo.handler;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;import java.util.Date;@Slf4j
@Component // 一定不要忘记把处理器加到IOC容器中!
public class MyMetaObjectHandler implements MetaObjectHandler {// 插入时的填充策略@Overridepublic void insertFill(MetaObject metaObject) {log.info("start insert fill.....");// setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObjectthis.setFieldValByName("createTime",new Date(),metaObject);this.setFieldValByName("updateTime",new Date(),metaObject);}// 更新时的填充策略@Overridepublic void updateFill(MetaObject metaObject) {log.info("start update fill.....");this.setFieldValByName("createTime",new Date(),metaObject);this.setFieldValByName("updateTime",new Date(),metaObject);}
}

4、测试插入
5、测试更新、观察时间即可!

4.4、乐观锁的简介与使用

在面试过程中,我们经常会被问道乐观锁,悲观锁!这个其实非常简单!
乐观锁 : 故名思意十分乐观,它总是认为不会出现问题,无论干什么不去上锁!如果出现了问题,再次更新值测试
悲观锁:故名思意十分悲观,它总是认为总是出现问题,无论干什么都会上锁!再去操作!

我们这里主要讲解 乐观锁机制!
乐观锁实现方式:

  • 取出记录时,获取当前 version
  • 更新时,带上这个version
  • 执行更新时, set version = newVersion where version = oldVersion
  • 如果version不对,就更新失败
**乐观锁:**
1、先查询,获得版本号 version = 1-- Aupdate user set name = "yingwei", version = version + 1 where id = 2 and version = 1 -- B 线程抢先完成,这个时候 version = 2,会导致 A 修改失败!update user set name = "yingwei", version = version + 1 where id = 2 and version = 1

具体实现:
1、给数据库中增加version字段!
在这里插入图片描述

2、我们实体类加对应的字段

    @Version //乐观锁Version注解private Integer version;

3、注册组件

// 扫描我们的 mapper 文件夹
@MapperScan("com.xaiotang.demo.mapper")
@EnableTransactionManagement // 自动管理 事物
@Configuration // 配置类
public class MyBatisPlusConfig {// 注册乐观锁插件@Beanpublic OptimisticLockerInterceptor optimisticLockerInterceptor() {return new OptimisticLockerInterceptor();}

4、测试一下!

 // 测试乐观锁成功!@Testpublic void testOptimisticLocker(){// 1、查询用户信息User user = userMapper.selectById(1L);System.out.println(user);// 2、修改用户信息user.setName("yingwei");user.setEmail("24736743@qq.com");// 3、执行更新操作userMapper.updateById(user);}// 测试乐观锁失败!多线程下@Testpublic void testOptimisticLocker2(){// 线程 1User user = userMapper.selectById(1L);user.setName("龙本飞龙111");user.setEmail("24736743@qq.com");// 模拟另外一个线程执行了插队操作User user2 = userMapper.selectById(1L);user2.setName("殷龙飞");user2.setEmail("24736743@qq.com");userMapper.updateById(user2);// 自旋锁来多次尝试提交!userMapper.updateById(user); // 如果没有乐观锁就会覆盖插队线程的值!}

通过
在这里插入图片描述

进程抢占冲突:
在这里插入图片描述
相应的version也会自增:
在这里插入图片描述

4.5、查询操作

  // 测试查询@Testpublic void testSelectById(){// User user = userMapper.selectById(1L);User user = userMapper.selectById(1l);System.out.println(user);}// 测试批量查询!@Testpublic void testSelectByBatchId(){List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));users.forEach(System.out::println);}// 按条件查询之一使用map操作,mybatis-plus按条件拼接@Testpublic void testSelectByBatchIds(){//HashMap<String, Object> map = new HashMap<>();HashMap<String,Object> map = new HashMap<>();// 自定义要查询map.put("name","龙飞飞");map.put("age",22);List<User> users = userMapper.selectByMap(map);users.forEach(System.out::println);}

测试的一些结果:
在这里插入图片描述

4.6、分页查询

分页在网站使用的十分之多!
1、原始的 limit 进行分页
2、pageHelper 第三方插件
3、Mybatis-Plus 其实也内置了分页插件!

1、配置拦截器组件即可

 // 分页插件@Beanpublic PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor();}

在这里插入图片描述
2、直接使用Page对象即可!

 // 测试分页查询@Testpublic void testPage(){//  参数一:当前页//  参数二:页面大小//  使用了分页插件之后,所有的分页操作也变得简单的!Page<User> page = new Page<>(1,5);userMapper.selectPage(page,null);page.getRecords().forEach(System.out::println);System.out.println(page.getTotal());}

结果:
在这里插入图片描述

4.7、删除操作

1、根据 id 删除记录

// 测试删除@Testpublic void testDeleteById(){userMapper.deleteById(1L);}// 通过id批量删除,选择多个信息进行删除@Testpublic void testDeleteBatchId(){userMapper.deleteBatchIds(Arrays.asList(2L,3L));}// 通过map删除@Testpublic void testDeleteMap(){HashMap<String, Object> map = new HashMap<>();map.put("name","yingwei");userMapper.deleteByMap(map);}

4.8、逻辑删除

这也就是为什么商品被删除了用户看不到,管理员看删除记录却能看得到
物理删除 :从数据库中直接移除
逻辑删除 :再数据库中没有被移除,而是通过一个变量来让他失效! deleted = 0 => deleted = 1
管理员可以查看被删除的记录!防止数据的丢失,类似于回收站!
测试一下:
1、在数据表中增加一个 deleted 字段
在这里插入图片描述
2、实体类中增加属性

 @TableLogic //逻辑删除private Integer deleted;

3、配置!

  // 逻辑删除组件!@Bean public ISqlInjector sqlInjector() {return new LogicSqlInjector();}

在配置环境中配置

# 配置逻辑删除
mybatis-plus.global-config.db-config.logic-delete-value=1 
mybatis-plus.global-config.db-config.logic-not-delete-value=0

在这里插入图片描述

4、测试一下删除!
在这里插入图片描述
记录依旧在数据库,但是值确已经变化了!
相当于一个修改字段的值进行改变了
在这里插入图片描述
以上的所有CRUD操作及其扩展操作,我们都必须精通掌握!会大大提高你的工作和写项目的效率!

5、性能分析插件

我们在平时的开发中,会遇到一些慢sql。测试! druid,
作用:性能分析拦截器,用于输出每条 SQL 语句及其执行时间
MP也提供性能分析插件,如果超过这个时间就停止运行!

1、导入插件

 /*** SQL执行效率插件*/@Bean@Profile({"dev","test"})// 设置 dev test 环境开启,保证我们的效率public PerformanceInterceptor performanceInterceptor() {PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();performanceInterceptor.setMaxTime(100); //ms 设置sql执行的最大时间,如果超过了则不执行performanceInterceptor.setFormat(true);return performanceInterceptor;}

记住,要在SpringBoot中配置环境为dev或者 test 环境!
在这里插入图片描述

2、测试使用!每一个sql都可以测试的

在这里插入图片描述

使用性能分析插件,可以帮助我们提高效率!

6、条件构造器

十分重要:Wrapper
我们写一些复杂的sql就可以使用它来替代!具体信息看官方文档
在这里插入图片描述

一些简单的条件测试:

  @Autowiredprivate UserMapper userMapper;@Testvoid contextLoads() {// 查询name不为空的用户,并且邮箱不为空的用户,年龄大于等于12
//        QueryWrapper<User> wrapper = new QueryWrapper<>();
//        wrapper
//                .isNotNull("name")
//                .isNotNull("email")
//                .ge("age",12);
//        userMapper.selectList(wrapper).forEach(System.out::println); // 和我们刚才学习的map对比一下QueryWrapper<User> wrapper1=new QueryWrapper<>();wrapper1.isNotNull("name").isNotNull("email");userMapper.selectList(wrapper1).forEach(System.out::println);}@Testvoid test2(){// 查询名字龙飞飞QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.eq("name","龙飞飞");User user = userMapper.selectOne(wrapper); // 查询一个数据,出现多个结果使用List 或者 MapSystem.out.println(user);}@Testvoid test3(){// 查询年龄在 20 ~ 30 岁之间的用户QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.between("age",20,30); // 区间Integer count = userMapper.selectCount(wrapper);// 查询结果数System.out.println(count);}// 模糊查询@Testvoid test4(){// 查询年龄在 20 ~ 30 岁之间的用户QueryWrapper<User> wrapper = new QueryWrapper<>();// 左和右  t%wrapper.notLike("name","e").likeRight("email","t");List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);maps.forEach(System.out::println);}// 模糊查询@Testvoid test5(){QueryWrapper<User> wrapper = new QueryWrapper<>();// id 在子查询中查出来wrapper.inSql("id","select id from user where id<3");List<Object> objects = userMapper.selectObjs(wrapper);objects.forEach(System.out::println);}//测试六@Testvoid test6(){QueryWrapper<User> wrapper = new QueryWrapper<>();// 通过id进行排序wrapper.orderByAsc("id");List<User> users = userMapper.selectList(wrapper);users.forEach(System.out::println);}

7、代码自动生成器模板

dao、pojo、service、controller都给我自己去编写完成!
AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、
Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。
测试:

package com.xiaotang.demo.generator;import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;public class CodeGenerator {public static void main(String[] args) {// 1、创建代码生成器AutoGenerator mpg = new AutoGenerator();// 2、全局配置GlobalConfig gc = new GlobalConfig();String projectPath = System.getProperty("user.dir");gc.setOutputDir(projectPath + "/src/main/java");gc.setAuthor("遇见狂神说");gc.setOpen(false); //生成后是否打开资源管理器gc.setFileOverride(false); //重新生成时文件是否覆盖gc.setServiceName("%sService");	//去掉Service接口的首字母Igc.setIdType(IdType.ID_WORKER_STR); //主键策略gc.setDateType(DateType.ONLY_DATE);//定义生成的实体类中日期类型gc.setSwagger2(true);//开启Swagger2模式mpg.setGlobalConfig(gc);// 3、数据源配置DataSourceConfig dsc = new DataSourceConfig();dsc.setUrl("jdbc:mysql://localhost:3306/kuangstudy?useUnicode=true&characterEncoding=utf-8&useSSL=false");dsc.setDriverName("com.mysql.jdbc.Driver");dsc.setUsername("root");dsc.setPassword("123456");dsc.setDbType(DbType.MYSQL);mpg.setDataSource(dsc);// 4、包配置PackageConfig pc = new PackageConfig();pc.setModuleName("kuang");pc.setParent("com");pc.setController("controller");pc.setEntity("pojo");pc.setService("service");pc.setMapper("mapper");mpg.setPackageInfo(pc);// 5、策略配置StrategyConfig strategy = new StrategyConfig();//strategy.setInclude("ks_\\w*");//设置要映射的表名strategy.setInclude("ks_download");//设置要映射的表名strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略strategy.setTablePrefix("ks_");//设置表前缀不生成strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库表字段映射到实体的命名策略strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作strategy.setRestControllerStyle(true); //restful api风格控制器strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符mpg.setStrategy(strategy);// 6、执行mpg.execute();}
}

根据狂神笔记进行操作修改

这篇关于Mybatis-Plus的入门心得,太好用了吧,事倍功半。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/320270

相关文章

MyBatis-Plus 中 nested() 与 and() 方法详解(最佳实践场景)

《MyBatis-Plus中nested()与and()方法详解(最佳实践场景)》在MyBatis-Plus的条件构造器中,nested()和and()都是用于构建复杂查询条件的关键方法,但... 目录MyBATis-Plus 中nested()与and()方法详解一、核心区别对比二、方法详解1.and()

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

Redis 配置文件使用建议redis.conf 从入门到实战

《Redis配置文件使用建议redis.conf从入门到实战》Redis配置方式包括配置文件、命令行参数、运行时CONFIG命令,支持动态修改参数及持久化,常用项涉及端口、绑定、内存策略等,版本8... 目录一、Redis.conf 是什么?二、命令行方式传参(适用于测试)三、运行时动态修改配置(不重启服务

MySQL DQL从入门到精通

《MySQLDQL从入门到精通》通过DQL,我们可以从数据库中检索出所需的数据,进行各种复杂的数据分析和处理,本文将深入探讨MySQLDQL的各个方面,帮助你全面掌握这一重要技能,感兴趣的朋友跟随小... 目录一、DQL 基础:SELECT 语句入门二、数据过滤:WHERE 子句的使用三、结果排序:ORDE

MyBatis ResultMap 的基本用法示例详解

《MyBatisResultMap的基本用法示例详解》在MyBatis中,resultMap用于定义数据库查询结果到Java对象属性的映射关系,本文给大家介绍MyBatisResultMap的基本... 目录MyBATis 中的 resultMap1. resultMap 的基本语法2. 简单的 resul

Mybatis的分页实现方式

《Mybatis的分页实现方式》MyBatis的分页实现方式主要有以下几种,每种方式适用于不同的场景,且在性能、灵活性和代码侵入性上有所差异,对Mybatis的分页实现方式感兴趣的朋友一起看看吧... 目录​1. 原生 SQL 分页(物理分页)​​2. RowBounds 分页(逻辑分页)​​3. Page

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis