Cassandra-Java(增删查改)
驱动下载
创建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:
@Override
public 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:
@Override
public 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:
@Override
public 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:
@Override
public 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);
}
Cassandra-Java(增删查改)的更多相关文章
- java中CRUD(增删查改)底层代码的实现
java中CRUD(增删查改)底层代码的实现: package com.station.dao; import com.station.model.Product; import java.sql.* ...
- java实现简单的数据库的增删查改,并布局交互界面
一.系统简介 1.1.简介 本系统提供了学生信息管理中常见的基本功能,主要包括管理员.管理员的主要功能有对学生信息进行增加.删除.修改.查找等操作,对信息进行管理,对信息进行修改.查找等操作 ...
- MongoDB在Java下的增删查改
我们总不能一直使用cmd对数据库操作,数据库总是要在程序中使用的.今天来说一下怎么通过Java调用MongoDB. 学习一下最基本也是最常用的增删查改语句,这是使用数据库的基础. 注意事项: 1.要打 ...
- Java连接MySQL数据库及简单的增删查改操作
主要摘自 https://www.cnblogs.com/town123/p/8336244.html https://www.runoob.com/java/java-mysql-connect.h ...
- java:Hibernate框架1(环境搭建,Hibernate.cfg.xml中属性含义,Hibernate常用API对象,HibernteUitl,对象生命周期图,数据对象的三种状态,增删查改)
1.环境搭建: 三个准备+7个步骤 准备1:新建项目并添加hibernate依赖的jar文件 准备2:在classpath下(src目录下)新建hibernate的配置文件:hibernate.cf ...
- JAVA原生mvc实现用户信息的增删查改
笔者最近学完jsp和servlet,于是心血来潮的打算写个简单的用户案例 环境准备: 开发工具eclipse jdk-1.8.0_72 tomcat-9.0.5 前端部分: 1.自己手写了一套样式 2 ...
- 后端Spring Boot+前端Android交互+MySQL增删查改(Java+Kotlin实现)
1 前言&概述 这篇文章是基于这篇文章的更新,主要是更新了一些技术栈以及开发工具的版本,还有修复了一些Bug. 本文是SpringBoot+Android+MySQL的增删查改的简单实现,用到 ...
- hibernate基础增删查改简单实例
hibernate 基础理论知识网上很多,可以百度和google.这里不做多的介绍,以一个User表来开展例子 建一个web-project 我这里用了junit单元测试环境来进行增删查改的测试,别的 ...
- 2015.8.2 jdbc实现商品类的增删查改
在惠普济宁基地进行了两周sql和java的学习,学到很多东西 刚才实现了用jdbc访问数据库对数据库进行操作,是用eclipse写的,过几天移植到NetBeans上,个人还是比较习惯看图形化界面 前几 ...
- Android——另外一种增删查改的方式(ContentProvider常用)
以下介绍另外一种增删查改的方式 package com.njupt.sqllist; import java.util.ArrayList; import java.util.List; import ...
随机推荐
- Java学习书籍与社区
编码规范:<阿里巴巴Java开发手册> 技术架构:<大型网站技术架构核心原理与案例分析>---李智慧 Spring架构与设计原理解析:<Spring技术内幕深入解析Spr ...
- 在java中,怎样创建编写javascript的环境?
刚开始还没有学到这一块的时候,预习的时候也是在网上搜索这一类的信息时候, 可是都是八竿子碰不到边的!在此也是呕心沥血的为读者献上最好的: 1.首先:点击空白处>右键>project: 2. ...
- MyKTV系统项目的感想
不粉身碎骨,何以脱胎换骨! 3月11号,我们迎来S1的尾巴.这期间有温暖,默契,有项目.一切刚刚好.刚刚正式接到KTV这个微微型的项目的时候,还是很害怕的,虽然老师在前两天就已经提到也讲到,KTV系统 ...
- [noip2002] 产生数
题目描述 给出一个整数 n (n<1030)和 k 个变换规则 (k < 15) . 规则: 一位数可变换成另一个一位数: 规则的右部不能为零. 例如:n = 234 .有规则( k=2 ...
- 使用vs2008的一个问题 2008-01-08 13:13
昨天在写控制台版的一个管理系统.语言是:c++ ,开发工具是:vs 2008 .功能简单的描述一下,它是就是简单的查询,插入,删除等操作,操作的对象是一个xml文件. 这时我要需要一个命令行参数,根据 ...
- git提交限制后提交出错的暴力解决 (使用小乌龟)
1.右键-> TortoiseGit-> 显示日志 2.右键->重置到哪个版本 3. 重新修改提交信息提交
- Python语言中的关键字(自己做的读书笔记)
电脑配置:联想笔记本电脑 windows8系统 Python版本:2.7.8 本文章撰写时间:2015.1.1 作者:陈东陈 阅读说明: 1.本文都是先解释,后放图片: 2.文中斜体部分要么为需要输入 ...
- 如何寻找决策最优解?熵权TOPSIS助你科学决策
熵权topsis是一种融合了熵值法与TOPSIS法的综合评价方法.熵值法是一种客观赋值法,可以减少主观赋值带来的偏差:而topsis法是一种常见的多目标决策分析方法,适用于多方案.多对象的对比研究,从 ...
- Java数据结构——二叉搜索树
定义二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若 ...
- Spring Security使用数据库数据完成认证--练气后期2
写在前面 没错,这篇文章还是练气后期!但作者我相信筑基指日可待! 在前一篇文章当中,我们简单地分析了一下Spring Security的认证流程,知道了如果想要实现对自己用户数据(账户.角色.权限)的 ...