mysql分表动态扩展_mybatis-generator

说明

本项目最初想要解决数据库表名、字段名的命名法与 java 的类、属性命名法不一致带来的一系列问题。

当然,本项目的 MBG 扩展类还做了一些其他事情,比如方便分表时做表名替换,更详细的,请参考: MBG 扩展类 module

曾尝试将数据库表名、字段名也采用驼峰命名法。

现在已经改成:

数据库表名、字段名保持下划线命名法。

针对自定义 SQL 查询结果,对应的自定义 POJO 保持驼峰命名法,查询数据库的 SQL 语句保留原生下划线,并且不用写 resultMap。

做到了 Java 规范与 MySQL 命名规范不一致的完美兼顾。

已添加查询示例,不过仅仅是查询示例,没有考虑到项目架构的合理性。实际项目不会在 web 层直接调用 dal 层,实际项目会有业务层和接口层。

有关 MySQL 命名规范,请参考:MyBatis 项目中,有关 MySQL 命名规范,用驼峰命名法与下划线命名法的取舍,请关注这篇文章提到的 mapUnderscoreToCamelCase 配置项。

运行示例

安装 MySQL,执行 boot-create-table-property/resources/schema.sql 脚本。

修改 boot-create-table-property/resources/application.yml 中的数据库连接参数。

运行启动项目:boot-create-table-property。

如果看到初始化的部门信息,则表示运行成功。

ed3dafa1907f4f850a532348158782e9.png

自行测试

添加、修改表结构。

参照项目根目录下的:generatorConfig.xml,重新生成 mapper

参照 demo.domain.dal.service.SysDeptDalService.getSysDeptList() 实现数据库查询方法。

参照 table.property.controller.QueryDatabaseTestController.getSysDeptList() 运行查询测试。

有关数据库表名、字段名使用下划线命名法还是驼峰命名法的思考

更新时间:2019-05-29

近期,又研读了一次《阿里巴巴Java开发手册(详尽版)》(从这里可以下载),又思考了关于 MySQL 的表名、字段名的命名范围。

打算在以后的新项目中完全遵循《阿里巴巴Java开发手册(详尽版)》的规范。

与本仓库的 MySQL 表名、字段名,采用的是驼峰命名法(CamelCase),与《阿里巴巴Java开发手册(详尽版)》的规范冲突,需要改为下划线命名法(UnderScoreCase)。

关于数据库表名、字段名的命名规范,是要采用与 Java 代码的字段名和方法名一样的驼峰命名法(CamelCase)还是采用业界绝大多数团队使用的下划线命名法(UnderScoreCase),仁者见仁,智者见智。

作为团队规范的制定者,需要综合考虑各个方面的因素,之前我在面对这个问题的时候,考虑到数据库的每一张表都会对应一个 POJO,如果表字段是下划线命名法,为了与数据库对应,表对应的实体类(POJO)也得下划线命名,这就导致了同样是 java 类的命名规范的不一致性,在写代码的时候很别扭(当时对 MyBatis 不熟悉,其实有解决方案,继续往下看)。

现在如果有一个方案,在既保持数据库表与字段采用下划线命名法的同时,对应实体(POJO)又是驼峰命名法,这样既可以兼顾数据库的业界规范,又可以兼顾 Java 开发的业界规范,那就太完美了,还好,这个方案是有的。

请继续往下看。

解决方案

更新时间:2019-06-18

针对数据库字段使用下划线命名法,生成相应实体时,使用 java 普遍使用的驼峰命名法的配置,将 boot-create-table-property 项目的 application.yml 的配置 flagUseActualColumnNames 改为 false:

# 是否使用原始字段名

flagUseActualColumnNames: false

如果设置为 true,会生成如下属性:

设置为 false 则不会生成该属性,没有显示指定该属性值时,该属性默认为 false

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mybatis-plus 也支持分表操作,具体实现方式如下: 1. 定义数据源和 Mybatis-plus 相关依赖: ```xml <dependencies> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>2.0.0</version> </dependency> </dependencies> ``` 2. 定义分表规则,可以使用自定义的分表策略,也可以使用 Mybatis-plus 提供的默认分表策略: ```java public class MyTableNameHandler implements ITableNameHandler { @Override public String dynamicTableName(String sql, Object param) { if (param instanceof Long) { return "table_" + (Long) param % 2; } return null; } } ``` 3. 配置分表策略: ```java @Configuration public class MybatisPlusConfig { @Bean public MyTableNameHandler myTableNameHandler() { return new MyTableNameHandler(); } @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } @Bean public DynamicTableNameParser dynamicTableNameParser(MyTableNameHandler myTableNameHandler) { DynamicTableNameParser dynamicTableNameParser = new DynamicTableNameParser(); dynamicTableNameParser.setTableNameHandlerMap(Collections.singletonMap("my_table", myTableNameHandler)); return dynamicTableNameParser; } } ``` 4. 在实体类中使用 `@TableName` 注解指定表名: ```java @Data @TableName(value = "my_table") public class MyEntity { @TableId private Long id; private String name; } ``` 5. 在 Mapper 接口中使用 `@SqlParser` 注解开启分表功能: ```java @Mapper public interface MyMapper extends BaseMapper<MyEntity> { @SqlParser(parser = DynamicTableNameParser.class) List<MyEntity> selectListByUserId(@Param("userId") Long userId); } ``` 在执行查询操作时,Mybatis-plus 会根据参数动态生成分表 SQL,并将其交给数据源执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值