Hbase期末小项目,结合之前学习的Java基础;通过API对Hbase *** 作,结合JAVAWeb将结果展示于页面上,通过页面按钮实现增删改查功能。
项目用到的技术1.Hbase基础知识,增删改查,以及API *** 作
2.JAVAWeb基础知识,了解前后端数据如何传输,何种形式
3.一定的HTML前端基础和Javascript基础
4.AJAX前后端数据交互
项目目录结构hbase里面包括Hbase的工具类HbseUtil以及实体类HbaseDemo
具体实现过程 Hbase *** 作 Hbase表结构后端java代码
// 添加数据 public void add(String rowkey, String name, String type, String place, String price, String weight) throws Exception { //调用HbaseUtil工具类 boolean r1=HbaseUtil.Insert_Data(tablename,rowkey,"info1","name",name); boolean r2=HbaseUtil.Insert_Data(tablename,rowkey,"info1","type",type); boolean r3=HbaseUtil.Insert_Data(tablename,rowkey,"info2","place",place); boolean r4=HbaseUtil.Insert_Data(tablename,rowkey,"info2","price",price); boolean r5=HbaseUtil.Insert_Data(tablename,rowkey,"info2","weight",weight); if(r1&&r2&&r3&r4&r5){ System.out.println("添加成功!"); } else{ System.out.println("添加失败"); } }Hbase实现删除功能
后端Java代码
//删除整行数据 public void delete_all(String rowkey) throws IOException { boolean r = HbaseUtil.Exec_DelData(tablename,rowkey); } // 删除一行数据的某列,如name列等 public void delete_column(String rowkey, String column) throws IOException { if (column.equals("name") || column.equals("type")){ boolean r = HbaseUtil.Exec_DelData(tablename, rowkey, "info1",column); } if (column.equals("place") || column.equals("price") || column.equals("weight")){ boolean r2 = HbaseUtil.Exec_DelData(tablename, rowkey,"info2",column); } }Hbase实现修改功能
Hbase修改可以直接调用增加函数,产生新的时间戳,相当于修改
Hbase实现查询功能主要应用Hbase的过滤器实现各种查询
比如查询行键以XXX开头的数据
// 查询行键以**开头数据 public Listget_byrowkey1(String str) throws IOException { //创建scan扫描对象 Scan scan = new Scan(); //设置过滤器 Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL, new BinaryPrefixComparator(Bytes.toBytes(str))); //为scan对象设置过滤器 scan.setFilter(filter); //表对象实列化 Table table=HbaseUtil.GetConnection().getTable(TableName.valueOf(tablename)); //结果集 ResultScanner results=table.getScanner(scan); //查询到的数据不止一个,存放到列表中 List mylist = new ArrayList<>(); for (Result result : results){ Cell[] cells = result.rawCells(); //将结果转换为JSON格式,方面后续javaweb *** 作 JSONObject object = new JSONObject(); for (Cell cell : cells){ object.put(Bytes.toString(CellUtil.cloneQualifier(cell)),Bytes.toString(CellUtil.clonevalue(cell))); object.put("rowkey",Bytes.toString(CellUtil.cloneRow(cell))); } mylist.add(object); } return mylist; }
多个过滤器结合查询
如查询姓名是XXX,产地为XXX的数据
// 查询name为XXX,产地为XXX数据 public Listselect_two(String value1, String value2) throws IOException { Scan scan = new Scan(); SingleColumnValueFilter singleColumnValueFilter1 = new SingleColumnValueFilter(Bytes.toBytes("info1"), Bytes.toBytes("name"), CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes(value1))); SingleColumnValueFilter singleColumnValueFilter2 = new SingleColumnValueFilter(Bytes.toBytes("info2"), Bytes.toBytes("place"), CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes(value2))); ArrayList filters = new ArrayList<>(); filters.add(singleColumnValueFilter1); filters.add(singleColumnValueFilter2); // 多个过滤器用集合存放 // And关系MUST_PASS_ALL OR关系MUST_PASS_ONE Filter filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL,filters); // 为scan设置过滤器 scan.setFilter(filterList); Table table=HbaseUtil.GetConnection().getTable(TableName.valueOf(tablename)); ResultScanner results=table.getScanner(scan); List mylist = new ArrayList<>(); for (Result result : results){ Cell[] cells = result.rawCells(); JSONObject object = new JSONObject(); for (Cell cell : cells){ object.put(Bytes.toString(CellUtil.cloneQualifier(cell)),Bytes.toString(CellUtil.clonevalue(cell))); object.put("rowkey",Bytes.toString(CellUtil.cloneRow(cell))); } mylist.add(object); } return mylist; }
其他查询用过滤器均可实现,将数据结果转换为JSON格式,方面后端数据通过AJAX传输
Serverlet *** 作 增加功能//前后端交互的路径 @WebServlet("/add") public class AddServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 接收前端发送过来的数据,获取请求体数据 BufferedReader reader = req.getReader(); // 读一行,只有一行 String params = reader.readLine(); // JSON字符串转java对象(JSONObject对象) JSONObject object = JSON.parseObject(params); String rowkey = object.getString("rowkey"); String name = object.getString("name"); String type = object.getString("type"); String place = object.getString("place"); String price = object.getString("price"); String weight = object.getString("weight"); // 实现HbaseDemo实体类 *** 作Hbase数据库 HbaseDemo hbaseDemo = new HbaseDemo(); try { hbaseDemo.add(rowkey,name,type,place,price,weight); // 响应成功标识 resp.getWriter().write("success"); } catch (Exception e) { e.printStackTrace(); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //执行post请求时也调用doGet方法 this.doGet(req,resp); } }
前端HTML页面
删除功能Title
(删除整行)
@WebServlet("/delete_all") public class DeleteAllServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String rowkey = req.getParameter("rowkey"); HbaseDemo hbaseDemo = new HbaseDemo(); hbaseDemo.delete_all(rowkey); // 请求转发到hbase.html页面,由下一个Servlet完成响应体,当前Servlet可以设置响应头(留头不留体) req.getRequestDispatcher("/hbase.html").forward(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req,resp); } }
前端HTML页面(全表查询到的数据和删除为同一界面)
删除时前端url直接携带一个参数rowkey,后端接收到rowkey,根据rowkey进行删除
修改功能Title
rowkey name type place price weight *** 作 000 000 000 000 000 000 修改 删除全部 删除一列 000 000 000 000 000 000 修改
@WebServlet("/selectByrowkey") public class ChangeServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //接收rowkey,req.getParameter()切割字符串,按照and、=切割 String rowkey = req.getParameter("rowkey"); //调用查询 HbaseDemo hbaseDemo = new HbaseDemo(); JSONObject brand = hbaseDemo.change(rowkey); // 储存到request域中 req.setAttribute("rowkey",brand.getString("rowkey")); req.setAttribute("name",brand.getString("name")); req.setAttribute("type",brand.getString("type")); req.setAttribute("place",brand.getString("place")); req.setAttribute("price",brand.getString("price")); req.setAttribute("weight",brand.getString("weight")); // 转发到change.jsp req.getRequestDispatcher("/change.jsp").forward(req,resp); // 响应成功标识 resp.getWriter().write("success"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req,resp); } }
前端JSP页面(需要改进的地方,没有用HTML页面实现)
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%--加上这句才能获得request域中数据--%> <%@page isELIgnored="false" %>查询功能修改信息 修改信息
查询行键是XXX开头的数据
@WebServlet("/get_byrowkey1") public class Get_byrowkey1Servlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { BufferedReader reader = req.getReader(); String params = reader.readLine(); JSONObject object = JSON.parseObject(params); String str = object.getString("rowkey1"); HbaseDemo hbaseDemo = new HbaseDemo(); Listmylist = hbaseDemo.get_byrowkey1(str); String jsonString = JSON.toJSONString(mylist); resp.setContentType("text/json;charset=utf-8"); resp.getWriter().write(jsonString); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req,resp); } }
前端HTML页面
不足之处Title
1.修改页面回显数据展示没办法再HTML显示,所以用了JSP页面
2.分页查询时如何将页面的page和Hbase行键联系起来,因为Hbase分页,主要是传入一个起始行键和条数,而前端传输的是page参数,不能和行键联系起来,所以现在分页功能不完善
结果显示
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)