一、前言

使用 Spring+Mybatis 操作 Phoenix 和操作其他的关系型数据库(如 Mysql,Oracle)在配置上是基本相同的,下面会分别给出 Spring/Spring Boot 整合步骤,完整代码见本仓库:

二、Spring + Mybatis + Phoenix

2.1 项目结构

2.2 主要依赖

除了 Spring 相关依赖外,还需要导入 phoenix-core 和对应的 Mybatis 依赖包

  1. <!--mybatis 依赖包-->
  2. <dependency>
  3. <groupId>org.mybatis</groupId>
  4. <artifactId>mybatis-spring</artifactId>
  5. <version>1.3.2</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.mybatis</groupId>
  9. <artifactId>mybatis</artifactId>
  10. <version>3.4.6</version>
  11. </dependency>
  12. <!--phoenix core-->
  13. <dependency>
  14. <groupId>org.apache.phoenix</groupId>
  15. <artifactId>phoenix-core</artifactId>
  16. <version>4.14.0-cdh5.14.2</version>
  17. </dependency>

2.3 数据库配置文件

在数据库配置文件 jdbc.properties 中配置数据库驱动和 zookeeper 地址

  1. # 数据库驱动
  2. phoenix.driverClassName=org.apache.phoenix.jdbc.PhoenixDriver
  3. # zookeeper地址
  4. phoenix.url=jdbc:phoenix:192.168.0.105:2181

2.4 配置数据源和会话工厂

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  6. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
  7. <!-- 开启注解包扫描-->
  8. <context:component-scan base-package="com.heibaiying.*"/>
  9. <!--指定配置文件的位置-->
  10. <context:property-placeholder location="classpath:jdbc.properties"/>
  11. <!--配置数据源-->
  12. <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  13. <!--Phoenix 配置-->
  14. <property name="driverClassName" value="${phoenix.driverClassName}"/>
  15. <property name="url" value="${phoenix.url}"/>
  16. </bean>
  17. <!--配置 mybatis 会话工厂 -->
  18. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  19. <property name="dataSource" ref="dataSource"/>
  20. <!--指定 mapper 文件所在的位置-->
  21. <property name="mapperLocations" value="classpath*:/mappers/**/*.xml"/>
  22. <property name="configLocation" value="classpath:mybatisConfig.xml"/>
  23. </bean>
  24. <!--扫描注册接口 -->
  25. <!--作用:从接口的基础包开始递归搜索,并将它们注册为 MapperFactoryBean(只有至少一种方法的接口才会被注册;, 具体类将被忽略)-->
  26. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  27. <!--指定会话工厂 -->
  28. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
  29. <!-- 指定 mybatis 接口所在的包 -->
  30. <property name="basePackage" value="com.heibaiying.dao"/>
  31. </bean>
  32. </beans>

2.5 Mybtais参数配置

新建 mybtais 配置文件,按照需求配置额外参数, 更多 settings 配置项可以参考官方文档

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <!-- mybatis 配置文件 -->
  6. <configuration>
  7. <settings>
  8. <!-- 开启驼峰命名 -->
  9. <setting name="mapUnderscoreToCamelCase" value="true"/>
  10. <!-- 打印查询 sql -->
  11. <setting name="logImpl" value="STDOUT_LOGGING"/>
  12. </settings>
  13. </configuration>

2.6 查询接口

  1. public interface PopulationDao {
  2. List<USPopulation> queryAll();
  3. void save(USPopulation USPopulation);
  4. USPopulation queryByStateAndCity(@Param("state") String state, @Param("city") String city);
  5. void deleteByStateAndCity(@Param("state") String state, @Param("city") String city);
  6. }
  1. <!DOCTYPE mapper
  2. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  4. <mapper namespace="com.heibaiying.dao.PopulationDao">
  5. <select id="queryAll" resultType="com.heibaiying.bean.USPopulation">
  6. SELECT * FROM us_population
  7. </select>
  8. <insert id="save">
  9. UPSERT INTO us_population VALUES( #{state}, #{city}, #{population} )
  10. </insert>
  11. <select id="queryByStateAndCity" resultType="com.heibaiying.bean.USPopulation">
  12. SELECT * FROM us_population WHERE state=#{state} AND city = #{city}
  13. </select>
  14. <delete id="deleteByStateAndCity">
  15. DELETE FROM us_population WHERE state=#{state} AND city = #{city}
  16. </delete>
  17. </mapper>

2.7 单元测试

  1. @RunWith(SpringRunner.class)
  2. @ContextConfiguration({"classpath:springApplication.xml"})
  3. public class PopulationDaoTest {
  4. @Autowired
  5. private PopulationDao populationDao;
  6. @Test
  7. public void queryAll() {
  8. List<USPopulation> USPopulationList = populationDao.queryAll();
  9. if (USPopulationList != null) {
  10. for (USPopulation USPopulation : USPopulationList) {
  11. System.out.println(USPopulation.getCity() + " " + USPopulation.getPopulation());
  12. }
  13. }
  14. }
  15. @Test
  16. public void save() {
  17. populationDao.save(new USPopulation("TX", "Dallas", 66666));
  18. USPopulation usPopulation = populationDao.queryByStateAndCity("TX", "Dallas");
  19. System.out.println(usPopulation);
  20. }
  21. @Test
  22. public void update() {
  23. populationDao.save(new USPopulation("TX", "Dallas", 99999));
  24. USPopulation usPopulation = populationDao.queryByStateAndCity("TX", "Dallas");
  25. System.out.println(usPopulation);
  26. }
  27. @Test
  28. public void delete() {
  29. populationDao.deleteByStateAndCity("TX", "Dallas");
  30. USPopulation usPopulation = populationDao.queryByStateAndCity("TX", "Dallas");
  31. System.out.println(usPopulation);
  32. }
  33. }

三、SpringBoot + Mybatis + Phoenix

3.1 项目结构

3.2 主要依赖

  1. <!--spring 1.5 x 以上版本对应 mybatis 1.3.x (1.3.1)
  2. 关于更多 spring-boot 与 mybatis 的版本对应可以参见 <a href="http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/">-->
  3. <dependency>
  4. <groupId>org.mybatis.spring.boot</groupId>
  5. <artifactId>mybatis-spring-boot-starter</artifactId>
  6. <version>1.3.2</version>
  7. </dependency>
  8. <!--phoenix core-->
  9. <dependency>
  10. <groupId>org.apache.phoenix</groupId>
  11. <artifactId>phoenix-core</artifactId>
  12. <version>4.14.0-cdh5.14.2</version>
  13. </dependency>
  14. <dependency>

spring boot 与 mybatis 版本的对应关系:

MyBatis-Spring-Boot-Starter 版本 MyBatis-Spring 版本 Spring Boot 版本
1.3.x (1.3.1) 1.3 or higher 1.5 or higher
1.2.x (1.2.1) 1.3 or higher 1.4 or higher
1.1.x (1.1.1) 1.3 or higher 1.3 or higher
1.0.x (1.0.2) 1.2 or higher 1.3 or higher

3.3 配置数据源

在 application.yml 中配置数据源,spring boot 2.x 版本默认采用 Hikari 作为数据库连接池,Hikari 是目前 java 平台性能最好的连接池,性能好于 druid。

  1. spring:
  2. datasource:
  3. #zookeeper 地址
  4. url: jdbc:phoenix:192.168.0.105:2181
  5. driver-class-name: org.apache.phoenix.jdbc.PhoenixDriver
  6. # 如果不想配置对数据库连接池做特殊配置的话,以下关于连接池的配置就不是必须的
  7. # spring-boot 2.X 默认采用高性能的 Hikari 作为连接池 更多配置可以参考 https://github.com/brettwooldridge/HikariCP#configuration-knobs-baby
  8. type: com.zaxxer.hikari.HikariDataSource
  9. hikari:
  10. # 池中维护的最小空闲连接数
  11. minimum-idle: 10
  12. # 池中最大连接数,包括闲置和使用中的连接
  13. maximum-pool-size: 20
  14. # 此属性控制从池返回的连接的默认自动提交行为。默认为 true
  15. auto-commit: true
  16. # 允许最长空闲时间
  17. idle-timeout: 30000
  18. # 此属性表示连接池的用户定义名称,主要显示在日志记录和 JMX 管理控制台中,以标识池和池配置。 默认值:自动生成
  19. pool-name: custom-hikari
  20. #此属性控制池中连接的最长生命周期,值 0 表示无限生命周期,默认 1800000 即 30 分钟
  21. max-lifetime: 1800000
  22. # 数据库连接超时时间,默认 30 秒,即 30000
  23. connection-timeout: 30000
  24. # 连接测试 sql 这个地方需要根据数据库方言差异而配置 例如 oracle 就应该写成 select 1 from dual
  25. connection-test-query: SELECT 1
  26. # mybatis 相关配置
  27. mybatis:
  28. configuration:
  29. # 是否打印 sql 语句 调试的时候可以开启
  30. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3.4 新建查询接口

上面 Spring+Mybatis 我们使用了 XML 的方式来写 SQL,为了体现 Mybatis 支持多种方式,这里使用注解的方式来写 SQL。

  1. @Mapper
  2. public interface PopulationDao {
  3. @Select("SELECT * from us_population")
  4. List<USPopulation> queryAll();
  5. @Insert("UPSERT INTO us_population VALUES( #{state}, #{city}, #{population} )")
  6. void save(USPopulation USPopulation);
  7. @Select("SELECT * FROM us_population WHERE state=#{state} AND city = #{city}")
  8. USPopulation queryByStateAndCity(String state, String city);
  9. @Delete("DELETE FROM us_population WHERE state=#{state} AND city = #{city}")
  10. void deleteByStateAndCity(String state, String city);
  11. }

3.5 单元测试

  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest
  3. public class PopulationTest {
  4. @Autowired
  5. private PopulationDao populationDao;
  6. @Test
  7. public void queryAll() {
  8. List<USPopulation> USPopulationList = populationDao.queryAll();
  9. if (USPopulationList != null) {
  10. for (USPopulation USPopulation : USPopulationList) {
  11. System.out.println(USPopulation.getCity() + " " + USPopulation.getPopulation());
  12. }
  13. }
  14. }
  15. @Test
  16. public void save() {
  17. populationDao.save(new USPopulation("TX", "Dallas", 66666));
  18. USPopulation usPopulation = populationDao.queryByStateAndCity("TX", "Dallas");
  19. System.out.println(usPopulation);
  20. }
  21. @Test
  22. public void update() {
  23. populationDao.save(new USPopulation("TX", "Dallas", 99999));
  24. USPopulation usPopulation = populationDao.queryByStateAndCity("TX", "Dallas");
  25. System.out.println(usPopulation);
  26. }
  27. @Test
  28. public void delete() {
  29. populationDao.deleteByStateAndCity("TX", "Dallas");
  30. USPopulation usPopulation = populationDao.queryByStateAndCity("TX", "Dallas");
  31. System.out.println(usPopulation);
  32. }
  33. }

附:建表语句

上面单元测试涉及到的测试表的建表语句如下:

  1. CREATE TABLE IF NOT EXISTS us_population (
  2. state CHAR(2) NOT NULL,
  3. city VARCHAR NOT NULL,
  4. population BIGINT
  5. CONSTRAINT my_pk PRIMARY KEY (state, city));
  6. -- 测试数据
  7. UPSERT INTO us_population VALUES('NY','New York',8143197);
  8. UPSERT INTO us_population VALUES('CA','Los Angeles',3844829);
  9. UPSERT INTO us_population VALUES('IL','Chicago',2842518);
  10. UPSERT INTO us_population VALUES('TX','Houston',2016582);
  11. UPSERT INTO us_population VALUES('PA','Philadelphia',1463281);
  12. UPSERT INTO us_population VALUES('AZ','Phoenix',1461575);
  13. UPSERT INTO us_population VALUES('TX','San Antonio',1256509);
  14. UPSERT INTO us_population VALUES('CA','San Diego',1255540);
  15. UPSERT INTO us_population VALUES('CA','San Jose',912332);

系列传送门

入门大数据---Spring+Mybatis+Phoenix整合的更多相关文章

  1. HBase 学习之路(十一)—— Spring/Spring Boot + Mybatis + Phoenix 整合

    一.前言 使用Spring+Mybatis操作Phoenix和操作其他的关系型数据库(如Mysql,Oracle)在配置上是基本相同的,下面会分别给出Spring/Spring Boot 整合步骤,完 ...

  2. HBase 系列(十一)—— Spring/Spring Boot + Mybatis + Phoenix 整合

    一.前言 使用 Spring+Mybatis 操作 Phoenix 和操作其他的关系型数据库(如 Mysql,Oracle)在配置上是基本相同的,下面会分别给出 Spring/Spring Boot ...

  3. JavaWeb_(SpringMVC框架)测试SpringMVC&Spring&MyBatis三大整合

    搭建 SpringMVC&Spring&MyBatis三大整合 传送门 1.准备 测试搭建S pringMVC&Spring&MyBatis三大整合 用例   a)准备 ...

  4. struts2 + spring + mybatis 框架整合详细介绍

    struts2 + spring + mybatis  框架整合详细介绍 参考地址: https://blog.csdn.net/qq_22028771/article/details/5149898 ...

  5. SpringMvc+Spring+Mybatis+Maven整合

    一.建立数据库表,使用generator自动生成相关代码: /* SQLyog Ultimate v11.24 (32 bit) MySQL - 5.1.62-community : Database ...

  6. idea+springmvc+spring+mybatis+maven整合返回json数据webapi

    首先看一张目录结构图: : 创建步骤: 1.创建maven  webapp工程, 创建完后的目录结构为: 2.添加项目依赖(添加jar包) 需要的jar包: spring-webmvc, spring ...

  7. 入门大数据---Spark_Streaming整合Flume

    一.简介 Apache Flume 是一个分布式,高可用的数据收集系统,可以从不同的数据源收集数据,经过聚合后发送到分布式计算框架或者存储系统中.Spark Straming 提供了以下两种方式用于 ...

  8. 入门大数据---Flume整合Kafka

    一.背景 先说一下,为什么要使用 Flume + Kafka? 以实时流处理项目为例,由于采集的数据量可能存在峰值和峰谷,假设是一个电商项目,那么峰值通常出现在秒杀时,这时如果直接将 Flume 聚合 ...

  9. 入门大数据---Hbase是什么?

    一.Hbase是什么? Hbase属于NoSql的一种. NoSql数据库分为如下几类: Key-Value类型数据库 这类数据库主要会使用到一个哈希表,这个表有一个特定的键和一个指针指向特定的数据. ...

随机推荐

  1. Rocket - config - implicit Parameters

    https://mp.weixin.qq.com/s/OH_Z1gdSUpfgM-tjx0OlrA   追溯配置信息的源头.   0. HasRocketCoreParameters   ​​ Has ...

  2. Java实现 洛谷 P1010 幂次方

    输入输出样例 输入 #1 1315 输出 #1 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0) import java.util.Scanner; pu ...

  3. 一篇关于Android M以后权限介绍的不错的文章

    文章地址:http://www.jianshu.com/p/e1ab1a179fbb/

  4. Python内置Turtle绘图库方法简介+多案例

    urtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x.纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的 ...

  5. 智能家居巨头 Aqara 基于 KubeSphere 打造物联网微服务平台

    背景 从传统运维到容器化的 Docker Swarm 编排,从 Docker Swarm 转向 Kubernetes,然后在 Kubernetes 运行 SpringCloud 微服务全家桶,到最终拥 ...

  6. 带你轻松了解C# Lock 关键字

    相信绝大多数.NET玩家和我一样,常常使用Timer这个对象,而在WPF中使用DispatcherTimer的人也是很多,DispatcherTimer是在UI线程跑的.我们的程序中大多数都会充斥很多 ...

  7. EIGRP-14-EIGRP的命名模式

    从IOS 15.0(1)M版本开始,工程师可以在路由器上使用命名模式(Named Mode)配置EIGRP进程.按照IPv4和IPv6,通过AS号来配置EIGRP进程的做法称为经典模式(Classic ...

  8. UIPopoverPresentationController的使用

    前言 最近项目中很多地方有一个相同的需求,那就是点击一个按钮的时候在按钮的某一个方向弹出一个视图,这个视图需要带有一个箭头指向,就像下图一样.要实现这个功能,就要用到UIPopoverPresenta ...

  9. C++ 网教通直播刷屏反制 (思路启发)

    前言 那些手动刷屏的你们弱爆了! 直播间的讨论区是用来讨论的, 下次谁再在上课时间大量刷屏,就以暴制暴! 思路启发 #define VK_CTRL 0x11 //... keybd_event(VK_ ...

  10. python基础--程序交互、格式化输出、流程控制、break、continue

    在此申明一下,博客参照了https://www.cnblogs.com/jin-xin/,自己做了部分的改动 (1) 程序交互 #!/usr/bin/env python # -*- coding: ...