美文网首页
mybatis关于databaseid属性的配置

mybatis关于databaseid属性的配置

作者: 陆一诗 | 来源:发表于2019-08-08 17:51 被阅读0次

    MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。 MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。 如果同时找到带有 databaseId 和不带 databaseId 的相同语句,则后者会被舍弃。 为支持多厂商特性只要像下面这样在 mybatis-config.xml 文件中加入 databaseIdProvider 即可

    我们经常会直接复制那段代码

    <databaseIdProvider type="DB_VENDOR">
      <property name="SQL Server" value="sqlserver"/>
      <property name="DB2" value="db2"/>        
      <property name="Oracle" value="oracle" />
    </databaseIdProvider>
    

    databaseIdProvidertype属性是必须的,不配置时会报错。上面这个属性值使用的是VendorDatabaseIdProvider类的别名

    property子元素是配置一个数据库,其中的name属性是数据库名称,value是我们自定义的别名,通过别名我们可以在SQL语句中标识适用于哪种数据库运行。如果不知道数据库名称,我们可以通过以下代码获取

    /**
         * 获取数据库名称
         */
        public static void getDbInformation() {
            SqlSession sqlSession = null;
            Connection connection = null;
            try {
                sqlSession = getSqlSession();
                connection = sqlSession.getConnection();
                String dbName = connection.getMetaData().getDatabaseProductName();
                String dbVersion = connection.getMetaData().getDatabaseProductVersion();
                System.out.println("数据库名称是:" + dbName + ";版本是:" + dbVersion);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    

    下面我们就可以在自己的sql语句中使用属性databaseId来标示数据库类型了,如下:

    <select id="getAllProduct" resultType="product" databaseId="mysql">
             SELECT * FROM product
     </select>
    

    在上面的SQL中,我配置的databaseId是mysql,但是我的实际的数据库是pg,可以看到,当数据库名称与实际配置不符时会抛出异常,所以我的配置应该是这样的:
    1、在数据库厂商配置中增加postgresql的配置

    <!--数据库厂商标示 -->
        <databaseIdProvider type="DB_VENDOR">
            <property name="Oracle" value="oracle"/>
            <property name="MySQL" value="mysql"/>
            <property name="DB2" value="d2"/>
            <property name="PostgreSQL" value="pg"/>
        </databaseIdProvider>
    

    2、在SQL中通过别名标识适用的数据库

    <select id="getAllProduct" resultType="product" databaseId="pg">
             SELECT * FROM product
    </select>
    

    这样就能获取正确结果了。除上述方法之外,我们还可以不在SQL中配置databaseId,这样mybatis会使用默认的配置,也是可以成功运行的。

    通过上面的实践知道了:使用多数据库SQL时需要配置databaseIdProvider 属性。当databaseId属性被配置的时候,系统会优先获取和数据库配置一致的SQL,否则取没有配置databaseId的SQL,可以把它当默认值;如果还是取不到,就会抛出异常。

    同之前介绍的配置类似,除了系统自定义的标识外,我们也可以自定义一个规则,需要实现MyBatis提供的DatabaseIdProvider接口,如下:

    /**
     * 自定义一个数据库标示提供类,实现DatabaseIdProvider接口
     * 
     * @author hyc
     *
     */
    public class MyDatabaseIdProvider implements DatabaseIdProvider {
        private static final String DATABASE_MYSQL = "MySQL";
        private static final String DATABASE_POSTGRESQL = "PostgreSQL";
        private static final String DATABASE_ORACLE = "Oracle";
        private static final String DATABASE_DB2 = "DB2";
    
        @Override
        public void setProperties(Properties p) {
            System.out.println(p.getProperty("Oracle"));
        }
    
        @Override
        public String getDatabaseId(DataSource dataSource) throws SQLException {
            Connection conn = dataSource.getConnection();
            String dbName = conn.getMetaData().getDatabaseProductName();
            String dbAlias = "";
            switch (dbName) {
            case DATABASE_MYSQL:
                dbAlias = "mysql";
                break;
            case DATABASE_POSTGRESQL:
                dbAlias = "pg";
                break;
            case DATABASE_ORACLE:
                dbAlias = "oracle";
                break;
            case DATABASE_DB2:
                dbAlias = "db2";
                break;
            default:
                break;
            }
            return dbAlias;
        }
    

    然后在databaseIdProvider中做如下配置:
    <databaseIdProvider type="com.daily.objectfactory.MyDatabaseIdProvider" />
    property属性可以不做配置了,其他都一样。

    以上就是数据库厂商标识databaseIdProvider的相关介绍。

    相关文章

      网友评论

          本文标题:mybatis关于databaseid属性的配置

          本文链接:https://www.haomeiwen.com/subject/wtcfjctx.html