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>