← 返回首页
HBase基础教程(二十一)
发表时间:2023-04-27 06:47:11
Phoenix整合mybatis-plus操作

Phoenix整合mybatis-plus操作

1.项目结构图

2.添加依赖

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <fastjson.version>1.2.58</fastjson.version>
        <devtools.version>2.6.13</devtools.version>
        <mybatis-plus.version>3.3.1</mybatis-plus.version>
        <maxvision-core.version>1.0.0</maxvision-core.version>
        <common-lang.version>3.9</common-lang.version>
        <surefire.version>2.22.2</surefire.version>
        <phoenix.version>4.13.1-HBase-1.2</phoenix.version>
        <protobuf.version>3.5.1</protobuf.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis-plus.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>3.1.1</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--phoenix core-->
        <dependency>
            <groupId>org.apache.phoenix</groupId>
            <artifactId>phoenix-core</artifactId>
            <version>4.13.1-HBase-1.2</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!--测试-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- json操作-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
        </dependency>

        <!--熱部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <version>${devtools.version}</version>
            <optional>true</optional>
        </dependency>

        <!-- commons-lang3 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>${common-lang.version}</version>
        </dependency>
    </dependencies>

3.设置配置文档

application.yml

auth.name: simoniu #开发者姓名
application:
  version: 1.0  #开发者版本号
  formatted-version: V${application.version}

spring:
  application:
    name: springboot-phoenix    #应用名称
  profiles:
    include:
      - dev                     # 使用的配置环境(dev:开发  test:测试 pro:生产环境)

  mvc:
    favicon:
      enabled: false # 关闭默认的icon

  datasource:
    #数据库连接信息
    url: jdbc:phoenix:hadoop-master:2181
    #url: jdbc:phoenix:thin:url=http://192.168.2.177:8765;serialization=PROTOBUF
    username:
    password:
      #driver-class-name: org.apache.phoenix.queryserver.client.Driver
      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

  #热部署开启
  devtools:
    restart:
      enabled: true

#mybatis-plus
mybatis-plus:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.simoniu.hbase.phoenixmybatis.entity
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 是否打印sql语句 调试的时候可以开启

#日志配置
logging:
  config:
    classpath: logback-spring.xml
  level:
    root: info
    com.boot.phoenix.dao: debug  #打印sql

application-dev.yml

#设置端口号
server.port: 8088

4.在resource目录里添加hbase-site.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <property>
        <name>hbase.rootdir</name>
        <value>hdfs://hadoop-master:9000/hbase</value>
    </property>
    <property>
        <name>hbase.cluster.distributed</name>
        <value>true</value>
    </property>
    <property>
        <name>hbase.zookeeper.quorum</name>
        <value>hadoop-master:2181</value>
    </property>
    <property>
        <name>hbase.zookeeper.property.clientPort</name>
        <value>2181</value>
    </property>
    <property>
        <name>hbase.regionserver.handler.count</name>
        <value>20</value>
    </property>
    <property>
        <name>hbase.master</name>
        <value>60000</value>
    </property>

    <property>
        <name>hbase.unsafe.stream.capability.enforce</name>
        <value>false</value>
    </property>
    <property>
        <name>hbase.wal.provider</name>
        <value>filesystem</value>
    </property>
    <property>
        <name>hbase.coprocessor.abortonerror</name>
        <value>false</value>
    </property>

    <property>
        <name>hbase.regionserver.wal.codec</name>
        <value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
    </property>

    <property>
        <name>phoenix.schema.isNamespaceMappingEnabled</name>
        <value>true</value>
    </property>
    <property>
        <name>phoenix.schema.mapSystemTablesToNamespace</name>
        <value>true</value>
    </property>
</configuration>

5.添加实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Students {
    @TableId(type = IdType.AUTO)
    private Integer sid;
    private String sname;
    private Integer age;
    private String gender;
}

6.添加Mapper接口

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.simoniu.hbase.phoenixmybatis.entity.Students;
import java.util.List;

public interface StudentsMapper {
    List<Students> selects();
    void upsert(Students s);
    IPage<Students> page(IPage<Students> page);
}

7.实现Service层

StudentsService.java


public interface StudentsService {
    List<Students> selectAll();
    IPage<Students> page(Integer page, Integer size);
    boolean saveStudent(Students s);
}

StudentsServiceImpl.java


@Service
public class StudentsServiceImpl implements StudentsService {
    @Resource
    private StudentsMapper studentsMapper;
    @Override
    public List<Students> selectAll() {
        return studentsMapper.selects();
    }
    @Override
    public IPage<Students> page(Integer page, Integer size) {
        IPage<Students> ipage = new Page<>(page, size);
        return studentsMapper.page(ipage);
    }
    @Override
    public boolean saveStudent(Students s) {
        try {
            studentsMapper.upsert(s);
            return true;
        } catch (Exception ex) {
            ex.printStackTrace();
            return false;
        }
    }
}

8.编写测试类


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

    @Resource
    private StudentsService studentsService;

    @Test
    public void testSelectAll() {
        List<Students> studentsList = studentsService.selectAll();
        studentsList.forEach(System.out::println);
    }
    @Test
    public void testSaveStudent() {
        Students s = new Students();
        s.setSid(105);
        s.setSname("李四四");
        s.setAge(23);
        s.setGender("女");
        boolean flag = studentsService.saveStudent(s);
        Assert.isTrue(flag, "");
    }
}

运行结果:

JDBC Connection [HikariProxyConnection@469383315 wrapping org.apache.phoenix.jdbc.PhoenixConnection@70f85235] will not be managed by Spring
==>  Preparing: UPSERT INTO STUDENTS(SID, SNAME, AGE ,GENDER) VALUES( ?, ?, ?, ? ) 
==> Parameters: 106(Integer), 刘备(String), 65(Integer), 男(String)
<==    Updates: 1


JDBC Connection [HikariProxyConnection@176436106 wrapping org.apache.phoenix.jdbc.PhoenixConnection@4070ace9] will not be managed by Spring
==>  Preparing: select * from STUDENTS 
==> Parameters: 
<==    Columns: SID, SNAME, AGE, GENDER
<==        Row: 100, Tom, 18, 男
<==        Row: 101, Jerry, 16, 女
<==        Row: 102, Jackson, 20, 男
<==        Row: 103, 张三, 22, 男
<==        Row: 105, 李四四, 23, 女
<==        Row: 106, 刘备, 65, 男
<==      Total: 6

注意事项:

如果项目启动后,报以下异常:

...
Connection refused: no further information

有可能是虚拟机的hosts IP配置不正确。

vim /etc/hosts

#127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
#127.0.0.1  hadoop-master

#一定要把这句注释掉
#192.168.2.177  localhost
192.168.2.177  hadoop-master

并且检查 /usr/local/phoenix/bin 下的hbase-site.xml里是否配置正确。

<configuration>
  <property>
    <name>hbase.regionserver.wal.codec</name>
    <value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
  </property>

  <property>
    <name>phoenix.schema.isNamespaceMappingEnabled</name>
    <value>true</value>
  </property>
  <property>
    <name>phoenix.schema.mapSystemTablesToNamespace</name>
    <value>true</value>
  </property>
  <property>
    <name>hbase.zookeeper.quorum</name>
    <value>192.168.2.177</value>
  </property>
  <property>
    <name>hbase.zookeeper.property.clientPort</name>
    <value>2181</value>
  </property>  
</configuration>