cassandra入门(三):便捷的@Accessor注解

如果说,入门二的用法是hibernate,那么这篇入门三的用法就更像ibatis。

完整的代码请参考:https://github.com/yankai913/cassandra-java-userguide。

由于本文复用了入门二的部分代码,所以这里只贴新增的。

新增表:

CREATE TABLE complex.users (
id uuid PRIMARY KEY,
name text,
addresses map<text,frozen<address>>
);

UserAccessor类:

import java.util.Map;
import java.util.UUID;

import com.datastax.driver.core.ResultSet;
import com.datastax.driver.mapping.Result;
import com.datastax.driver.mapping.annotations.Accessor;
import com.datastax.driver.mapping.annotations.Param;
import com.datastax.driver.mapping.annotations.Query;
import com.google.common.util.concurrent.ListenableFuture;
import com.zoo.Address;


@Accessor
public interface UserAccessor {

    @Query("SELECT * FROM complex.users WHERE id = ?")
    User getOnePosition(UUID userId);


    @Query("SELECT * FROM complex.users")
    Result<User> getAll();


    @Query("SELECT * FROM complex.users")
    ListenableFuture<Result<User>> getAllAsync();


    @Query("insert into complex.users(id, name, addresses) values (:id, :name, :addresses)")
    ResultSet insertUser(@Param("id") UUID id, @Param("name") String name,
            @Param("addresses") Map<String, Address> addresses);


    @Query("UPDATE complex.users SET name= :name WHERE id= :id")
    ResultSet updateName(@Param("id") UUID id, @Param("name") String name);


    @Query("UPDATE complex.users SET addresses[:name]=:address WHERE id= :id")
    ResultSet updateAddress(@Param("id") UUID id, @Param("name") String addressName,
            @Param("address") Address address);


    @Query("DELETE FROM complex.users WHERE id = ?")
    ResultSet deleteOne(UUID userId);
}

User类:


import java.util.Map;
import java.util.UUID;

import com.datastax.driver.mapping.annotations.Column;
import com.datastax.driver.mapping.annotations.Frozen;
import com.datastax.driver.mapping.annotations.Table;
import com.zoo.Address;
import com.zoo.BaseEntity;


@Table(keyspace = "complex", name = "users")
public class User extends BaseEntity {

    private UUID id;

    private String name;

    @Column(name = "addresses")
    @Frozen("map<text,frozen<address>>")
    private Map<String, Address> address;


    public UUID getId() {
        return id;
    }


    public void setId(UUID id) {
        this.id = id;
    }


    public String getName() {
        return name;
    }


    public void setName(String name) {
        this.name = name;
    }


    public Map<String, Address> getAddress() {
        return address;
    }


    public void setAddress(Map<String, Address> address) {
        this.address = address;
    }

}

BaseEntity类,就是做了toString()重写:

import com.alibaba.fastjson.JSON;


public class BaseEntity {

    @Override
    public String toString() {
        return JSON.toJSONString(this);
    }
}

测试类AccessorClient:


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.Host;
import com.datastax.driver.core.Metadata;
import com.datastax.driver.core.Session;
import com.datastax.driver.mapping.MappingManager;
import com.datastax.driver.mapping.Result;
import com.google.common.util.concurrent.ListenableFuture;
import com.zoo.Address;
import com.zoo.Phone;

/**
 * 
 * @author yankai913@gmail.com
 * @date 2015-11-4
 *
 */
public class AccessorClient {

    private Cluster cluster;
    private Session session;

    // 放一个公共userId
    private UUID userId = UUID.fromString("fbdf82ed-0063-4796-9c7c-a3d4f47b4b25");


    public Session getSession() {
        return this.session;
    }


    /**
     * 连接集群,创建执行cql的session对象。
     * 
     * @param node
     */
    public void connect(String node) {
        cluster = Cluster.builder().addContactPoint(node).build();
        Metadata metadata = cluster.getMetadata();
        System.out.printf("Connected to cluster: %s\n", metadata.getClusterName());
        for (Host host : metadata.getAllHosts()) {
            System.out.printf("Datacenter: %s; Host: %s; Rack: %s\n", host.getDatacenter(),
                host.getAddress(), host.getRack());
        }
        session = cluster.connect();
        System.out.println();
    }


    public void insert() {
        MappingManager manager = new MappingManager(getSession());
        UserAccessor userAccessor = manager.createAccessor(UserAccessor.class);
        Map<String, Address> addresses = new HashMap<String, Address>();
        Address address = new Address();
        address.setCity("Honolulu");
        address.setStreet("123 Arnold Drive");
        address.setZipCode(95476);
        List<Phone> phones = new ArrayList<Phone>();
        Phone phone1 = new Phone("job1", "10086");
        Phone phone2 = new Phone("job2", "10000");
        phones.add(phone1);
        phones.add(phone2);
        address.setPhones(phones);
        addresses.put("Work", address);
        userAccessor.insertUser(userId, "tom", addresses);
    }


    public void select() {
        // getAll
        MappingManager manager = new MappingManager(getSession());
        UserAccessor userAccessor = manager.createAccessor(UserAccessor.class);
        Result<User> users = userAccessor.getAll();
        for (User user : users) {
            System.out.println("getAll:" + user);
        }
        // getOne
        User user = userAccessor.getOnePosition(userId);
        System.out.println("getOne:" + user);
        // getAllAsync
        ListenableFuture<Result<User>> future = userAccessor.getAllAsync();
        try {
            for (User _user : future.get()) {
                System.out.println("getAsync:" + _user);
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }


    public void update() {
        MappingManager manager = new MappingManager(getSession());
        UserAccessor userAccessor = manager.createAccessor(UserAccessor.class);
        userAccessor.updateName(userId, "jack");
    }


    public void update2() {
        MappingManager manager = new MappingManager(getSession());
        UserAccessor userAccessor = manager.createAccessor(UserAccessor.class);
        Address address = new Address();
        List<Phone> phones = new ArrayList<Phone>();
        Phone phone2 = new Phone("job2", "10010");
        phones.add(phone2);
        address.setPhones(phones);
        userAccessor.updateAddress(userId, "Work", address);
    }


    public void delete() {
        MappingManager manager = new MappingManager(getSession());
        UserAccessor userAccessor = manager.createAccessor(UserAccessor.class);
        userAccessor.deleteOne(userId);
    }


    public void dropSchema() {
        session.execute("DROP KEYSPACE complex;");
    }


    public void close() {
        session.close();
        cluster.close();
    }


    public static void main(String[] args) {
        AccessorClient client = new AccessorClient();
        try {
            client.connect("127.0.0.1");
            client.select();
            client.insert();
            client.select();
            client.update();
            client.select();
            client.update2();
            client.select();
            client.delete();
            client.select();
            client.dropSchema();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            client.close();
        }
    }
}

打印结果部分显示做对比:
Connected to cluster: Test Cluster
Datacenter: datacenter1; Host: /127.0.0.1; Rack: rack1

getOne:null

getOne:{“address”:{“Work”:{“city”:”Honolulu”,”phones”:[{“alias”:”job1″,”number”:”10086″},{“alias”:”job2″,”number”:”10000″}],”street”:”123 Arnold Drive”,”zipCode”:95476}},”id”:”fbdf82ed-0063-4796-9c7c-a3d4f47b4b25″,”name”:”tom”}

getOne:{“address”:{“Work”:{“city”:”Honolulu”,”phones”:[{“alias”:”job1″,”number”:”10086″},{“alias”:”job2″,”number”:”10000″}],”street”:”123 Arnold Drive”,”zipCode”:95476}},”id”:”fbdf82ed-0063-4796-9c7c-a3d4f47b4b25″,”name”:”jack”}

getOne:{“address”:{“Work”:{“phones”:[{“alias”:”job2″,”number”:”10010″}],”zipCode”:0}},”id”:”fbdf82ed-0063-4796-9c7c-a3d4f47b4b25″,”name”:”jack”}

getOne:null

此条目发表在数据库, 编程语言分类目录,贴了, 标签。将固定链接加入收藏夹。