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

SpringBoot13-小细节

一、开启Mybatis驼峰命名和下划线命名的转换

MyBatis 中,想让数据库字段的下划线命名自动映射到 Java 实体的驼峰命名(例如 user_name → userName),只需要在配置里 开启自动下划线转驼峰 功能即可。


1. 在 application.ymlapplication.properties 中配置(推荐)

如果你用的是 Spring Boot + MyBatis,直接在配置文件里加上:

application.yml

mybatis:configuration:map-underscore-to-camel-case: true

application.properties

mybatis.configuration.map-underscore-to-camel-case=true

注意:如果你用的是 MyBatis-Plus,配置同样有效,也可以用它自己的配置:

mybatis-plus:configuration:map-underscore-to-camel-case: true

2. 如果是纯 MyBatis(XML 配置)

在 MyBatis 的 mybatis-config.xml 里设置:

<configuration><settings><!-- 开启自动下划线转驼峰 --><setting name="mapUnderscoreToCamelCase" value="true"/></settings>
</configuration>

3. 注意事项

  • 数据库字段名要用 小写+下划线 格式,如:user_idcreate_time
    Java 实体用驼峰:userIdcreateTime

  • 如果字段名和属性名完全不匹配(比如列叫 USERID 而属性是 userId),就算开启了也不会自动映射,需要用 @ResultresultMap 指定

  • 如果你用了 MyBatis GeneratorMyBatis-Plus 自动生成代码,通常生成的实体已经和表字段对应好了,就不一定需要这个设置


总结

在 Spring Boot 中最简单的方式:

mybatis:configuration:map-underscore-to-camel-case: true

就能让 user_nameuserName 自动映射。
如果是传统 MyBatis 项目,就在 mybatis-config.xml 里加 <setting name="mapUnderscoreToCamelCase" value="true"/>


补充:@Result 和 resultMap

MyBatis 中,默认的自动映射规则是:

列名 ↔ Java 属性名 按下划线转驼峰规则自动匹配(如果在配置里打开 mapUnderscoreToCamelCase=true)。

如果列名和属性名完全不对应(既不相同,也无法通过下划线转驼峰得到),就无法自动映射,必须手工指定。

下面用一个具体例子演示。


❌ 自动映射失败示例

假设数据库表:

CREATE TABLE t_user (USERID    VARCHAR(32),USER_NAME VARCHAR(50)
);

Java 实体:

public class User {private String userId;   // 注意:列名是 USERIDprivate String username; // 注意:列名是 USER_NAME// getter / setter 省略
}
  • 配置里已经开启:

    <settings><setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    
  • MyBatis 查询:

    <select id="selectAll" resultType="User">SELECT USERID, USER_NAME FROM t_user
    </select>
    

结果:

  • userId 可以映射到 USERID(因为大小写不敏感,MyBatis 默认支持),✅

  • username 无法自动映射,因为列是 USER_NAME,驼峰转换后会是 userName,而实体叫 username(少了驼峰的大写 N)。

自动映射规则只负责把 USER_NAMEuserName,不会再去匹配 username


✅ 正确做法:用 @Results / resultMap

方式一:注解版
@Mapper
public interface UserMapper {@Select("SELECT USERID, USER_NAME FROM t_user")@Results(id = "userMap", value = {@Result(column = "USERID", property = "userId"),@Result(column = "USER_NAME", property = "username")})List<User> selectAll();
}
方式二:XML 配置版
<resultMap id="userMap" type="User"><result column="USERID" property="userId"/><result column="USER_NAME" property="username"/>
</resultMap><select id="selectAll" resultMap="userMap">SELECT USERID, USER_NAME FROM t_user
</select>

总结

  • MyBatis 自动映射只能处理:

    • 列名与属性名相同(忽略大小写),或

    • 列名下划线转驼峰后与属性名相同。

  • 如果列名和属性名完全对不上(USERIDuserId 能自动,但 USER_NAMEusername 就不行),必须用 @Result / <resultMap> 明确指定

  • 因此当遇到命名规则不一致的老库或第三方表时,一定要写 resultMap 或注解映射。


二、控制台打印出实际执行的 SQL 语句及参数

在 Spring Boot + MyBatis 项目中,想让控制台打印出实际执行的 SQL 语句及参数,可以用以下几种常见配置方式:

最推荐:application.yml 配置

mybatis:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

这样启动项目后,控制台会直接输出完整 SQL,包括参数值和执行时间。


三、@JsonIgnore讲解

@JsonIgnoreJackson(Spring Boot 默认使用的 JSON 序列化/反序列化库)提供的注解,用来在对象与 JSON 之间进行转换时忽略某个字段


2-1. 基本作用

  • 序列化时忽略
    把对象转成 JSON 时,标注了 @JsonIgnore 的字段 不会出现在返回的 JSON 中

  • 反序列化时忽略
    把 JSON 转成对象时,标注了 @JsonIgnore 的字段 不会从 JSON 中读取值并赋给对象


示例代码

import com.fasterxml.jackson.annotation.JsonIgnore;public class User {private String username;@JsonIgnoreprivate String password;  // 不希望返回给前端private String email;// getters and setters
}
控制器示例
@RestController
@RequestMapping("/user")
public class UserController {@GetMappingpublic User getUser() {User u = new User();u.setUsername("Tom");u.setPassword("123456");u.setEmail("tom@example.com");return u;}
}
返回结果
{"username": "Tom","email": "tom@example.com"
}

password 字段被自动忽略了。


2-2. 常见使用场景

场景说明
隐藏敏感信息比如密码、身份证号、token,不希望返回给前端。
避免循环引用有双向关联时,防止无限递归序列化(但更推荐用 @JsonManagedReference / @JsonBackReference)。
只在内部使用某些内部计算字段只在后台用,不需要暴露给外部接口。

2-3. 与其他注解的区别

注解作用
@JsonIgnore永远忽略此字段,序列化 & 反序列化都跳过。
@JsonProperty自定义 JSON 字段名称,或者强制包含某个字段。
@JsonIgnoreProperties批量忽略指定的字段,作用在上。
@JsonInclude控制字段为空时是否序列化(例如只序列化非 null 的字段)。

对比 @JsonIgnoreProperties

@JsonIgnoreProperties({"password","id"})
public class User { ... }

一次性忽略多个属性,适合上统一处理。


⚠️ 注意事项

  • @JsonIgnore 只对 Jackson 有效(Spring Boot 默认是 Jackson),如果换成 Gson/Fastjson 不会生效

  • 如果一个字段加了 @JsonIgnore反序列化也不会给它赋值。如果你只想“序列化时忽略,反序列化时接收”,用@JsonProperty

    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    

    例如:

    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String password; 
    

    这样:前端可以传 password,但返回 JSON 时不显示。


总结

@JsonIgnore 用于 完全跳过字段(序列化 & 反序列化都忽略)。

  • 如果只想 返回时隐藏,但仍能接收前端传值,用 @JsonProperty(access = WRITE_ONLY)

  • 如果要一次性忽略多个属性,用 @JsonIgnoreProperties


四、在 Postman 里如果想给所有请求统一加上某些请求头

写预请求脚本时,直接在右侧的 Scripts → Pre-req 里写就可以了,相当于旧版的 Pre-request Script

如果你想设置 token 之类的内容,可以在这里写:

此时,JWT-test collection下的所有的请求,都会自动在请求头中带上这个Authorization

推荐用 pm.request.headers.upsert() 而不是 addHeader()

addHeader 每次都会追加一个新 Header;

如果你在一个集合或请求中多次运行,可能会出现多个重复的 Authorization 字段。

upsert有则更新、没有则新增


五、MyBatis 在启动时没有加载到 UserMapper.insert 这条语句

mapper-locations 没配置或路径不对(90% 的锅)

确保 UserMapper.xml 被扫描到。放在 src/main/resources/mapper/UserMapper.xml,并在 application.yml(或 properties)里写:

示例:UserMapper.xml 放在 src/main/java/org/example/mapper/xml 下面。

MyBatis 只会去 classpath 的资源目录找 XML。默认只有 src/main/resources 会被打进 classpath;

src/main/java 里的 .xml 不会被当作资源复制,于是启动时根本扫不到这份 mapper,所以出现。

解决方式:

1、application.yml文件中配置:mapper-locations位置

2、确保 IDE/构建 会把这些 xml 复制到 target/classes/org/example/mapper/xml/。可用 Maven 资源复制:

http://www.dtcms.com/a/453047.html

相关文章:

  • K8S探针-Pod创建流程-kubeadm证书续期-VPA实战
  • SQLite 别名
  • wstunnel 实现ssh跳板连接
  • QML之四转圈等待指示器
  • TOGAF®标准与应对时代冲击的韧性架构
  • 【深入理解计算机网络06】数据链路层:详解信道划分与介质访问控制
  • ACL限制研发部允许总裁办
  • 个人网站建站指南东莞营销推广
  • 服务器架构模型
  • 【C++】stack与queue的使用与模拟实现
  • JSDoc注释
  • 第4章:函数调用(Function Calling / Tool Calling)—让 AI 调用你的 API
  • LLaVA-Video论文阅读
  • 精品课程网站建设意义北京小程序网站制作
  • Mean Normalization|均值归一化
  • 可以做网站素材的服装手机安装wordpress
  • StarRocks 是如何进行并行计算
  • 私域整体结构的顶层设计:基于“开源AI智能名片链动2+1模式S2B2C商城小程序”的体系重构
  • 基于SpringBoot和Vue的超市管理系统
  • wordpress系统安装教程上海网站排名优化费用
  • 【线程池】——实用场景
  • ip address dhcp-alloc 概念及题目
  • 深入解析:JavaScript中typeof与instanceof的原理及区别
  • C++ 位运算 高频面试考点 力扣137. 只出现一次的数字 II 题解 每日一题
  • 商城网站开发与设计郑州seo外包阿亮
  • 自建本地DNS过滤系统:实现局域网广告和垃圾网站屏蔽
  • 《投资-90》价值投资者的认知升级与交易规则重构 - 第三层:DCF算的未来多少年的现金总和?
  • 网站开发的套路龙腾盛世网站建设
  • .NET周刊【9月第3期 2025-09-21】
  • 建站模板哪里好关于音乐的个人网站