Mybatis 入门 第八篇

一、 多数据库 优先级问题

上一篇讲了怎么使用**_databaseId**、databaseIdProvider 写不同的数据库语句

<databaseIdProvider type="DB_VENDOR" >
    <property name="DB2" value="db2" />
    <property name="Oracle" value="oracle" />
    <property name="Adaptive Server Enterprise" value="sybase" />
    <property name="MySQL" value="mysql" />
</databaseIdProvider>

讲实话,项目中很少这样用,因为数据库一般都是确定的而且变得概率是不大的。

但是作为一个知识点,我们可以学习一下,从学如果能悟出点儿解决工作中复杂业务的一些灵感那就更好了。

我不知道从哪儿看到了一句优先级的问题,但是今天想不到这个是什么意思了,这个优先级就当我没说吧,哈哈!

二、属性 databaseId

上一篇这样写的

<!--选择不同的数据库-->
<select id="testDb" resultType="string" >
    <!--如果是mysql 执行这个 -->
    <if test="_databaseId == 'mysql'">
        select CONCAT('mysql-->',#{_databaseId},'-->',now()) from dual
    </if>
    <!--如果是oracle 执行这个-->
    <if test="_databaseId == 'oracle'">
        select 'oracle-->'||#{_databaseId}  from dual
    </if>
</select>

也可以这样写:

<!--选择不同的数据库-->
<!--mysql-->
<select id="testDb" resultType="string" databaseId="mysql">
    select "mysql" from dual
</select>
<!--oracle-->
<select id="testDb" resultType="string" databaseId="oracle">
    select "oracle"
</select>
<!--其他-->
<select id="testDb" resultType="string" databaseId="">
    select "其他"
</select>

经过测试发现用了databaseId 标签就不能用**_databaseId**了

三、 自定义DatabaseIdProvider

创建类:

package config;

import org.apache.ibatis.mapping.DatabaseIdProvider;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.util.Map;
import java.util.Properties;

/**
 * @author 发现更多精彩  关注公众号:木子的昼夜编程
 * 一个生活在互联网底层,做着增删改查的码农,不谙世事的造作
 * @create 2021-09-03 21:35
 */
public class MyDatabaseIdProvider implements DatabaseIdProvider {
    Properties prop ;

    // 这个properties就是 mybatis-config.xml中 databaseIdProvider的所有property
    @Override
    public void setProperties(Properties p) {
        this.prop = p;
    }

    @Override
    public String getDatabaseId(DataSource dataSource) throws SQLException {
        // 这里自己判断类型返回
        // 获取连接
        Connection con = null;
        try {
            con = dataSource.getConnection();
            // 获取元信息
            DatabaseMetaData metaData = con.getMetaData();
            // 获取数据库产品名称
            String productName =  metaData.getDatabaseProductName();
            System.out.println("产品名称:"+productName);
            if (this.prop != null) {
                for (Map.Entry<Object, Object> property : prop.entrySet()) {
                    String key = (String) property.getKey();
                    String value = (String) property.getValue();
                    System.out.println("key="+key+",value="+value);
                    if (productName.contains(key)) {
                        return value;
                    }
                }
                // 默认返回空
                return null;
            }
        } finally {
            if (con != null) {
                try {
                    con.close();
                } catch (SQLException e) {
                    // ignored
                }
            }
        }
        // 默认返回空
        return null;
    }
}

mybatis-config.xml指定类:

<databaseIdProvider type="config.MyDatabaseIdProvider" >
    <property name="DB2" value="db2" />
    <property name="Oracle" value="oracle" />
    <property name="Adaptive Server Enterprise" value="sybase" />
    <property name="MySQL" value="mysql" />
</databaseIdProvider>

测试:

public class TestMain {
    public static void main(String[] args) throws Exception {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession session = sqlSessionFactory.openSession();
            // 通过sesson获取Mapper 这个Mapper会编程Mybatis的代理Mapper
            PersonMapper mapper = session.getMapper(PersonMapper.class);
            String type = mapper.testDb();
            System.out.println("数据库类型:"+type);
    }
}

输出结果:

Mybatis 入门 第八篇

有事儿没事儿关注公众号: 木子的昼夜
Mybatis 入门 第八篇

上一篇:JDBC连接hive(附完整代码)


下一篇:python 对接各大数据库