springboot接收大写下划线的数据库字段值
时间: 2025-06-29 18:04:34 浏览: 8
### Spring Boot 中处理大写且带下划线的数据库字段值
在Spring Boot项目中,当面对Oracle或其他SQL数据库的大写且带有下划线的字段名称时,可以通过配置`application.properties`文件以及适当调整实体类定义来确保这些字段能够被正确映射至Java实体属性上。
对于希望将数据库中的大写字母加下划线形式(例如USER_NAME)转换成Java端的小驼峰命名风格(userName),可以在项目的`application.properties`里加入特定参数设置:
```properties
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:orcl # 数据源URL,请替换为自己的连接字符串
spring.datasource.username=scott # 用户名
spring.datasource.password=tiger # 密码
spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.SpringPhysicalNamingStrategy
spring.jpa.hibernate.ddl-auto=update # 自动更新模式
```
上述配置项告知Hibernate采用默认物理策略进行表和列的名字转化[^1]。然而为了更精确控制这种变化过程特别是针对全大写的列名情况,则需自定义一个继承自`SpringPhysicalNamingStrategy`的新类,在其中重载方法以满足需求——即将输入的所有字符统一变为小写并保留原有的分隔符逻辑。
下面给出一段简单的例子展示如何创建这样一个定制化的命名策略:
```java
import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.orm.jpa.SpringPhysicalNamingStrategy;
import org.springframework.stereotype.Component;
import javax.persistence.EntityManagerFactory;
import java.io.Serializable;
@Component
public class UpperTableStrategy extends SpringPhysicalNamingStrategy implements Serializable {
@Override
public Identifier toPhysicalTableName(Identifier name, JpaContext context) {
return new Identifier(name.getText().toUpperCase(), name.isQuoted());
}
@Override
protected String getColumnName(String propertyName) {
return super.getColumnName(propertyName).replaceAll("([a-z])([A-Z])", "$1_$2").toLowerCase();
}
}
```
这段代码实现了两个主要的功能:一是把传入的表名全部转化为大写;二是利用正则表达式匹配任何由一个小写字母紧跟着一个大写字母组成的序列,并在这两者之间插入一个下划线符号,最后再整体变更为小写形式作为最终的结果返回给调用者。这使得即使原始数据模型采用了混合大小写的方案也能很好地适配到目标环境中去。
另外需要注意的是如果使用MyBatis框架的话,则应该考虑开启其内置的支持选项以便更好地完成从下划线到驼峰式的自动化转变工作。具体做法是在对应的XML配置文档内添加如下片段即可生效[^4]:
```xml
<configuration>
<settings>
<!-- 启用下划线转驼峰 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
</configuration>
```
而对于纯JPA/Hibernate场景而言,除了上面提到过的全局层面设定外,还可以借助于`@Column`注解显式指明个别成员变量所对应的实际存储位置及其特性描述。比如这样:
```java
@Entity
@Table(name = "MY_TABLE") // 表名为全大写
public class MyEntity {
private Long id;
@Column(name = "CREATION_DATE")
private Date creationDate;
...
}
```
这里通过直接标注出各部分的具体关联关系从而绕过了可能存在的自动推断错误风险,提高了程序运行期间的安全性和稳定性。
阅读全文
相关推荐















