springboot + mybatis支持多数据库

文章讲述了在业务服务中处理多数据库兼容性问题的方法,通过创建DatabaseIdProviderbean来识别数据库类型,如达梦数据库的特殊SQL语法需求,如LIKE操作中的通配符转义。

当在业务服务中需要支持多数据库时,虽然尽量使用标准sql,但还是难免出现多数据库不兼容的情况。例如对于达梦数据库在like时对于匹配字符串中的如果有通配符_或%需要转义改写为\_或\%,这在mysql、oracle、sql server都是没有问题的,但在达梦数据库中需要在之后加ESCAPE '\'才行。这时就需要能够知道当前连接的数据库是那种,如果是达梦数据库需要使用这种模式like #{var1} ESCAPE ‘\’

创建DatabaseIdProvider bean设置各数据库的别名

    /**
     * 自动识别使用的数据库类型,注意,此处的key为驱动自带的驱动名,不能更改,value可以更改
     * 在mapper.xml中_databaseId的值就是跟这里对应
     */
    @Bean
    public DatabaseIdProvider databaseIdProvider() {
        DatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider();
        Properties properties = new Properties();
        //key为固有名字,更改后无法匹配,后面的value可以自定义
        properties.setProperty("Oracle", "oracle");
        properties.setProperty("MySQL", "mysql");
        properties.setProperty("DB2", "db2");
        properties.setProperty("Derby", "derby");
        properties.setProperty("H2", "h2");
        properties.setProperty("HSQL", "hsql");
        properties.setProperty("Informix", "informix");
        properties.setProperty("MS-SQL", "ms-sql");
        properties.setProperty("PostgreSQL", "postgresql");
        properties.setProperty("Sybase", "sybase");
        properties.setProperty("Hana", "hana");
        properties.setProperty("DM DBMS", "dm");
        properties.setProperty("Microsoft SQL Server", "mss");
        databaseIdProvider.setProperties(properties);
        return databaseIdProvider;
    }
  • 属性配置的key是数据库的产品名,可以通过如下方式获取到
String databaseProductName = connection.getMetaData().getDatabaseProductName();
  • 配置属性的value对应给数据库产品设置的别名。此别名的值对应到mybatis的内置参数_databaseId

在mapper.xml中判断当前连接的数据库使用特定sql

 <if test="_databaseId == 'dm'">
    AND rtt.table_name LIKE #{tableNameLike} ESCAPE '\'
</if>
<if test="_databaseId != 'dm'">
    AND rtt.table_name LIKE #{tableNameLike}
</if>
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值