cassandra數據庫使用(三)–使用java進行數據基本操作

cassandra數據庫使用(三)–使用java進行數據基本操作

一、簡介

在這節,將介紹使用cassandra的java客戶端 datastax 進行數據操作。

二、開發步驟

2.1 添加maven依賴

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.32</version>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.6</version>
</dependency>

<dependency>
    <groupId>com.datastax.cassandra</groupId>
    <artifactId>cassandra-driver-core</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
    <groupId>com.datastax.cassandra</groupId>
    <artifactId>cassandra-driver-mapping</artifactId>
    <version>3.5.0</version>
</dependency>
<dependency>
    <groupId>com.datastax.cassandra</groupId>
    <artifactId>cassandra-driver-extras</artifactId>
    <version>3.5.0</version>
</dependency>

2.2 定義示例對象SchoolCas.java 和StuObj.java

SchoolCas.java對象如下:

public class SchoolCas {
    private String schoolId;
    private String schoolName;
    public SchoolCas() {
    }
    public SchoolCas(String schoolId, String schoolName) {
        this.schoolId = schoolId;
        this.schoolName = schoolName;
    }
    public String getSchoolId() {
        return schoolId;
    }
    public void setSchoolId(String schoolId) {
        this.schoolId = schoolId;
    }
    public String getSchoolName() {
        return schoolName;
    }
    public void setSchoolName(String schoolName) {
        this.schoolName = schoolName;
    }
}

StuObj.java對象如下:

import com.alibaba.fastjson.annotation.JSONField;
import org.apache.commons.lang3.builder.ToStringBuilder;

import java.util.Date;
import java.util.List;
import java.util.Set;

public class StuObj {
    private Integer stuId;
    private String stuName;
    private List<String> teacherList;
    private Set<String> courseSet;
    private SchoolCas school;

    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;

    public StuObj() {
    }

    public Integer getStuId() {
        return stuId;
    }

    public void setStuId(Integer stuId) {
        this.stuId = stuId;
    }

    public String getStuName() {
        return stuName;
    }

    public void setStuName(String stuName) {
        this.stuName = stuName;
    }

    public List<String> getTeacherList() {
        return teacherList;
    }

    public void setTeacherList(List<String> teacherList) {
        this.teacherList = teacherList;
    }

    public Set<String> getCourseSet() {
        return courseSet;
    }

    public void setCourseSet(Set<String> courseSet) {
        this.courseSet = courseSet;
    }

    public SchoolCas getSchool() {
        return school;
    }

    public void setSchool(SchoolCas school) {
        this.school = school;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this);
    }
}

2.3 數據的增刪改查操作,具體如下(解釋請看註釋):

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.datastax.driver.core.*;
import com.datastax.driver.core.querybuilder.*;
import com.dragon.study.cassandra.bean.StuObj;
import com.google.common.reflect.TypeToken;
import org.apache.commons.lang3.time.DateFormatUtils;

import java.util.*;

public class CassandraPaperMain {
    public static void main(String[] args) {
        //機器地址
        String[] hosts = new String[]{"192.168.0.1"};
        //端口
        int port = 9042;
        //keyspace
        String keyspace = "key_space_1";
        //table
        String table = "stu";

        Cluster cluster = Cluster.builder().addContactPoints(hosts).withPort(port).build();
        //創建會話
        Session session = cluster.connect(keyspace);

        /////////////////// 操作方式一  直接執行cql語句 (在此僅以查詢爲例) /////////////
        //查詢
        String queryCql = "select * from stu where stu_id=?";
        BoundStatement boundStatement = session.prepare(queryCql).bind(1);
        ResultSet rs = session.execute(boundStatement);
        rs.forEach(row -> {
            System.out.println(row);
        });
        /////////////////////////////////////////////////////////////////////////

        /////////////////////////////////// 操作方式二  使用datastax的工具類 /////////////
        Map<String, String> school = new HashMap<>();
        school.put("schoolId", "001");
        school.put("schoolName", "第一中學");
        List<String> teacherList = Arrays.asList("張教師", "李教師");
        Set<String> courseSet = new HashSet<>(Arrays.asList("語文", "英語"));

        //插入
        Insert insert = QueryBuilder.insertInto(keyspace, table)
                .value("stu_id", 24)
                .value("stu_name", "orange23")
                .value("school", school)
                .value("teacher_list", teacherList)
                .value("course_set", courseSet)
                .value("create_time", new Date());
        session.execute(insert);

        //更新
        Update update = QueryBuilder.update(keyspace, table);
        update.with(QueryBuilder.set("stu_name", "orange22"));
        update.with(QueryBuilder.set("stu_age", 22));
        update.where(QueryBuilder.eq("stu_id", 22));
        session.execute(update);

        //查詢所有
        Select select = QueryBuilder.select().from(keyspace, table);
        ResultSet selectRs = session.execute(select);

        List<StuObj> list = new ArrayList<>(); //將查詢結果轉爲對象
        selectRs.forEach(r -> {
            list.add(rowToObj(r, StuObj.class));
        });
        System.out.println(list);

        List<ColumnDefinitions.Definition> colDefList = rs.getColumnDefinitions().asList(); //獲取列字段定義
        colDefList.forEach(d -> {
            System.out.println(d.getType());
            System.out.println(d.getName());
            System.out.println(d.getClass());
            System.out.println(d.getType());

        });

        rs.forEach(System.out::println);
        rs.forEach(row -> {
            //獲取單個屬性值
            String stuName = row.get("stu_name", String.class);
            System.out.println(stuName);

            //獲取list類型
            List<String> tList = row.getList("teacher_list", String.class);
            System.out.println(JSON.toJSONString(tList));

            //獲取set類型
            Set<String> cSet = row.getSet("course_set", String.class);
            System.out.println(JSON.toJSONString(cSet));

            //獲取map類型
            Map<String, String> map = row.getMap("school", TypeToken.of(String.class), TypeToken.of(String.class));
            System.out.println(JSON.toJSONString(map));

        });

        //刪除
        Delete delete = QueryBuilder.delete().from(keyspace, table);
        delete.where(QueryBuilder.eq("stu_id", 1));
        session.execute(delete);

        //指量操作
        BatchStatement batchStatement = new BatchStatement();
        batchStatement.add(insert);
        batchStatement.add(delete);
        session.execute(batchStatement);
        cluster.close();
    }

    //row轉對java對象(藉助json)
    public static <T> T rowToObj(Row row, Class<T> clazz) {
        JSONObject obj = new JSONObject();
        row.getColumnDefinitions().forEach(d -> {
            Object o = row.getObject(d.getName());
            //時間類型特殊處理
            o = o instanceof Date ? DateFormatUtils.format((Date) o, "yyyy-MM-dd HH:mm:ss") : o;
            obj.put(d.getName(), o);
        });
        return obj.toJavaObject(clazz);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章