MySQL用户自定义排序函数——order by field 在Mybatis中实现

本文介绍了一种在MySQL中使用自定义排序函数orderbyfield的方法,该函数可以根据指定ID列表顺序进行排序。通过MyBatis实现具体应用案例,适用于需要特定顺序返回数据的场景。

MySQL用户自己定义排序函数
order by field(value1, id1,id2,id3,…) 不限制参数长度。
含义:将获取到的值根据id1,id2,id3…的顺序排序。
例子:mybatis

		select
        <include refid="Base_Column_List"/>
        from tb_newbee_mall_goods_info
        where goods_id in
        <foreach item="id" collection="list" open="(" separator="," close=")">
            #{id}
        </foreach>
        order by field(goods_id,
        <foreach item="id" collection="list" separator=",">
            #{id}
        </foreach>
        );

mybatis中传的参数为一个带有id的List数组,这个数组的顺序已经是排好的了,要求mybatis返回一样的顺序的数据。

<think>嗯,用户这次想了解MyBatis-Plus的逻辑删除和逆向工程实现方法,正好之前我们讨论过快速排序,看来用户是个开发者,正在学习后端框架技术。从提问方式看,ta应该是个有明确目标的务实型学习者,可能正在搭建SpringBoot项目。 用户引用的四篇资料很有意思:引用1强调MyBatis-Plus的兼容性原则,引用2/4重点描述逆向工程,引用3提到CRUD操作。但ta真正需要的不是概念,而是具体实现逻辑。值得注意的是,用户特别标注"不是真正需求",说明ta希望跳过理论直接看实战方案。 关于逻辑删除部分,需要强调三个技术要点:字段注解配置、全局注入机制、查询自动过滤。尤其要提醒用户注意yml配置的delval-notdelval值映射关系,这个容易出错。逆向工程方面,AutoGenerator的代码模板配置是关键,用户可能更需要可视化工具推荐(如MyBatisX插件),这在引用4里提到过。 用户没有问但可能需要的隐藏知识点:1)逻辑删除索引优化问题 2)逆向工程覆盖策略。这两点在实际开发中常踩坑,考虑在回答里补充。另外ta提到"项目开发",建议给出企业级实践建议,比如测试环境才用p6spy监控SQL。 突然想到个细节:用户上次示例要求中文回答且用$...$渲染公式,但数据库领域基本用不到数学表达式。不过安全起见,还是检查下回答里有没有需要Latex的地方——确实没有,全是代码和配置项。保持示例里的引用格式就好,在yml配置块后加个[^3]引用标记。 </think>在SpringBoot项目中使用MyBatis-Plus实现逻辑删除和逆向工程的完整方案如下: --- ### 一、逻辑删除实现 **核心原理**:通过注解标记删除字段,MyBatis-Plus自动将`delete`操作转为`update`,并添加`WHERE deleted=0`条件过滤已删除数据。 #### 步骤: 1. **数据库添加删除标志字段** ```sql ALTER TABLE user ADD COLUMN deleted TINYINT(1) DEFAULT 0 COMMENT '删除标志(0:未删,1:已删)'; ``` 2. **实体类添加注解** ```java @Data public class User { @TableId private Long id; private String name; @TableLogic // 逻辑删除注解 private Integer deleted; // 推荐使用Integer而非boolean(兼容数据库默认值) } ``` 3. **配置全局逻辑删除规则** (`application.yml`) ```yaml mybatis-plus: global-config: db-config: logic-delete-field: deleted # 全局删除字段 logic-delete-value: 1 # 删除状态值 logic-not-delete-value: 0 # 未删除状态值 ``` 4. **使用效果** - **删除操作**:`userMapper.deleteById(1);` → 实际执行: ```sql UPDATE user SET deleted=1 WHERE id=1 AND deleted=0 ``` - **查询操作**:自动附加`WHERE deleted=0`条件 > **注意**:需手动创建数据库字段并初始化默认值[^1][^3] --- ### 二、逆向工程实现 **核心工具**:`AutoGenerator` + 代码模板配置,5分钟生成全套CRUD代码。 #### 步骤: 1. **添加Maven依赖** ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.5.3</version> </dependency> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <!-- 使用Freemarker模板引擎 --> </dependency> ``` 2. **配置代码生成器** (示例) ```java public class CodeGenerator { public static void main(String[] args) { AutoGenerator generator = new AutoGenerator(); // 数据源配置 DataSourceConfig ds = new DataSourceConfig .Builder("jdbc:mysql://localhost:3306/test", "root", "123456") .build(); // 全局配置 GlobalConfig global = new GlobalConfig.Builder() .outputDir(System.getProperty("user.dir") + "/src/main/java") .author("Dev") .openDir(false) .build(); // 包配置 PackageConfig pk = new PackageConfig.Builder() .parent("com.example") .moduleName("system") .entity("entity") .mapper("mapper") .build(); // 策略配置 StrategyConfig strategy = new StrategyConfig.Builder() .addInclude("user", "order") // 指定生成表 .entityBuilder() .enableLombok() // 支持Lombok .logicDeleteColumnName("deleted") // 逻辑删除字段 .controllerBuilder() .enableRestStyle() // 生成@RestController .build(); generator.dataSource(ds) .global(global) .packageInfo(pk) .strategy(strategy) .execute(); } } ``` 3. **生成文件结构** ``` src/main/java └─com.example.system ├─entity # 实体类 (含逻辑删除字段注解) ├─mapper # Mapper接口 └─controller # RESTful接口 ``` > **企业级建议**: > - 使用 **MyBatisX插件** (IDEA) 可视化生成[^4] > - 生成后需检查字段注解与业务匹配度 > - 敏感表字段手动移除生成(如密码字段)[^2][^4] --- ### 三、最佳实践 1. **逻辑删除陷阱** - 唯一索引冲突:需将`deleted`字段加入联合唯一索引 - 关联查询:手动添加`AND t.deleted=0`避免漏过滤 2. **逆向工程优化** ```java .strategyConfig( new StrategyConfig.Builder() .entityBuilder() .superClass(BaseEntity.class) // 继承公共基类 .addIgnoreColumns("version") // 跳过乐观锁字段 ``` 3. **监控SQL执行** 启用`p6spy`监测实际SQL是否符合预期[^4]: ```yaml spring: datasource: url: jdbc:p6spy:mysql://localhost:3306/test # 添加p6spy前缀 ``` --- ### 常见问题解决 1. **逻辑删除失效** → 检查`@TableLogic`注解字段类型需与yml配置一致 → 确认数据库字段默认值为`0` 2. **生成代码缺少字段** → 检查数据库字段命名规范(勿用SQL关键字如`desc`) → 配置`StrategyConfig.setColumnNaming(NamingStrategy.underline_to_camel)` > 通过整合逻辑删除与逆向工程,开发效率可提升60%以上,但需遵守 **“生成不修改,修改不生成”** 原则保障维护性[^1][^4]。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值