spring cloud项目mybatis集成Hbase/MySql多数据源_木鱼&金鱼的博客-程序员宝宝

技术标签: Java  多数据源  spring cloud  

公司最近的项目需要在spring cloud 上集成Hbase和mysql,连接Hbase使用Phoenix来连接

先来看看项目结构:

核心pom依赖如下,其中 phoenix-4.7.0.2.5.3.0-37-client.jar使用的是本地的jar包

其他spring sloud所需依赖自行添加即可

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.20</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.4</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.1.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <!--连接phoenix需要的包 start -->
        <dependency>
            <groupId>org.apache.phoenix</groupId>
            <artifactId>phoenix-client</artifactId>
            <scope>system</scope>
            <systemPath>${basedir}/../libs/phoenix-4.7.0.2.5.3.0-37-client.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
        <!--连接phoenix需要的包 end -->

datasource的相关配置:

  datasource:
    mysql:
      jdbcUrl: jdbc:mysql://127.0.0.1:3306/clouddo?useUnicode=true&characterEncoding=utf8&useJDBCCompliantTimezoneShift=true&serverTimezone=UTC
      driverClassName: com.mysql.jdbc.Driver
      username: root
      password: root

    phoenix:
      enable: true
      jdbcUrl: jdbc:phoenix:lyzk01:2181
      driverClassName: org.apache.phoenix.jdbc.PhoenixDriver
      username:
      password:
      default-auto-commit: true

创建datasource配置类 :MysqlDataSource、PhoenixDataSource

注意:一定要指定一个datasource为@Primary

package com.ly.lydataphoenix.dataSource;

import com.alibaba.druid.pool.DruidDataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import org.springframework.core.env.Environment;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;


/**
 * @author liutao
 * @description mysql数据源配置
 * @date 2019/10/12 10:07
 */
@Configuration
@MapperScan(basePackages = "com.ly.lydataphoenix.dao.mysql", sqlSessionFactoryRef = "mysqlSessionFactory")
public class MysqlDataSource {

    @Bean(name = "mysqlJdbcDataSource")
    @Qualifier("mysqlJdbcDataSource")
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.mysql")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "mysqlSessionFactory")
    @Primary
    public SqlSessionFactory test1SqlSessionFactory(@Qualifier("mysqlJdbcDataSource") DataSource datasource)
            throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(datasource);
        bean.setMapperLocations(
                // 设置mybatis的xml所在位置
                new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/mysql/*.xml"));
        return bean.getObject();
    }


    @Bean(name = "mysqlJdbcTemplate")
    public JdbcTemplate mysqlJdbcTemplate(@Qualifier("mysqlJdbcDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

}
package com.ly.lydataphoenix.dataSource;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.env.Environment;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

/**
 * @author liutao
 * @description phoenix数据源配置
 * @date 2019/10/12 10:42
 */

@Configuration
@MapperScan(basePackages = "com.ly.lydataphoenix.dao.hbase", sqlSessionFactoryRef = "hbaseSessionFactory")
public class PhoenixDataSource {

    @Bean(name = "phoenixJdbcDataSource")
    @Qualifier("phoenixJdbcDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.phoenix")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "hbaseSessionFactory")
    public SqlSessionFactory test1SqlSessionFactory(@Qualifier("phoenixJdbcDataSource") DataSource datasource)
            throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(datasource);
        bean.setMapperLocations(
                // 设置mybatis的xml所在位置
                new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/hbase/*.xml"));
        return bean.getObject();
    }

    @Bean(name = "phoenixJdbcTemplate")
    public JdbcTemplate phoenixJdbcTemplate(@Qualifier("phoenixJdbcDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

注意事项:dao代码路径跟mapper.xml的目录要对应上:

UserInfoMapper

package com.ly.lydataphoenix.dao.hbase;

import com.ly.lydataphoenix.domain.UserInfo;
import org.apache.ibatis.annotations.Mapper;

/**
 * @author liutao
 * @description
 * @date 2019/10/11 15:11
 */
@Mapper
public interface UserInfoMapper {
    public UserInfo getUserById(int userId);
}

DeptMapper

package com.ly.lydataphoenix.dao.mysql;

import com.ly.lydataphoenix.domain.DeptDO;
import org.apache.ibatis.annotations.Mapper;
/**
 * 部门管理
 * @author chglee
 * @email [email protected]
 * @date 2017-10-03 15:35:39
 */
@Mapper
public interface DeptMapper {
	DeptDO get(int deptId);
}

UserInfoMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

    <mapper namespace="com.ly.lydataphoenix.dao.hbase.UserInfoMapper">

	<select id="getUserById" resultType="com.ly.lydataphoenix.domain.UserInfo">
		select * from TEST.USER_INFO WHERE ID=#{userId}
	</select>
</mapper>

DeptMapper.xml

<!--<?xml version="1.0" encoding="UTF-8"?>-->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.ly.lydataphoenix.dao.mysql.DeptMapper">
	<select id="get" resultType="com.ly.lydataphoenix.domain.DeptDO">
		select
		`dept_id`,`parent_id`,`name`,`order_num`,`del_flag` from sys_dept
		where dept_id = #{value}
	</select>
</mapper>

DeptDO

public class DeptDO implements Serializable {
	private static final long serialVersionUID = 1L;
	
	//
	private Long deptId;
	//上级部门ID,一级部门为0
	private Long parentId;
	//部门名称
	private String name;
	//排序
	private Integer orderNum;
	//是否删除  -1:已删除  0:正常
	private Integer delFlag;

	/**
	 * 设置:
	 */
	public void setDeptId(Long deptId) {
		this.deptId = deptId;
	}
	/**
	 * 获取:
	 */
	public Long getDeptId() {
		return deptId;
	}
	/**
	 * 设置:上级部门ID,一级部门为0
	 */
	public void setParentId(Long parentId) {
		this.parentId = parentId;
	}
	/**
	 * 获取:上级部门ID,一级部门为0
	 */
	public Long getParentId() {
		return parentId;
	}
	/**
	 * 设置:部门名称
	 */
	public void setName(String name) {
		this.name = name;
	}
	/**
	 * 获取:部门名称
	 */
	public String getName() {
		return name;
	}
	/**
	 * 设置:排序
	 */
	public void setOrderNum(Integer orderNum) {
		this.orderNum = orderNum;
	}
	/**
	 * 获取:排序
	 */
	public Integer getOrderNum() {
		return orderNum;
	}
	/**
	 * 设置:是否删除  -1:已删除  0:正常
	 */
	public void setDelFlag(Integer delFlag) {
		this.delFlag = delFlag;
	}
	/**
	 * 获取:是否删除  -1:已删除  0:正常
	 */
	public Integer getDelFlag() {
		return delFlag;
	}

	@Override
	public String toString() {
		return "DeptDO{" +
				"deptId=" + deptId +
				", parentId=" + parentId +
				", name='" + name + '\'' +
				", orderNum=" + orderNum +
				", delFlag=" + delFlag +
				'}';
	}
}

UserInfo

public class UserInfo {

    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

编写单元测试类

package com.ly.lydataphoenix;

import com.ly.lydataphoenix.dao.hbase.UserInfoMapper;
import com.ly.lydataphoenix.dao.mysql.DeptMapper;
import com.ly.lydataphoenix.domain.DeptDO;
import com.ly.lydataphoenix.domain.UserInfo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;

/**
 * @author liutao
 * @description
 * @date 2019/10/12 10:46
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class MainTest {

//    @Autowired
//    @Qualifier("mysqlJdbcTemplate")
//    JdbcTemplate mysqlJdbcTemplate;
//
//    @Autowired
//    @Qualifier("phoenixJdbcTemplate")
//    JdbcTemplate phoenixJdbcTemplate;

    @Resource
    private DeptMapper deptMapper;

    @Resource
    private UserInfoMapper userInfoMapper;

    @Test
    public void mysqlTest() {
        DeptDO deptDO = deptMapper.get(6);
        System.out.println("name===" + deptDO.getName());
    }

    @Test
    public void hbaseTest() {
        UserInfo userInfo = userInfoMapper.getUserById(1);
        System.out.println(String.format("ID=%s;NAME=%s", userInfo.getId(), userInfo.getName()));
    }

//    @Test
//    public void DataSourceTest() {
//        String name = mysqlJdbcTemplate.queryForObject("select name from sys_user where user_id=1", String.class);
//        System.out.printf("name===" + name);
//    }
//
//    @Test
//    public void DataSourceTest2() {
//        String name = phoenixJdbcTemplate.queryForObject("select name from TEST.USER_INFO WHERE ID=1", String.class);
//        System.out.printf("name===" + name);
//    }

}

mysqlTest测试结果

hbaseTest测试结果

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_30062385/article/details/102588088

智能推荐

这个标星 15.9k+ 的 项目竟然是全球排名第一的免费开源软件_非著名程序员的博客-程序员宝宝

【公众号回复 “1024”,免费领取程序员赚钱实操经验】今天推荐的这个项目 Odoo 是全球排名第一的免费开源 ERP。ERP 系统是企业资源计划(Enterprise Resource...

python解压zip到当前目录_python解压zip文件,python解压zip到当前目录_weixin_40003478的博客-程序员宝宝

python解压zip文件,python解压zip到当前目录,使用Python解压zip、rar文件基本格式:zipfile.ZipFile(filename[,mode[,compression[,allowZip64]]])mode:可选 r,w,a 代表不同的打开文件的方式;r 只读;w 重写;a 添加compression:指出这个 zipfile 用什么压缩方法,默认是 ZIP_STOR...

第46天 JavaScript(1)_臭豆腐炒皮蛋的博客-程序员宝宝

JavaScript新篇章开启 嗯,好像越来越懒了。解释性语言都不想写了。。。不过第一天教js出乎意料的快,直接就是定时器,计划的教学时间是两周,14天,剩下的时间只有两个月不到了。。当你回首往事时,如果是现在这个状态,你一定会后悔的,以现在这个状态维持到最后,很危险。外在 和 内在 都在给你发消息,危险 !!危险!!dangerous

FSCapture绿色汉化版使用体验_亭子青年的博客-程序员宝宝

FSCapture是一款抓屏工具,体积小巧,功能强大。具有下面几种主要功能。 - 截图,编辑图片 - 屏幕录像机-WMV格式 - 从扫描器获取图片 - 将图像转换为PDF文档 - 屏幕拾色器 - 屏幕标尺FSCapture介绍1.FSCapture v8.0绿色汉化版,下载链接:http://pan.baidu.com/s/1pKP1sSV 密码:f4jx 2.使用介绍:http://

(转贴)VC中创建与使用静态链接库和动态链接库_immortal_06的博客-程序员宝宝

 关键词: VC    静态链接库    动态链接库                                           静态库包括.lib和.h文件,在工程中使用静态库分为3步:1在工程中加入静态库,有两种方法:方法一:项目设置中引用.lib,project-setting-link-object/library modules中添加.lib;(需要在tools/

babel版本兼容报错处理:Plugin/Preset files are not allowed to export objects_我不爱编程的博客-程序员宝宝

今天运行webpack时报了一个:Plugin/Preset files are not allowed to export objects翻译过来就是 :(插件/预设文件不允许导出对象)具体错误就是下面:百度了一番 才知道 是因为 babel 的版本冲突core的版本是6.x 要求loader的版本为7.x。目前core的最新版本是6.x,而最新的loader已经更新到了8.x,...

随便推点

composer安装_weixin_39810273的博客-程序员宝宝

composer安装1.在官网下载windows版下载好只要下一步一路安装就好了2.修改布国内镜像方法一:修改 composer 的全局配置文件(推荐方式)打开命令行窗口(windows用户)或控制台(Linux、Mac 用户)并执行如下命令:composer config -g repo.packagist composer https://packagist.phpcomposer.com方法二:修改当前项目的composer.json配置文件:打开命...

golang web开发 Handler测试利器httptest_kingeasternsun的博客-程序员宝宝

test是golang语言的一部分,golang提供了非常强大的测试方法。单元测试,压力测试可以参见 golang 1.7之后高级测试方法之子测试,子基准测试(subtest sub-benchmarks)我们用go开发一个Web Server后,打算单元测试写的handler函数,在不知道httptest之前,使用比较笨的方法 就是编译运行该Web Server后,再用go编写一个客户端程...

golang复合类型总结_github_zwl的博客-程序员宝宝_golang 联合类型

golang复合类型总结指针类型,数组,切片,map和结构体 指针:指针就是地址var p *inta=1p = &amp;a*p = 999 相当于a=999指针必须有一个合法的指向才能调用赋值等 new关键字和make关键字留意一下。new之后不需要释放,自动的gc值传递和指针传递的区别---值传递是拷贝一份,指针则是指向其内存...

Centos8中安装并配置VDO来优化存储空间_Linux_华仔的博客-程序员宝宝_centos 安装pvcreate

虚拟数据优化器(VDO)是一种块虚拟化技术,可提供透明的数据重复删除功能。通过消除冗余的数据块,VDO可以大大减少实际使用的磁盘容量。 VDO由两个内核模块和两个命令组成:由下面两个内核模块组成:kvdo - 该模块加载到设备管理器层,提供用于重复数据删除的块存储卷。 uds - 该模块负责与VDO磁盘上的通用的重复数据删除索引进行通信。包括两个命令行工具:vdo - 用于创建,删除,启动和停止VDO卷,以及执行其他配置操作。 vdostats - 用于报告VDO卷的各个方面,包括有效

苹果电脑如何设置屏保时间?_梦想也许愿的博客-程序员宝宝_苹果电脑屏保

苹果电脑如何设置屏保时间?下面小编就给大家带来了苹果电脑屏保时间设置的方法,感兴趣的朋友快来跟小编看看吧!1.点击系统偏好设置2.点击桌面与程序保护程序3.点击屏幕保护程序4.更改左下角时间,开始前闲置时间,这样苹果电脑屏保时间就设置好了以上就是小编今天为大家分享的内容,希望对您有所帮助,想了解更多关于Mac相关知识,请关注macz.com吧!...

VideoCapture类常用API个人总结_晴明大大的博客-程序员宝宝

一下“#”后的内容皆为注释相关API :1、创建Video Capture类的构造函数:C++: VideoCapture::VideoCapture()# VideoCapture video(0)(此为默认使用电脑自带摄像头)C++: VideoCapture::VideoCapture(const string&amp;amp; filename)#VideoCapture video...