02-MyBatis-Plus详解

张开发
2026/4/11 19:39:15 15 分钟阅读

分享文章

02-MyBatis-Plus详解
MyBatis-Plus详解一、知识概述MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。它提供了通用的 CRUD 操作、强大的条件构造器、代码生成器、分页插件等功能,大大简化了数据访问层的开发工作。本文将深入讲解 MyBatis-Plus 的核心功能、原理和最佳实践,帮助你快速掌握这个强大的 ORM 增强框架。二、快速入门2.1 引入依赖!-- Maven 依赖 --dependencies!-- MyBatis-Plus --dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.5.5/version/dependency!-- 数据库驱动 --dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.33/version/dependency!-- Lombok(可选,简化代码) --dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependency/dependencies2.2 配置文件# application.ymlspring:datasource:driver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=truecharacterEncoding=utf-8serverTimezone=Asia/Shanghaiusername:rootpassword:123456# MyBatis-Plus 配置mybatis-plus:# Mapper XML 文件位置mapper-locations:classpath*:/mapper/**/*.xml# 实体类扫描路径type-aliases-package:com.example.entity# 配置configuration:# 开启驼峰命名转换map-underscore-to-camel-case:true# 日志输出log-impl:org.apache.ibatis.logging.slf4j.Slf4jImpl# 全局配置global-config:db-config:# 主键策略id-type:auto# 逻辑删除字段logic-delete-field:deletedlogic-delete-value:1logic-not-delete-value:02.3 快速使用/** * MyBatis-Plus 快速入门示例 */@SpringBootApplication@MapperScan("com.example.mapper")publicclassMyBatisPlusApplication{publicstaticvoidmain(String[]args){SpringApplication.run(MyBatisPlusApplication.class,args);}}/** * 实体类 */@Data@TableName("sys_user")// 指定表名publicclassUser{@TableId(type=IdType.AUTO)// 主键自增privateLongid;@TableField("username")// 指定字段名privateStringusername;privateStringemail;privateIntegerage;privateIntegerstatus;@TableField(fill=FieldFill.INSERT)// 自动填充privateDatecreateTime;@TableField(fill=FieldFill.INSERT_UPDATE)privateDateupdateTime;@TableLogic// 逻辑删除@TableField("is_deleted")privateIntegerdeleted;@Version// 乐观锁privateIntegerversion;@TableField(exist=false)// 非数据库字段privateStringextra;}/** * Mapper 接口 - 继承 BaseMapper 即可获得 CRUD 能力 */publicinterfaceUserMapperextendsBaseMapperUser{// BaseMapper 已提供:// - insert(T entity)// - deleteById(Serializable id)// - updateById(T entity)// - selectById(Serializable id)// - selectList(WrapperT wrapper)// - selectPage(PageT page, WrapperT wrapper)// ... 等十余个通用方法}/** * Service 接口 - 继承 IService */publicinterfaceUserServiceextendsIServiceUser{// IService 提供了更丰富的方法}/** * Service 实现 */@ServicepublicclassUserServiceImplextendsServiceImplUserMapper,UserimplementsUserService{// 无需手动编写 CRUD 方法}/** * 测试使用 */@SpringBootTestpublicclassQuickStartTest{@AutowiredprivateUserMapperuserMapper;@AutowiredprivateUserServiceuserService;@TestpublicvoidtestInsert(){Useruser=newUser();user.setUsername("zhangsan");user.setEmail("zhangsan@example.com");user.setAge(25);// 插入introws=userMapper.insert(user);System.out.println("插入行数: "+rows);System.out.println("自增ID: "+user.getId());}@TestpublicvoidtestSelect(){// 根据 ID 查询Useruser=userMapper.selectById(1L);System.out.println(user);// 查询所有ListUserusers=userMapper.selectList(null);users.forEach(System.out::println);// 条件查询ListUserlist=userMapper.selectList(newLambdaQueryWrapperUser().eq(User::getStatus,1).like(User::getUsername,"张").orderByDesc(User::getCreateTime));}@TestpublicvoidtestUpdate(){Useruser=newUser();user.setId(1L);user.setAge(26);// 根据 ID 更新(只更新非空字段)introws=userMapper.updateById(user);System.out.println("更新行数: "+rows);}@TestpublicvoidtestDelete(){// 根据 ID 删除(逻辑删除)introws=userMapper.deleteById(1L);System.out.println("删除行数: "+rows);}}三、核心注解详解3.1 @TableName - 表名注解/** * @TableName - 指定实体对应的表名 */@Data// 方式1:直接指定表名@TableName("sys_user")publicclassUser1{privateLongid;privateStringusername;}// 方式2:使用变量(支持动态表名)@TableName("${prefix}_user")publicclassUser2{privateLongid;privateStringusername;}// 方式3:指定 schema@TableName(value="user",schema="mydb")publicclassUser3{privateLongid;privateStringusername;}// 方式4:设置自动映射@TableName(value="sys_user",autoResultMap=true)publicclassUser4{privateLongid;privateStringusername;// autoResultMap = true 时,可以使用 TypeHandler@TableField(typeHandler=JacksonTypeHandler.class)privateMapString,Objectextra;}/** * 动态表名处理器 */@ComponentpublicclassDynamicTableNameHandlerimplementsTableNameHandler{@OverridepublicStringdynamicTableName(Stringsql,StringtableName){// 根据上下文动态设置表名Stringsuffix=TenantContext.getTenantSuffix();if(StringUtils.hasText(suffix)){returntableName+"_"+suffix;}returntableName;}}// 配置动态表名@ConfigurationpublicclassMyBatisPlusConfig{@BeanpublicMybatisPlusInterceptormybatisPlusInterceptor(){MybatisPlusInterceptorinterceptor=newMybatisPlusInterceptor();DynamicTableNameInnerInterceptordynamicInterceptor=newDynamicTableNameInnerInterceptor();dynamicInterceptor.setTableNameHandler((sql,tableName)-{// 动态表名逻辑if("sys_user".equals(tableName)){return"sys_user_"+TenantContext.getTenantId();}returntableName;});interceptor.addInnerInterceptor(dynamicInterceptor);returninterceptor;}}3.2 @TableId - 主键注解/** * @TableId - 主键策略 */publicclassTableIdExamples{/** * IdType 枚举值 */publicenumIdType{AUTO,// 数据库自增NONE,// 无状态(默认)INPUT,// 用户输入ASSIGN_ID,// 雪花算法生成 Long 类型 IDASSIGN_UUID// UUID}@Data@TableName("user")publicstaticclassUserAuto{@TableId(type=IdType.AUTO)// 数据库自增privateLongid;}@Data@TableName("user")publicstaticclassUserAssignId{@TableId(type=IdType.ASSIGN_ID)// 雪花算法(默认策略)privateLongid;}@Data@TableName("user")publicstaticclassUserAssignUUID{@TableId(type=IdType.ASSIGN_UUID)// UUID(去掉横线)privateStringid;}@Data@TableName("user")publicstaticclassUserInput{@TableId(type=IdType.INPUT)// 用户输入(需要手动设置 ID)privateLongid;}}/** * 自定义 ID 生成器 */@ComponentpublicclassCustomIdGeneratorimplementsIdentifierGenerator{@OverridepublicNumbernextId(Objectentity){// 自定义 ID 生成逻辑// 可以使用雪花算法、数据库序列等returnSnowflakeIdWorker.nextId();}@OverridepublicStringnextUUID(Objectentity){// 自定义 UUID 生成returnUUID.randomUUID().toString().replace("-","");}}3.3 @TableField - 字段注解/** * @TableField - 字段映射 */publicclassTableFieldExamples{@Data@TableName("sys_user")publicstaticclassUser{@TableIdprivateLongid;// 指定数据库字段名@TableField("user_name")privateStringusername;// 非数据库字段@TableField(exist=false)privateStringextraField;// 自动填充 - 插入时填充@TableField(fill=FieldFill.INSERT)privateDatecreateTime;// 自动填充 - 插入和更新时填充@TableField(fill=FieldFill.INSERT_UPDATE)privateDateupdateTime;// 自动填充 - 更新时填充@TableField(fill=FieldFill.UPDATE)privateDatemodifyTime;// 条件更新策略@TableField(updateStrategy=FieldStrategy.NOT_EMPTY)privateStringemail;// 条件查询策略@TableField(whereStrategy=FieldStrategy.NOT_NULL)privateIntegerstatus;// 使用 TypeHandler@TableField(typeHandler=JacksonTypeHandler.class)privateMapString,Objectconfig;// 指定 JDBC 类型@TableField(jdbcType=JdbcType.VARCHAR)privateStringdescription;// 指定数值精度@TableField(numericScale=2)privateBigDecimalamount;}/** * 字段策略 */publicenumFieldStrategy{NOT_NULL,// 非 NULL 判断NOT_EMPTY,// 非空判断(仅针对字符串类型,排除空串)DEFAULT,// 默认(跟随全局配置)IGNORED,// 忽略判断NEVER// 从不加入 SQL}/** * 自动填充处理器 */@ComponentpublicclassMyMetaObjectHandlerimplementsMetaObjectHandler{@OverridepublicvoidinsertFill(MetaObjectmetaObject){// 插入时自动填充this.strictInsertFill(metaObject,"createTime",Date.class,newDate());this.strictInsertFill(metaObject,"updateTime",Date.class,newDate());this.strictInsertFill(metaObject,"createBy",String.class,getCurrentUserId());this.strictInsertFill(metaObject,"version",Integer.class,1);}@OverridepublicvoidupdateFill(MetaObjectmetaObject){// 更新时自动填充this.strictUpdateFill(metaObject,"updateTime",Date

更多文章