mybatis如何优雅的适配多个数据库

642 阅读1分钟

需求背景:最近有一个需求,如何在mybatis支持多种数据库,如果不考虑代码可读性的情况下,那这个事情就没那么复杂了,针对每个数据库的CRUD写一遍就好了,如果想要代码写的更优雅,有没有什么好办法,通过查阅资料,发现mybatis还真的支持。下面废话不多说了,直接贴上代码: mybatis-config.xml 如下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <!-- 控制台打印sql语句 -->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <!-- 开启驼峰命名自动映射配置 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!--关闭一级缓存 -->
        <setting name="cacheEnabled" value="false"/>
        <!-- 设置一级缓存的作用范围是一条sql语句执行期间,执行完毕清空一级缓存-->
        <setting name="localCacheScope" value="STATEMENT"/>
    </settings>

    <!-- 配置分页插件   -->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
    </plugins>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <databaseIdProvider type="DB_VENDOR">
        <property name="MySQL" value="mysql"/>
        <property name="Oracle" value="oracle" />
        <property name="DM" value="dm"/>
    </databaseIdProvider>

    <mappers>
        <mapper resource="mapping/DBLogMapper.xml"/>
    </mappers>

</configuration>

大家重点关注,通过下面配置项发现,可以支持mysql、oracle、达梦数据库

   <databaseIdProvider type="DB_VENDOR">
        <property name="MySQL" value="mysql"/>
        <property name="Oracle" value="oracle" />
        <property name="DM" value="dm"/>
    </databaseIdProvider>

然后对应的mapper.xml里面可以这样写了

<select id = "showDatabase" resultType="com.alibaba.fastjson.JSONObject" databaseId="mysql">
    show databases
</select>


<select id = "showDatabase" resultType="com.alibaba.fastjson.JSONObject" databaseId="Oracle">
    select username as databasename FROM dba_user
</select>

对应的接口只需要写一个方法showDatabase,mybatis会根据配置的数据库连接决定执行哪个sql