使用Mybatis时处理PostgreSQL保留关键字的最佳方式是什么

问题描述

当我在 Postgresql 13 中创建 namepassword 等列时。Postgresql 可能将其视为保留关键字。所以 MyBatis sql 是这样的:

INSERT INTO apple_server_notification_record (created_time,updated_time,notification_type,auto_renew_product_id,auto_renew_status,auto_renew_status_change_date,auto_renew_status_change_date_ms,auto_renew_status_change_date_pst,environment,`password`,bid,bvrs) VALUES (?,?,?)

它会在 sql自动添加``。但是在Postgresql 13中执行sql时,显示这个错误

org.springframework.jdbc.BadsqlGrammarException: 
### Error updating database.  Cause: org.postgresql.util.PsqlException: ERROR: Syntax error at or near "`"
  Position: 249
### The error may exist in class path resource [mybatis/mapper/dolphin/AppleServerNotificationRecordMapper.xml]
### The error may involve com.dolphin.soa.post.dao.AppleServerNotificationRecordMapper.insertSelective-Inline
### The error occurred while setting parameters
### sql: INSERT INTO apple_server_notification_record (created_time,?)
### Cause: org.postgresql.util.PsqlException: ERROR: Syntax error at or near "`"
  Position: 249
; bad sql grammar []; nested exception is org.postgresql.util.PsqlException: ERROR: Syntax error at or near "`"
  Position: 249

我可以通过将列 password 更改为 apple_auth_password解决它,我知道它会解决问题。但是在我的代码中,我必须在接收来自苹果的请求中显式转换映射。我的实体定义如下:

private String password;

有什么好的建议可以解决问题吗?遇到这个问题你会怎么做?

解决方法

您可以更改Mybatis-generator的自动生成器配置代码配置:

  <property name="autoDelimitKeywords" value="true"/>
    <!--
    the beginningDelimiter and endingDelimiter using " by default
    when using PostgreSQL using "
    when using MySQL,we should change to `
     -->
    <property name="beginningDelimiter" value="&quot;"/>
    <property name="endingDelimiter" value="&quot;"/>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...