如果有人问我到底哪一种命名法更好,曾经,我的答案是:驼峰命名法,而现在,我的答案是:当然是下划线命名法,这还用问吗?嘻嘻~~~

选驼峰命名法的理由

  • 无论是 Java 还是 C#,业界几乎都采用驼峰命名法,为了保持命名规范的一致性。
  • 如果 MySQL 采用下划线命名法
    • 在一开始采用 MyBatis 这个框架的时候。由于忽略了 MyBatis 针对驼峰命名与下划线命名的一个转换配置 mapUnderscoreToCamelCase,在把自定义 SQL 语句查询结果对应到自定义的 POJO 时,为了与 POJO 属性名对应,有两种方式:
      1. POJO 采用驼峰式命名法,自定义的 SQL 语句需要写类似这样的语句 select student_name as studentName ,或者定义 resultMap,类似 <result column="student_name" jdbcType="VARCHAR" property="studentName" />,这将带来额外的工作量和维护成本,而且还容易出错
      2. POJO 采用下划线命名法,这样不用写类似 student_name as studentName 的 SQL 语句,也不用额外定义 resultMap,但是,这是重点,与 Java 的命名规范冲突
    • 前面两种解决方案都有缺点,那么再看第三种,就是从根本上统一,那就是 MySQL 也采用驼峰式命名法,至于大小写敏感问题,可以通过配置项 lower_case_table_names 解决。

所以,曾经,我所在项目组在使用 MyBatis 时,MySQL 采用了驼峰式命名法,虽然有效避开了上面提到的两种解决方案的缺点,但是因为这种命名方式有背业界规范,所以一直觉得这并不完美的解决方法。

好的是,在后来研究 MyBatis 的过程中,无意中发现了完美的解决方案,就是上面提到的关键配置,下面会写。

选下划线命名法的理由

  • 对于 MySQL 的命名法,业界更多的是下划线命名法,原因是 MySQL 在不同操作系统上有不同的大小写敏感问题(这里就不展开这个话题了)。
  • 特意看了一些比较知名的开源项目,MySQL 的命名规范几乎都是下划线命名法。
  • 参考大公司的规范,如《阿里巴巴Java开发手册》,也是下划线命名法。

现在的选择:下划线命名法

在得知 MyBatis 的这个配置项 mapUnderscoreToCamelCase 后,关于 MySQL 命名规范,我在新项目中,就坚定的采用下划线命名法了,甚至有把以前 MySQL 采用驼峰命名的项目重构回下划线命名的冲动~~

MyBatis 的配置项:mapUnderscoreToCamelCase

设置启用数据库字段下划线映射到 java POJO 的驼峰式命名属性。该配置项,一般性地,在文件 mybatis-config.xml 中,默认值为 false,将其配置为 true:

  • 开启驼峰映射,为自定义的SQL语句服务。
  • 针对自定义 SQL 查询结果,对应的自定义 POJO 保持驼峰命名法,查询数据库的 SQL 语句保留原生下划线,不用写 resultMap。
  • 即从经典数据库列名 a_column 到经典 Java 属性名 aColumn 的类似映射。
    1
    2
    3
    4
    5
    6
    <configuration>
    <settings>
    <setting name="mapUnderscoreToCamelCase" value="true"/>
    <!-- other config item -->
    </settings>
    </configuration>

请注意,MySQL 采用下划线命名法的话,使用 MBG 生成实体的配置项 table,不需要配置 useActualColumnNames,该配置项默认为 false,如果要配置,其 value 需要设置 false,如下:

1
<property name="useActualColumnNames" value="false"/>

有关 MBG 的使用和详细的配置

请参考:https://github.com/uncleAndyChen/mybatis-generator