kundera的hbase代码实现

一、介绍什么是Kundera 和JPA
1. kundera是一个兼容jpa接口的对象映射器。当前kundera支持的数据库有:

      Cassandra,MongoDB,HBase,Redis,OracleNoSQL,Neo4j,CouchDB,Dudu,Relational databases,Apache Spark

2.  JPA是Java Persistence API的简称,也叫java持久层api,是jdk5.0注释或者xml描述对象关系表的映射关系,并将运行期的实体对象持久化到数据库中。

二、为什么使用kundera操作hbase api
hbase虽然提供丰富的api,但使用起来很少不方便,过多的创建hbase封装对象,导致使用者使用起来很是不方便,但有了kundera我们就会感到什么是幸福,他的语法有点像hibernate的hql语句,完全面向对象的操作

三、kundera的特性
1. 一个健壮的查询系统

2. 简单的对象/关系映射

3. 支持二级缓存和基于事件的数据处理

4. 优化数据存储

5. 持久化连接池和基于Lucene的索引

四、kundera工程环境搭建

eclipse + maven + jdk1.8+hadoop2.7.6+hbase1.4.9+kundera3.12

1,创建maven项目 mykunderaproject

2. 在maven的pom文件中添加依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.kundera</groupId>
  <artifactId>mykunderaproject</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>mykunderaproject</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    
    <dependency>
	    <groupId>com.impetus.kundera.client</groupId>
	    <artifactId>kundera-hbase</artifactId>
	    <version>3.12</version>
	    <exclusions>
	    	<exclusion>
	    		<groupId>org.apache.hbase</groupId>
	    		<artifactId>hbase-client</artifactId>
	    	</exclusion>
	    	<exclusion>
	    		<groupId>org.apache.hbase</groupId>
	    		<artifactId>hbase-server</artifactId>
	    	</exclusion>
	    	<exclusion>
	    		<groupId>org.apache.hbase</groupId>
	    		<artifactId>hbase-common</artifactId>
	    	</exclusion>
	    	<exclusion>
	    		<groupId>org.apache.hadoop</groupId>
	    		<artifactId>hadoop-common</artifactId>
	    	</exclusion>
	    </exclusions>
	</dependency>
	<dependency>
    	<groupId>org.apache.hbase</groupId>
    	<artifactId>hbase-client</artifactId>
    	<version>1.2.3</version>
	</dependency>
	<dependency>
    	<groupId>org.apache.hbase</groupId>
    	<artifactId>hbase-server</artifactId>
    	<version>1.2.3</version>
	</dependency>
	<dependency>
    	<groupId>org.apache.hbase</groupId>
    	<artifactId>hbase-common</artifactId>
    	<version>1.2.3</version>
	</dependency>
	<dependency>
    	<groupId>org.apache.commons</groupId>
    	<artifactId>commons-math3</artifactId>
    	<version>3.6.1</version>
	</dependency>
	<dependency>
    	<groupId>org.xerial.snappy</groupId>
    	<artifactId>snappy-java</artifactId>
    	<version>1.1.7.2</version>
	</dependency>
	<dependency>
    	<groupId>org.apache.hadoop</groupId>
    	<artifactId>hadoop-common</artifactId>
    	<version>2.7.6</version>
	</dependency>	
	
  </dependencies>
</project>

3. 接下来就是关键一步把maven项目改成jpa项目

有些版本的eclipse没有jpa的插件,需要通过eclipse的help-->Eclipse Marketplace里搜索jpa进行安装重启后才会有jpa的功能,安装过程比较慢,请耐心等待,重启后然后再进行配置。如果有就直接跳过进行配置。

      1). 右键点击项目找到configure选项
      2). 他会列出很多选项点击 convert to jpa perject

      3). 直接点击finish就行了

 4. 创建后他会在src目录下创建一个META-INF目录生成一个persistence.xml文件

编写代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
	<persistence-unit name="mykunderaproject">
		<provider>com.impetus.kundera.KunderaPersistence</provider>
		<class>com.kundera.mykunderaproject.Emp</class>
		<properties>
		<!-- 配置zookeeper节点服务器ip,任意一个zookeeper节点 -->
			<property name="kundera.nodes" value="192.168.2.11"/>
			 <!-- 配置zookeeper rpc 连接端口 -->
			<property name="kundera.port" value="2181"/>
			<!-- 配置hbase名字空间和表内容 -->
			<property name="kundera.keyspace" value="ns1:emp"/>
			<!-- 配置hbase方言 -->
			<property name="kundera.dialect" value="hbase"/>
			<!-- 配置hbase依赖类 -->
			<property name="kundera.client.lookup.class" value="com.impetus.client.hbase.HBaseClientFactory"/>
		</properties>
	</persistence-unit>
</persistence>

5. 编写实体类也就是上面的配置映射文件persistence.xml里的类ns1:emp

我这里创建一个emp类,里面简单的写入几个属性加上相应的注解,他是和hbase的表一一对应的 

package com.kundera.mykunderaproject;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
//jpa规范
//使用entity注解表示他是hbase映射的类
@Entity
//指定hbase表中的列族
@Table(name="f1")
public class Emp {
//指定rowkey
	@Id
	private String id;
//指定列
	@Column
	private String name;
//指定列
	@Column
	private int age;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	public String toString(){
		return id+","+name+","+age;
	}
	
}

6. hbase中创建ns1:emp表

hbase(main)>create 'ns1:emp','f1'

0 row(s) in 2.6650 seconds

7.编程代码实现:

package com.kundera.mykunderaproject;

import java.text.DecimalFormat;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

import org.junit.Test;

public class TestCrud {
    /**
     * insert
     */
    @Test
    public void insert(){
        DecimalFormat df=new DecimalFormat("000");
        EntityManagerFactory emf=Persistence.createEntityManagerFactory("mykunderaproject");
        EntityManager em = emf.createEntityManager();
        for(int i=1;i<=100;i++){
            Emp e=new Emp();
            e.setId("row"+df.format(i));
            e.setName("tom");
            e.setAge(i%20);
            em.persist(e);
        }
        em.close();
    }
    
    /**
     * delete
     */
    @Test
    public void delete(){
        EntityManagerFactory emf=Persistence.createEntityManagerFactory("mykunderaproject");
        EntityManager em = emf.createEntityManager();
        Emp e=new Emp();
        e.setId("row001");
        e.setName("tom");
        em.remove(e);
        em.close();
    }

    
    /**
     * find===get
     */
    @Test
    public void findByRowKey(){
        EntityManagerFactory emf=Persistence.createEntityManagerFactory("mykunderaproject");
        EntityManager em = emf.createEntityManager();
        Emp e=em.find(Emp.class, "row008");
        System.out.print(e.getName()+","+e.getAge());
    }
    
    /**
     * findALL JPA JPQL
     * 面向对象的查询语言,使用类名和属性名
     */
    @Test
    public void findAll(){
        EntityManagerFactory emf=Persistence.createEntityManagerFactory("mykunderaproject");
        EntityManager em = emf.createEntityManager();
        Query q=em.createQuery("select e from Emp e");
        List<Emp> list =q.getResultList();
        for(Emp e : list)
        System.out.println(e);
    }
}
 

运行代码即可进行插入、删除、查询操作。

猜你喜欢

转载自blog.csdn.net/nengyu/article/details/87898810