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地址,可以看到控制檯打印出的日誌如下:
早年同窗始相知,三載瞬逝情卻萌。年少不知愁滋味,猶讀紅豆生南國。別離方知相思苦,心田紅豆根以生。