Phoenix JavaAPI可以在java中使用sql对HBase进行操作

配置项目环境

  1. 下载master节点中phoenix安装目录下的两个包到本地项目/phoenix中
phoenix-5.0.0-HBase-2.0-client.jar
phoenix-core-5.0.0-HBase-2.0.jar
  1. 将这两个文件添加进模块依赖中
  2. 尝试建表代码,注意: JRE版本建议为1.8

建表

建表语法为 create table tablename(column1,column2,column3),使用stmt.execute()执行

package demo;

import java.sql.*;

class PhoenixAPI {
	Connection conn = null;
	Statement stmt = null;

	PhoenixAPI() {
		try {
			Class.forName("org.apache.phoenix.jdbc.PhoenixDriver");
			conn = DriverManager.getConnection("jdbc:phoenix:master:2181/hbase","","");
			stmt = conn.createStatement();
		} catch (ClassNotFoundException | SQLException e) {
			e.printStackTrace();
		}
	}

	public void create(String tb) {
		// 注意:在Phoenix中,整数不能简写为int,而是要写为INTEGER
		String sql = "create table " + tb +
				" (id integer primary key, name varchar, age integer)";
		try {
			stmt.execute(sql); // 执行sql语句,不是事务,无需提交
			System.out.println(tb + "表 创建成功");
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public void close() {
		try {
			stmt.close();
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

public class Main {
	public static void main(String[] args) {
		PhoenixAPI phoenix = new PhoenixAPI();
		phoenix.create("test");
		phoenix.close();
	}
}

create 可以看到test表已创建成功

删除表

使用drop table tbname删除表

class PhoenixAPI {
	...

	PhoenixAPI() { ... }

	public void drop(String tb) {
		String sql = "DROP TABLE " + tb;
		try {
			stmt.execute(sql); // 执行sql语句, 无需commit
			System.out.println("表 " + tb + " 已删除");
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void close() { ... }
}

public class Main {
	public static void main(String[] args) {
		PhoenixAPI phoenix = new PhoenixAPI();
		phoenix.drop("test");
		phoenix.close();
	}
}

drop 可以看到test已被删除

查询数据

使用select * from tbname来查询数据。返回的数据会放在结果集中,可以使用迭代函数遍历所有行数据。

class PhoenixAPI {
	...

	PhoenixAPI() { ... }

	public void select(String tb) {
		String sql = "select * from " + tb;
		try {
			// executeQuery()返回结果集
			ResultSet rs = stmt.executeQuery(sql);
			// 使用next()迭代函数遍历结果集
			System.out.println("id\tname\tage");
			while (rs.next()) {
				// 打印数据,使用getType(col)获取当前行的列值
				// 这里所有列都是varchar类型,所以使用getString(col)获取
				System.out.println(rs.getString("id") + "\t"
						+ rs.getString("name") + "\t"
						+ rs.getString("age"));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void close() { ... }
}

public class Main {
	public static void main(String[] args) {
		PhoenixAPI phoenix = new PhoenixAPI();
		phoenix.select("student");
		phoenix.close();
	}
}

select

添加/修改数据

使用upsert into来添加/修改数据,upsert into tbname values(?,?,?)

package demo;

import java.sql.*;
import java.util.ArrayList;

class PhoenixAPI {
	...

	PhoenixAPI() { ... }

	public void create(String tb) { ... }

	public void upsert(String tb) {
		ArrayList<String> dataList = new ArrayList<>();
		dataList.add("upsert into " + tb + " values(1,'zhangsan',11)");
		dataList.add("upsert into " + tb + " values(2,'lisi',22)");
		dataList.add("upsert into " + tb + " values(999,'wangwu',33)");
		for (String sql : dataList) {
			try {
				stmt.execute(sql);
				conn.commit();
				System.out.println("插入数据成功");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	public void close() { ... }
}

public class Main {
	public static void main(String[] args) {
		PhoenixAPI phoenix = new PhoenixAPI();
		phoenix.create("student");
		phoenix.upsert("student");
		phoenix.close();
	}
}

upsert

删除数据

使用delete from tbname where id=?来删除数据

class PhoenixAPI {
	...

	PhoenixAPI() { ... }

	public void delete(String tb, String id) {
		String sql = "DELETE FROM " + tb + " WHERE id = " + id;
		try {
			stmt.execute(sql); // 执行sql语句, 需commit
			conn.commit(); // 提交事务
			System.out.println("删除成功");
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void close() { ... }
}

public class Main {
	public static void main(String[] args) {
		PhoenixAPI phoenix = new PhoenixAPI();
		phoenix.delete("student", "999");
		phoenix.close();
	}
}

delete 相比上面,已删除。