IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Mybatis 入门 第八篇 -> 正文阅读

[大数据]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);
    }
}

输出结果:

在这里插入图片描述

有事儿没事儿关注公众号: 木子的昼夜
在这里插入图片描述

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-09-04 17:36:52  更:2021-09-04 17:39:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 16:45:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码