一、介绍什么是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 perject3). 直接点击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);
}
}
运行代码即可进行插入、删除、查询操作。