返回 导航

SpringBoot / Cloud

hangge.com

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

作者:hangge | 2020-09-16 08:10
    借助 Apache Phoenix,我们可以使用标准 SQLJDBC 接口来操作 HBase。前文演示了 Spring Boot 项目使用 JdbcTemplate 来操作 HBase 数据库,本文接着演示使用 MyBatis 来操作 HBase 数据库。

三、使用 MyBatis 操作 HBase

1,准备工作

(1)同前文一样,服务器除了要安装 HBase 外,还需要安装 Phoenix,具体参考我之前写的文章:

(2)执行下面命令创建一个名为 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:192.168.60.133:2181

3,编写代码

(1)首先创建数据表对应的 Student 实体类:
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Student {
    private String id;
    private String name;
    private String age;
}

(2)创建对应的 User 实体类:
@Setter
@Getter
@NoArgsConstructor
@ToString
public class User {
    private Integer id;
    private String userName;
    private String passWord;
}


(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 文件,内容如下:
代码说明:
  • 针对 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 地址,可以看到控制台打印出的日志如下:
评论

全部评论(0)

回到顶部