2301_78464877 2024-06-13 11:02 采纳率: 50%
浏览 19

mybatis-plus查询时可以驼峰自动转下划线+小写吗

mybatis-plus 会将保存到数据库的的字段名称进行驼峰转换为下划线+小写字母,
比如保存时的参数
{"id“:1, “studentNo”:123,”studentName“:"张三"}
对应的sql就是

INSERT INTO tablename ( id,student_no,student_name ) VALUES ( 1, 123, "张三" )

但是在查询的时候就没有将条件进行转换,
查询时的参数如果还是
{"id“:1, “studentNo”:123,”studentName“:"张三"}
对应的sql就是

select * from  tablename  where (id = 1) and (studentNo =123) and (student_name = "张三")

这样子的话,每一次插入参数我都要手动加方法进行设置

//将string中含有大写的字母变成小写,并且再前面加-
    public static String transformString(String input) {
        if (input == null || input.isEmpty()) {
            return input;
        }

        StringBuilder transformed = new StringBuilder();

        for (char ch : input.toCharArray()) {
            if (Character.isUpperCase(ch)) {
                transformed.append('_');
                transformed.append(Character.toLowerCase(ch));
            } else {
                transformed.append(ch);
            }
        }

        return transformed.toString();
    }

有没有mybatis-plus自带的查询时也来个驼峰转换为下划线+小写字母的配置
我在yml中配置了数据库下划线自动转驼峰标示开启,但是好像没有用


mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true # 数据库下划线自动转驼峰标示开启
  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-13 11:02
    关注

    引自免费微信小程序:皆我百晓生

    在MyBatis-Plus中,确实可以通过一些配置实现查询时字段名从驼峰命名自动转换为下划线命名。你已经正确地启用了map-underscore-to-camel-case配置,但这个配置主要是在映射结果集时起作用,即从数据库获取数据时将下划线字段名转换为驼峰命名的属性名。

    为了在查询条件中也能自动完成从驼峰到下划线的转换,你需要自定义全局配置中的global-config部分,特别是db-config内的column-underlinetable-underline属性,但这部分配置并不能直接解决你的问题,因为MyBatis-Plus的查询构建器默认并不会做这样的转换。

    一个可行的方案是利用MyBatis-Plus的LambdaQueryWrapperQueryWrapper对象,它们允许你使用lambda表达式构建查询条件,而这些对象内部会处理好字段名的转换。然而,如果你希望所有查询都自动转换字段名,可以考虑扩展BaseMapper接口并覆盖其getSqlSegment方法,或者自定义一个MetaObjectHandler来处理字段名的转换。

    下面是一个更直接的方法,通过实现MetaObjectHandler接口来自动处理字段名转换:

    import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
    import org.apache.ibatis.reflection.MetaObject;
    import org.springframework.stereotype.Component;
    
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    @Component
    public class CustomMetaObjectHandler implements MetaObjectHandler {
    
        private static final Pattern CAMEL_HUMP_PATTERN = Pattern.compile("[A-Z]");
    
        @Override
        public void insertFill(MetaObject metaObject) {
            this.strictInsertFill(metaObject, "fieldName", String.class, () -> transformString(getFieldValByName("fieldName", metaObject).toString()));
        }
    
        @Override
        public void updateFill(MetaObject metaObject) {
            this.strictUpdateFill(metaObject, "fieldName", String.class, () -> transformString(getFieldValByName("fieldName", metaObject).toString()));
        }
    
        private String transformString(String input) {
            Matcher matcher = CAMEL_HUMP_PATTERN.matcher(input);
            StringBuffer sb = new StringBuffer();
            while (matcher.find()) {
                matcher.appendReplacement(sb, "_" + matcher.group().toLowerCase());
            }
            matcher.appendTail(sb);
            return sb.toString().replaceFirst("^_", "");
        }
    }
    

    需要注意的是,上述代码中的fieldName应替换为你实际要转换的字段名。这种方法会在插入和更新操作时自动转换字段名,但对于查询操作,你可能需要在构建QueryWrapperLambdaQueryWrapper时手动调用转换方法。

    另外,如果你使用的是Spring Boot框架,可以将CustomMetaObjectHandler类标记为@Component,这样它会被自动注册并生效。

    不过,对于查询操作,由于MetaObjectHandler主要处理插入和更新时的字段填充,你可能需要在构建查询条件时自己调用转换方法,或者在业务层代码中统一处理。例如,在构造QueryWrapper时:

    String studentNo = "studentNo";
    // 转换字段名
    String convertedStudentNo = transformString(studentNo);
    QueryWrapper<MyEntity> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq(convertedStudentNo, 123);
    

    这样,你就可以在不修改查询代码的情况下,保持字段名的一致性。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 6月13日
  • 修改了问题 6月13日
  • 创建了问题 6月13日

悬赏问题

  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 pycharm运行main文件,显示没有conda环境
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件
  • ¥15 为什么eclipse不能再下载了?
  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题
  • ¥50 如何将脑的图像投影到颅骨上