1. 程式人生 > 其它 >SpringBoot - 使用Phoenix操作HBase教程3(使用MyBatis)

SpringBoot - 使用Phoenix操作HBase教程3(使用MyBatis)

藉助Apache Phoenix,我們可以使用標準SQL和JDBC介面來操作HBase。前文演示了Spring Boot專案使用JdbcTemplate來操作HBase資料庫,本文接著演示使用MyBatis來操作HBase資料庫。

三、使用 MyBatis 操作 HBase

(1)執行下面命令建立一個名為student的表:

注意:在phoenix中,預設情況下,庫名,表名,欄位名等會自動轉換為大寫,若要小寫,使用雙引號,如"student"。

CREATE TABLE IF NOT EXISTS "student"(
id VARCHAR primary key,
name VARCHAR
, age VARCHAR);

2,專案配置

(1)首先編輯專案的pom.xml檔案,除了新增Phoenix相關依賴外,還新增MyBatis依賴(高亮部分):
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <!-- 去掉springboot預設日誌配置 
--> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <!--
引入log4j2依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> <!-- 引入lombok依賴 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.6</version> </dependency> <!-- MyBatis依賴 --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> <!-- phoenix相關依賴配置 --> <dependency> <groupId>org.apache.phoenix</groupId> <artifactId>phoenix-core</artifactId> <version>5.0.0-HBase-2.0</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> <exclusion> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> </exclusion> <exclusion> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.9.2</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> <exclusion> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.3</version> </dependency> </dependencies>

(2)接著在application.properties中配置資料庫連線資訊:

spring.datasource.driverClassName=org.apache.phoenix.jdbc.PhoenixDriver
spring.datasource.url=jdbc:phoenix:81.68.xx.xx:2181

yml版本

spring:
    datasource:
        driverClassName:org.apache.phoenix.jdbc.PhoenixDriver
        url:jdbc:phoenix:81.68.xx.xx:2181

3,編寫程式碼

(1)首先建立資料表對應的Student實體類:
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Student {
    private String id;
    private String name;
    private String age;
}

(3)接著建立StudentMapper介面:

要指明一個類是Mapper有如下兩種方式:

一種如本樣例所示,在StudentMapper上新增@Mapper註解,表明該介面是一個MyBatis中的Mapper。這種方式就是需要在每一個Mapper上都添加註解。

另一種更簡單的方式是在配置類上新增@MapperScan("com.example.demo.mapper")註解,表示掃描com.example.demo.mapper包下的所有介面作為Mapper。這樣就不需要在每個介面上配置@Mapper註解了。

@Mapper
public interface StudentMapper {
    int upsertStudent(Student student);
    int deleteStudentById(String id);
    Student getStudentById(String id);
    List<Student> getAllStudents();
}

(4)接著在StudentMapper相同的位置建立StudentMapper.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.example.phoenixdemo.mapper.StudentMapper">
    <update id="upsertStudent" parameterType="com.example.phoenixdemo.model.Student">
        UPSERT INTO "student" VALUES (#{id}, #{name}, #{age})
    </update>
    <delete id="deleteStudentById" parameterType="String">
        DELETE FROM "student" WHERE id=#{id}
    </delete>
    <select id="getStudentById" parameterType="String" resultType="com.example.phoenixdemo.model.Student">
        SELECT * FROM "student" WHERE id=#{id}
    </select>
    <select id="getAllStudents" resultType="com.example.phoenixdemo.model.Student">
        SELECT * FROM "student"
    </select>
</mapper>

(5)由於在Maven工程中,XML配置檔案建議寫在resources目錄下,但上面的StudentMapper.xml檔案寫在包下,Maven在執行時會忽略包下的XML檔案。因此需要在pom.xml檔案中重新指明資原始檔位置,配置如下:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
    <!-- 重新指明資原始檔位置 -->
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
    </resources>
</build>

(6)最後我們在Controller中通過呼叫StudentMapper進行資料的增、刪、改、查操作。

@RestController
public class HelloController {
 
    @Autowired
    StudentMapper studentMapper;
 
    @GetMapping("/test")
    public void test() {
 
        // 插入資料
        System.out.println("\n--- 開始插入資料 ---");
        studentMapper.upsertStudent(new Student("1001","大劉","20"));
        studentMapper.upsertStudent(new Student("1002","小星","22"));
        studentMapper.upsertStudent(new Student("1003","hangge","100"));
 
        // 刪除資料
        System.out.println("\n--- 開始刪除資料 ---");
        studentMapper.deleteStudentById("1002");
 
        // 查詢資料
        System.out.println("\n--- 查詢單條資料 ---");
        Student student = studentMapper.getStudentById("1001");
        System.out.println(student);
 
        System.out.println("\n--- 查詢多條資料 ---");
        List<Student> list = studentMapper.getAllStudents();
        System.out.println(list);
    }
}

4,執行測試

在瀏覽器中訪問http://localhost:8080/test地址,可以看到控制檯打印出的日誌如下:

早年同窗始相知,三載瞬逝情卻萌。年少不知愁滋味,猶讀紅豆生南國。別離方知相思苦,心田紅豆根以生。