驱动下载

  创建maven工程,让maven来维护我们的jar,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.huawei</groupId><artifactId>cassandra</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>cassandra</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>com.datastax.cassandra</groupId><artifactId>cassandra-driver-core</artifactId><version>2.1.10.3</version></dependency></dependencies>
</project>

Session获取

  官方给的Quick start案例

Cluster cluster = null;try {cluster = Cluster.builder()                                                    // (1).addContactPoint("127.0.0.1")                                 // cassandra服务器ip.withCredentials("admin", "admin")                                     // 若没有启用账号认证,此处可以去掉.build();Session session = cluster.connect();                                           // (2)ResultSet rs = session.execute("select release_version from system.local");    // (3)Row row = rs.one();System.out.println(row.getString("release_version"));                          // (4)} finally {if (cluster != null) cluster.close();                                          // (5)}

  代码中的(1) ~ (5)分别表示或者代表什么

    (1):Cluster对象是驱动程序的主入口点,它保存着真实Cassandra集群的状态(尤其是元数据);Cluster是线程安全的,一个Cassandra集群创建一个Cluster的单例,整个应用用这一个单例即可

    (2):Session用来执行查询的,而且它也是线程安全的,同样也应该重复利用

    (3):利用execute来发送一个查询到Cassandra,execute返回一个Resultset(结果集),这个结果集就是必要的列的行集合(二维表,行是满足条件的记录,列是我们关注的某些字段)

    (4):从row中提取数据

    (5):当任务完成后,关闭cluster,关闭cluster的同时将会关闭它创建的全部session;这一步很重要,它会释放潜在的资源(TCP连接、线程池等),在真实的应用中,我们应该在应用关闭(或应用卸载)的时候关闭cluster

    有jdbc开发的经验,就会发现,上述代码似曾相识,上述代码中的session就相当于jdbc中的connection,是整个数据库操作的基础,那么我们将session的获取单独抽出来

package com.huawei.cassandra.factory;import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.Session;public class SessionRepository
{private static Session instance = null;private static Cluster cluster = null;private static Lock lock = new ReentrantLock();private SessionRepository(){}public static Session getSession(){if (null == instance){try{lock.lock();if (null == instance){cluster = Cluster.builder()       .addContactPoint("127.0.0.1")                .withCredentials("admin", "admin")              .build();instance = cluster.connect();// 也可以针对一个特定的keyspace获取一个session// instance = cluster.connect("mycas");}}finally{lock.unlock();}}return instance;}public static void close(){if (null == cluster){try{lock.lock();if (null == cluster){cluster.close();}}finally{lock.unlock();}}}
}

    拿到session了,那么请随意操作Cassandra吧!

cassandra基本操作

  创建表

    在mycas下创建表student

use mycas;
create table student(id int,address text,name text,age int,height int,primary key(id,address,name)
);insert into student(id,address,name,age,height) values(1,'guangdong','lixiao',32,172);

  session直接执行cql

    和jdbc类似,关键是cql的拼接,下例是插入一条记录,删、改、查和这类似,不一一列举了

    // 字符串注意单引号'String cql = "insert into mycas.student(id,address,name,age,height) values(" + student.getId() + ",'" + student.getAddress() + "','" + student.getName()+ "'," + student.getAge() + "," + student.getHeight() + ");";System.out.println(cql);session.execute(cql);

  Querybuilder

    利用Querybuilder可以减轻cql的拼接,sql语句的拼接由驱动完成

    查询一个student:

    @Overridepublic Student getStudentByKeys(int id, String address, String name){Student student = null;ResultSet rs = session.execute(QueryBuilder.select("id", "address", "name", "age", "height").from("mycas", "student").where(QueryBuilder.eq("id", id)).and(QueryBuilder.eq("address", address)).and(QueryBuilder.eq("name", name)));Iterator<Row> rsIterator = rs.iterator();if (rsIterator.hasNext()){Row row = rsIterator.next();student = new Student();student.setAddress(row.getString("address"));student.setAge(row.getInt("age"));student.setHeight(row.getInt("height"));student.setId(row.getInt("id"));student.setName(row.getString("name"));}return student;}

    保存一个student:

  @Overridepublic void saveStudent(Student student){session.execute(QueryBuilder.insertInto("mycas", "student").values(new String[]{"id", "address", "name", "age", "height"},new Object[]{student.getId(), student.getAddress(), student.getName(), student.getAge(), student.getHeight()}));}

    修改一个student:

@Overridepublic void updateStudent(Student student){session.execute(QueryBuilder.update("mycas", "student").with(QueryBuilder.set("age", student.getAge())).and(QueryBuilder.set("height", student.getHeight())).where(QueryBuilder.eq("id", student.getId())).and(QueryBuilder.eq("address", student.getAddress())).and(QueryBuilder.eq("name", student.getName())));}

    删除一个student:

@Overridepublic void removeStudent(int id, String address, String name){session.execute(QueryBuilder.delete().from("mycas", "student").where(QueryBuilder.eq("id", id)).and(QueryBuilder.eq("address", address)).and(QueryBuilder.eq("name", name)));}

  注意:驱动版本不同,Querybuilder的用法有些许不同,有些版本的某些方法变成非静态的了!

  占位符

    cassandra也有类似jdbc那样使用预编译占位符

    http://docs.datastax.com/en/developer/java-driver/3.0/manual/statements/prepared/

    预编译的原理是怎样的了,上面的链接是驱动官方的解释,我来谈谈我的理解

    当我们预编译statement的时候,Cassandra会解析query语句,缓存解析的结果并返回一个唯一的标志(PreparedStatement对象保持着这个标志的内部引用,就相当于通过标志可以获取到query语句预编译后的内容):

    当你绑定并且执行预编译statement的时候,驱动只会发送这个标志,那么Cassandra就会跳过解析query语句的过程:

    所以,我们应该保证query语句只应该被预编译一次,缓存PreparedStatement 到我们的应用中(PreparedStatement 是线程安全的);如果我们对同一个query语句预编译了多次,那么驱动会打印警告日志;如果一个query语句只执行一次,那么预编译不会提供性能上的提高,反而会降低性能,因为它是两个来回(结合上面两张图),那么此时可以考虑用 simple statement 来代替

    和jdbc的预编译非常类似,我们来看看实际代码

    静态cql

  private static final String GET_STUDENT = "select id,address,name,age,height from mycas.student where id=? and address=? and name=?;";private static final String SAVE_STUDENT = "insert into mycas.student(id,address,name,age,height) values(?,?,?,?,?);";private static final String UPDATE_STUDENT = "update mycas.student set age=?, height=? where id=? and address=? and name=?;";private static final String REMOVE_STUDENT = "delete from mycas.student where id=? and address=? and name=?;";

    查询一个student

     Student student = null;PreparedStatement prepareStatement = session.prepare(GET_STUDENT);BoundStatement bindStatement = new BoundStatement(prepareStatement).bind(id, address, name);ResultSet rs = session.execute(bindStatement);Iterator<Row> rsIterator = rs.iterator();if (rsIterator.hasNext()){Row row = rsIterator.next();student = new Student();student.setAddress(row.getString("address"));student.setAge(row.getInt("age"));student.setHeight(row.getInt("height"));student.setId(row.getInt("id"));student.setName(row.getString("name"));}return student;

    保存一个student

        PreparedStatement prepareStatement = session.prepare(SAVE_STUDENT);BoundStatement bindStatement = new BoundStatement(prepareStatement).bind(student.getId(), student.getAddress(), student.getName(), student.getAge(), student.getHeight());session.execute(bindStatement);

    修改一个student

     PreparedStatement prepareStatement = session.prepare(UPDATE_STUDENT);BoundStatement bindStatement = new BoundStatement(prepareStatement).bind(student.getAge(), student.getHeight(), student.getId(), student.getAddress(), student.getName());session.execute(bindStatement);

    删除一个student

     PreparedStatement prepareStatement = session.prepare(REMOVE_STUDENT);BoundStatement bindStatement = new BoundStatement(prepareStatement).bind(id, address, name);session.execute(bindStatement);

  批量batch

public static void batch(){Session session = SessionRepository.getSession();BoundStatement insertBind1 = new BoundStatement(session.prepare("insert into mycas.student(id,address,name,age,height) values(?,?,?,?,?);")).bind(3, "guangxi", "huangfeihong", 67, 175);BoundStatement insertBind2 = new BoundStatement(session.prepare("insert into mycas.student(id,address,name,age,height) values(?,?,?,?,?);")).bind(4, "hunan", "youzhibing", 26, 160);BoundStatement updateBind = new BoundStatement(session.prepare("update mycas.student set age=?, height=? where id=? and address=? and name=?;")).bind(72, 173, 3, "guangxi", "huangfeihong");BoundStatement deleteBind = new BoundStatement(session.prepare("delete from mycas.student where id=? and address=? and name=?;")).bind(4, "hunan", "youzhibing");BatchStatement batchStatement = new BatchStatement();batchStatement.add(insertBind1);batchStatement.add(insertBind2);batchStatement.add(updateBind);batchStatement.add(deleteBind);session.execute(batchStatement);}
public static void batch(){Session session = SessionRepository.getSession();BoundStatement insertBind1 = new BoundStatement(session.prepare("insert into mycas.student(id,address,name,age,height) values(?,?,?,?,?);")).bind(3, "guangxi", "huangfeihong", 67, 175);BoundStatement insertBind2 = new BoundStatement(session.prepare("insert into mycas.student(id,address,name,age,height) values(?,?,?,?,?);")).bind(4, "hunan", "youzhibing", 26, 160);BoundStatement updateBind = new BoundStatement(session.prepare("update mycas.student set age=?, height=? where id=? and address=? and name=?;")).bind(72, 173, 3, "guangxi", "huangfeihong");BoundStatement deleteBind = new BoundStatement(session.prepare("delete from mycas.student where id=? and address=? and name=?;")).bind(4, "hunan", "youzhibing");BatchStatement batchStatement = new BatchStatement();batchStatement.add(insertBind1);batchStatement.add(insertBind2);batchStatement.add(updateBind);batchStatement.add(deleteBind);session.execute(batchStatement);}

转载于:https://www.cnblogs.com/Soy-technology/p/11313792.html

Cassandra-Java(增删查改)相关推荐

  1. JAVA增删查改的实现

    java程序对SQLServer数据库的数据进行增删查的操作,结果在控制台输出 步骤详解: 设计并实现数据库 在数据库中插入相应的数据 链接SQLServer数据库 实现对数据库的查增删等功能 数据库 ...

  2. 安卓后端mysql_后端Spring Boot+前端Android交互+MySQL增删查改(Java+Kotlin实现)

    1 前言&概述 这篇文章是基于这篇文章的更新,主要是更新了一些技术栈以及开发工具的版本,还有修复了一些Bug. 本文是SpringBoot+Android+MySQL的增删查改的简单实现,用到 ...

  3. JAVA原生mvc实现用户信息的增删查改

    笔者最近学完jsp和servlet,于是心血来潮的打算写个简单的用户案例 环境准备: 开发工具eclipse jdk-1.8.0_72 tomcat-9.0.5 前端部分: 1.自己手写了一套样式 2 ...

  4. Java JDBC篇2——JDBC增删查改

    Java JDBC篇2--JDBC增删查改 url=jdbc:mysql://localhost:3306/test user=root password=blingbling123. driver= ...

  5. java使用org.w3c.dom解析XML文档,创建、增删查改,保存,读取,遍历元素等操作

    全栈工程师开发手册 (作者:栾鹏) java教程全解 java使用org.w3c.dom(java dom)解析XML文档,创建.增删查改,保存,读取,遍历元素等操作 在保存文件时需要载入crimso ...

  6. java解析xml文件:创建、读取、遍历、增删查改、保存

    全栈工程师开发手册 (作者:栾鹏) java教程全解 java使用JDOM接口解析xml文件,包含创建.增删查改.保存,读取等操作. 需要引入jdom.jar,下载 xercesImpl.jar,下载 ...

  7. 支持增删查改的简单Java Web通讯录详细教程【基于Mac OS+IDEA+Servlet+JDBC+Tomcat】

    本文将以Web版通讯录的形式介绍一个支持简单增删查改的Java Web项目,软硬件环境基于Macbook Air M2+macOS Ventura 13.1+IntelliJ IDEA 2022,技术 ...

  8. JAVA学生信息管理系统——增删查改

    1.首先添加学生类 2.再实现增删查改 在编程中遇到的小问题: 1.case语句中代码重复的话,可以注释掉,程序依然会向下执行 2.编写查询时,要考虑没有学生的情况 3.编写增加和修改和查询时,要以唯 ...

  9. Java操作MongoDB数据库CRUD(增删查改)

    Java操作MongoDB数据库CRUD(增删查改) 借助mongo-java-driver包,对MongoDB数据库的集合(DataTable)及文档(BSON对象数据)进行增删查改操作.本文的核心 ...

  10. Java、SQL Serve ----简单的增删查改

    --创建 Student表 CREATE TABLE Student(Sno CHAR(9) PRIMARY KEY, Sname CHAR(20) NOT NULL, Ssex CHAR(2),Sa ...

最新文章

  1. HDU 4869 Turn the pokers(思维+组合公式+高速幂)
  2. 《JUnit实战(第2版)》—第1章1.7节小结
  3. mysql系列十、mysql索引结构的实现B+树/B-树原理
  4. 提高办公效率的个Excel技巧,告别苦加班!
  5. 极光推送java demo_极光推送- 3 分钟 Demo - 极光文档
  6. java 的23种设计模式 之单身狗和隔壁老王的故事
  7. 乘法更新规则对于并发的非负矩阵分解和最大间隔分类
  8. 杨辉三角(完整代码)
  9. FreeBSD 11.0-发布公告
  10. gif表情包在线生成器怎么一键生成图片
  11. C#测绘兰勃特墨卡托投影
  12. PDF文件点击打印按钮没反应
  13. notepad拼心形_Excel心形函数v1.0 免费版
  14. Xmind软件 2020最新安装教程讲解
  15. 加快BITMAP像素访问速度,取代GetPixel
  16. JAVA WEB 入门基础第一天
  17. 特殊数字符号大全,word 数学符号
  18. 【电脑运用及修理】Internet Explorer 浏览器
  19. 计算机中的刷新用英语怎么说,刷新的英语怎么说
  20. 为什么服务器运行失败怎么回事,服务器运行失败_Win7旗舰版提示服务器运行失败怎么解决...

热门文章

  1. cogs 1430. [UVa 11300]分金币
  2. mysql 存储过程无效_用VC通过DLL包连接MySQL,执行存储过程后,再执行其他查询无效?解决方法...
  3. 计算机基础理论汇编,计算机基础知识:计算机中的汇编语言
  4. java不会自动提示_eclispe中打点不会提示的解决方法,以及自动补全
  5. spark sql 上个月_SPARK-SQL内置函数之时间日期类
  6. linux php目录是否存在,PHP判断文件或者目录是否可写,兼容windows/linux系统
  7. vs+命令行运行带参数cpp文件
  8. 对象必须实现 iconvertible_Java I/O 流之数据流_对象流
  9. sublime text3 怎么配置、运行python_怎么用sublime text 3搭建python 的ide?
  10. python psycopg2_Ubuntu 安装 PostgreSQL 和 python-psycopg2基础教程(以及错误解决)