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

来源:https://www.cnblogs.com/heibaiying/archive/2019/08/27/11418690.html
-Advertisement-
Play Games

一、前言 使用 Spring+Mybatis 操作 Phoenix 和操作其他的關係型資料庫(如 Mysql,Oracle)在配置上是基本相同的,下麵會分別給出 Spring/Spring Boot 整合步驟,完整代碼見本倉庫: + "Spring + Mybatis + Phoenix" + "S ...


一、前言

使用 Spring+Mybatis 操作 Phoenix 和操作其他的關係型資料庫(如 Mysql,Oracle)在配置上是基本相同的,下麵會分別給出 Spring/Spring Boot 整合步驟,完整代碼見本倉庫:

二、Spring + Mybatis + Phoenix

2.1 項目結構

2.2 主要依賴

除了 Spring 相關依賴外,還需要導入 phoenix-core 和對應的 Mybatis 依賴包

<!--mybatis 依賴包-->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.2</version>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.6</version>
</dependency>
<!--phoenix core-->
<dependency>
    <groupId>org.apache.phoenix</groupId>
    <artifactId>phoenix-core</artifactId>
    <version>4.14.0-cdh5.14.2</version>
</dependency>

2.3 資料庫配置文件

在資料庫配置文件 jdbc.properties 中配置資料庫驅動和 zookeeper 地址

# 資料庫驅動
phoenix.driverClassName=org.apache.phoenix.jdbc.PhoenixDriver
# zookeeper地址
phoenix.url=jdbc:phoenix:192.168.0.105:2181

2.4 配置數據源和會話工廠

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        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">

    <!-- 開啟註解包掃描-->
    <context:component-scan base-package="com.heibaiying.*"/>

    <!--指定配置文件的位置-->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!--配置數據源-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <!--Phoenix 配置-->
        <property name="driverClassName" value="${phoenix.driverClassName}"/>
        <property name="url" value="${phoenix.url}"/>
    </bean>

    <!--配置 mybatis 會話工廠 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!--指定 mapper 文件所在的位置-->
        <property name="mapperLocations" value="classpath*:/mappers/**/*.xml"/>
        <property name="configLocation" value="classpath:mybatisConfig.xml"/>
    </bean>

    <!--掃描註冊介面 -->
    <!--作用:從介面的基礎包開始遞歸搜索,並將它們註冊為 MapperFactoryBean(只有至少一種方法的介面才會被註冊;, 具體類將被忽略)-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--指定會話工廠 -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <!-- 指定 mybatis 介面所在的包 -->
        <property name="basePackage" value="com.heibaiying.dao"/>
    </bean>

</beans>

2.5 Mybtais參數配置

新建 mybtais 配置文件,按照需求配置額外參數, 更多 settings 配置項可以參考官方文檔

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

<!-- mybatis 配置文件 -->
<configuration>
    <settings>
        <!-- 開啟駝峰命名 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!-- 列印查詢 sql -->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
</configuration>

2.6 查詢介面

public interface PopulationDao {

    List<USPopulation> queryAll();

    void save(USPopulation USPopulation);

    USPopulation queryByStateAndCity(@Param("state") String state, @Param("city") String city);

    void deleteByStateAndCity(@Param("state") String state, @Param("city") String city);
}
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.heibaiying.dao.PopulationDao">


    <select id="queryAll" resultType="com.heibaiying.bean.USPopulation">
        SELECT * FROM us_population
    </select>

    <insert id="save">
        UPSERT INTO us_population VALUES( #{state}, #{city}, #{population} )
    </insert>

    <select id="queryByStateAndCity" resultType="com.heibaiying.bean.USPopulation">
        SELECT * FROM us_population WHERE state=#{state} AND city = #{city}
    </select>

    <delete id="deleteByStateAndCity">
        DELETE FROM us_population WHERE state=#{state} AND city = #{city}
    </delete>

</mapper>

2.7 單元測試

@RunWith(SpringRunner.class)
@ContextConfiguration({"classpath:springApplication.xml"})
public class PopulationDaoTest {

    @Autowired
    private PopulationDao populationDao;

    @Test
    public void queryAll() {
        List<USPopulation> USPopulationList = populationDao.queryAll();
        if (USPopulationList != null) {
            for (USPopulation USPopulation : USPopulationList) {
                System.out.println(USPopulation.getCity() + " " + USPopulation.getPopulation());
            }
        }
    }

    @Test
    public void save() {
        populationDao.save(new USPopulation("TX", "Dallas", 66666));
        USPopulation usPopulation = populationDao.queryByStateAndCity("TX", "Dallas");
        System.out.println(usPopulation);
    }

    @Test
    public void update() {
        populationDao.save(new USPopulation("TX", "Dallas", 99999));
        USPopulation usPopulation = populationDao.queryByStateAndCity("TX", "Dallas");
        System.out.println(usPopulation);
    }


    @Test
    public void delete() {
        populationDao.deleteByStateAndCity("TX", "Dallas");
        USPopulation usPopulation = populationDao.queryByStateAndCity("TX", "Dallas");
        System.out.println(usPopulation);
    }
}

三、SpringBoot + Mybatis + Phoenix

3.1 項目結構

3.2 主要依賴

<!--spring 1.5 x 以上版本對應 mybatis 1.3.x (1.3.1)
        關於更多 spring-boot 與 mybatis 的版本對應可以參見 <a href="http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/">-->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>
<!--phoenix core-->
<dependency>
    <groupId>org.apache.phoenix</groupId>
    <artifactId>phoenix-core</artifactId>
    <version>4.14.0-cdh5.14.2</version>
</dependency>
<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。

spring:
  datasource:
    #zookeeper 地址
    url: jdbc:phoenix:192.168.0.105:2181
    driver-class-name: org.apache.phoenix.jdbc.PhoenixDriver

    # 如果不想配置對資料庫連接池做特殊配置的話,以下關於連接池的配置就不是必須的
    # spring-boot 2.X 預設採用高性能的 Hikari 作為連接池 更多配置可以參考 https://github.com/brettwooldridge/HikariCP#configuration-knobs-baby
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      # 池中維護的最小空閑連接數
      minimum-idle: 10
      # 池中最大連接數,包括閑置和使用中的連接
      maximum-pool-size: 20
      # 此屬性控制從池返回的連接的預設自動提交行為。預設為 true
      auto-commit: true
      # 允許最長空閑時間
      idle-timeout: 30000
      # 此屬性表示連接池的用戶定義名稱,主要顯示在日誌記錄和 JMX 管理控制臺中,以標識池和池配置。 預設值:自動生成
      pool-name: custom-hikari
      #此屬性控制池中連接的最長生命周期,值 0 表示無限生命周期,預設 1800000 即 30 分鐘
      max-lifetime: 1800000
      # 資料庫連接超時時間,預設 30 秒,即 30000
      connection-timeout: 30000
      # 連接測試 sql 這個地方需要根據資料庫方言差異而配置 例如 oracle 就應該寫成  select 1 from dual
      connection-test-query: SELECT 1

# mybatis 相關配置
mybatis:
  configuration:
    # 是否列印 sql 語句 調試的時候可以開啟
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3.4 新建查詢介面

上面 Spring+Mybatis 我們使用了 XML 的方式來寫 SQL,為了體現 Mybatis 支持多種方式,這裡使用註解的方式來寫 SQL。

@Mapper
public interface PopulationDao {

    @Select("SELECT * from us_population")
    List<USPopulation> queryAll();

    @Insert("UPSERT INTO us_population VALUES( #{state}, #{city}, #{population} )")
    void save(USPopulation USPopulation);

    @Select("SELECT * FROM us_population WHERE state=#{state} AND city = #{city}")
    USPopulation queryByStateAndCity(String state, String city);


    @Delete("DELETE FROM us_population WHERE state=#{state} AND city = #{city}")
    void deleteByStateAndCity(String state, String city);
}

3.5 單元測試

@RunWith(SpringRunner.class)
@SpringBootTest
public class PopulationTest {

    @Autowired
    private PopulationDao populationDao;

    @Test
    public void queryAll() {
        List<USPopulation> USPopulationList = populationDao.queryAll();
        if (USPopulationList != null) {
            for (USPopulation USPopulation : USPopulationList) {
                System.out.println(USPopulation.getCity() + " " + USPopulation.getPopulation());
            }
        }
    }

    @Test
    public void save() {
        populationDao.save(new USPopulation("TX", "Dallas", 66666));
        USPopulation usPopulation = populationDao.queryByStateAndCity("TX", "Dallas");
        System.out.println(usPopulation);
    }

    @Test
    public void update() {
        populationDao.save(new USPopulation("TX", "Dallas", 99999));
        USPopulation usPopulation = populationDao.queryByStateAndCity("TX", "Dallas");
        System.out.println(usPopulation);
    }


    @Test
    public void delete() {
        populationDao.deleteByStateAndCity("TX", "Dallas");
        USPopulation usPopulation = populationDao.queryByStateAndCity("TX", "Dallas");
        System.out.println(usPopulation);
    }

}

附:建表語句

上面單元測試涉及到的測試表的建表語句如下:

CREATE TABLE IF NOT EXISTS us_population (
      state CHAR(2) NOT NULL,
      city VARCHAR NOT NULL,
      population BIGINT
      CONSTRAINT my_pk PRIMARY KEY (state, city));
      
-- 測試數據
UPSERT INTO us_population VALUES('NY','New York',8143197);
UPSERT INTO us_population VALUES('CA','Los Angeles',3844829);
UPSERT INTO us_population VALUES('IL','Chicago',2842518);
UPSERT INTO us_population VALUES('TX','Houston',2016582);
UPSERT INTO us_population VALUES('PA','Philadelphia',1463281);
UPSERT INTO us_population VALUES('AZ','Phoenix',1461575);
UPSERT INTO us_population VALUES('TX','San Antonio',1256509);
UPSERT INTO us_population VALUES('CA','San Diego',1255540);
UPSERT INTO us_population VALUES('CA','San Jose',912332);

更多大數據系列文章可以參見 GitHub 開源項目大數據入門指南


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、數據類型 1.1 類型支持 Scala 擁有下表所示的數據類型,其中 Byte、Short、Int、Long 和 Char 類型統稱為整數類型,整數類型加上 Float 和 Double 統稱為數值類型。Scala 數值類型的取值範圍和 Java 對應類型的取值範圍相同。 | 數據類型 | 描述 ...
  • 寫這篇文章的時候,還真不知道如何取名,也不知道這個該如何將其歸類。這個是同事遇到的一個案例,案例比較複雜,這裡抽絲剝繭,僅僅構造一個簡單的案例來展現一下這個問題。我們先構造測試數據,如下所示: CREATE TABLE TEST( ID INT, GOOD_TYPE VARCHAR(12), GOO... ...
  • [tcp] nginx 七層負載均衡 nginx負載均衡概述 當我們的 Web 伺服器直接面向用戶,往往要承載大量併發請求,單台伺服器難以負荷,我使用多台 Web 伺服器組成集群,前端使用 負載均衡,將請求分散的打到我們的後端伺服器集群中,實現負載的分發。那麼會大大提升系統的吞吐率、請求性能、高容災 ...
  • 整個Flink的Job啟動是通過在Driver端通過用戶的Envirement的execute()方法將用戶的運算元轉化成StreamGraph 然後得到JobGraph通過遠程RPC將這個JobGraph提交到JobManager對應的介面 JobManager轉化成executionGraph.d ...
  • MySQL自帶的日期函數TIMESTAMPDIFF計算兩個日期相差的秒數、分鐘數、小時數、天數、周數、季度數、月數、年數,當前日期增加或者減少一天、一周等等。 相差的秒數: 相差的分鐘數: 相差的小時數: 相差的天數: 相差的周數: 相差的季度數: 相差的月數: 相差的年數: 獲取當前日期: 當前日 ...
  • numtodsinterval(<數字>,<字元串>) 字元串包含('day','hour','minute','second') select sysdate,sysdate+numtodsinterval(3,'day') as res from dual; --取三天後的時間 select s ...
  • ​ Kafka是由LinkIn開源的實時數據處理框架,目前已經更新到2.3版本。不同於一般的消息中間件,Kafka通過數據持久化和磁碟讀寫獲得了極高的吞吐量,並可以不依賴Storm,SparkStreaming的流處理平臺,自己進行實時的流處理。 ​ Kakfa的Offset機制是其最核心機制之一, ...
  • MySql學習筆記四 5.3.數據類型 1. 數值型 整型 小數 定點數 浮點數 2. 字元型 較短的文本:char, varchar 較長的文本:text, blob(較長的二進位數據) 3. 日期型 原則:所選擇類型越簡單越好,能保存數值的類型越小越好 5.3.1.數值型 5.3.1.1.整型 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...