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);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章