1、创建多模块的项目请参考https://blog.csdn.net/sunxiaoju/article/details/84343002
2、创建一个cassandra模块,并创建好相应的目录包以及对应的文件,如下图所示:
3、然后配置pom.xml,需要添加对应的依赖包,如下代码所示:
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>Spring-root</artifactId>
<groupId>Spring-root</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cassandra</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-cassandra</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.datastax.cassandra</groupId>
<artifactId>cassandra-driver-core</artifactId>
<version>3.6.0</version>
</dependency>
<dependency>
<groupId>com.codahale.metrics</groupId>
<artifactId>metrics-core</artifactId>
<version>3.0.2</version>
</dependency>
<dependency>
<groupId>com.github.jnr</groupId>
<artifactId>jnr-ffi</artifactId>
<version>2.1.9</version>
</dependency>
</dependencies>
</project>
4、然后打开cassandra数据库创建user表,cql语句为:
create table user (id bigint primary key,username text,age int);
如下图所示:
\
5、向user表中插入数据,cql语句为:
insert into user (id,username,age) values (1,'zs',23);
insert into user (id,username,age) values (2,'ls',24);
insert into user (id,username,age) values (3,'ww',25);
如下图所示:
6、在resources中创建cassandra.properties配置文件,内容为:
cassandra.keyspacename=mycasdb
cassandra.contactpoints=127.0.0.1
cassandra.port=9042
cassandra.username=cassandra
cassandra.password=cassandra
7、创建ApplicationCfg.java配置类,用于获取cassandra.properties配置文件的内容,(注意:如果使用@ConfigurationProperties,需要在pom.xml中添加spring-boot-configuration-processor的依赖)如下代码所示:
package com.win.cas;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
@PropertySource("classpath:cassandra.properties")
@ConfigurationProperties(prefix="cassandra")
public class ApplicationCfg {
private String keyspacename;
private String contactpoints;
private int port;
private String username;
private String password;
public String getKeyspacename(){
return this.keyspacename;
}
public void setKeyspacename(String keyspacename){
this.keyspacename=keyspacename;
}
public String getContactpoints(){
return this.contactpoints;
}
public void setContactpoints(String contactpoints){
this.contactpoints=contactpoints;
}
public String getUsername(){
return this.username;
}
public void setUsername(String username){
this.username=username;
}
public String getPassword(){
return this.password;
}
public void setPassword(String password){
this.password=password;
}
public int getPort(){
return this.port;
}
public void setPort(int port){
this.port=port;
}
}
8、创建CqlSession.java接口类,此接口用于在CqlTemplate时设置session使用,如下代码:
package com.win.cas.session;
import com.datastax.driver.core.Session;
public interface CqlSession {
public Session getSession();
}
9、实现CqlSession.java接口CqlSessionImpl.java类,此接口用于连接cassandra数据库,最后得到session,@Autowired自动注入到构造函数,它会将构造函数中的参数自动注入,因此不用实例化即可使用,如果@Autowired不是在构造函数时(既有@Autowired又有构造函数则会出错,因此可以将构造函数和含有@Autowired的变量作为构造函数的参数即可)如下代码所示:
package com.win.cas.session.impl;
import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.HostDistance;
import com.datastax.driver.core.PoolingOptions;
import com.datastax.driver.core.Session;
import com.win.cas.ApplicationCfg;
import com.win.cas.session.CqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class CqlSessionImpl implements CqlSession {
private Session session;
private Cluster cluster;
@Autowired
public CqlSessionImpl(ApplicationCfg applicationCfg){
PoolingOptions poolingOptions = new PoolingOptions();
// 每个连接的最大请求数 2.0的驱动好像没有这个方法
poolingOptions.setMaxRequestsPerConnection(HostDistance.LOCAL, 32);
// 表示和集群里的机器至少有2个连接 最多有4个连接
poolingOptions.setCoreConnectionsPerHost(HostDistance.LOCAL, 2).setMaxConnectionsPerHost(HostDistance.LOCAL, 4)
.setCoreConnectionsPerHost(HostDistance.REMOTE, 2).setMaxConnectionsPerHost(HostDistance.REMOTE, 4);
// addContactPoints:cassandra节点ip withPort:cassandra节点端口 默认9042
// withCredentials:cassandra用户名密码 如果cassandra.yaml里authenticator:AllowAllAuthenticator 可以不用配置
cluster = Cluster.builder().addContactPoints(applicationCfg.getContactpoints()).withPort(applicationCfg.getPort()).withCredentials(applicationCfg.getUsername(), applicationCfg.getPassword()).withPoolingOptions(poolingOptions).build();
// 建立连接
// session = cluster.connect("test");连接已存在的键空间
session = cluster.connect(applicationCfg.getKeyspacename());
}
@Override
public Session getSession(){
return this.session;
}
}
10、创建CqlTemp.java接口,如下代码所示:
package com.win.cas.cqltemplite;
import org.springframework.data.cassandra.core.cql.CqlTemplate;
public interface CqlTemp {
public CqlTemplate getCqlTemplate();
}
11、实现CqlTemp.java接口CqlTempImpl.java类,此类是用来获得CqlTemplate的,通过此对象就可以执行与cql相关的方法,如下代码所示:
package com.win.cas.cqltemplite.impl;
import com.win.cas.cqltemplite.CqlTemp;
import com.win.cas.session.CqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.cassandra.core.cql.CqlTemplate;
import org.springframework.data.cassandra.core.cql.session.DefaultSessionFactory;
import org.springframework.stereotype.Service;
@Service
public class CqlTempImpl implements CqlTemp {
private CqlTemplate cqlTemplate;
@Autowired
public CqlTempImpl(CqlSession cqlSession){
cqlTemplate=new CqlTemplate();
cqlTemplate.setSessionFactory(new DefaultSessionFactory(cqlSession.getSession()));
}
@Override
public CqlTemplate getCqlTemplate(){
return this.cqlTemplate;
}
}
12、根据数据库表创建User.java实体类,如下代码:
package com.win.cas.bean;
public class User {
private long id;
private String username;
private int age;
public User() {
}
public User(String username, int age) {
this.username = username;
this.age = age;
}
public void setUsername(String username){
this.username=username;
}
public void setAge(int age){
this.age=age;
}
public long getId(){
return this.id;
}
public void setId(long id){
this.id=id;
}
public String getUsername(){
return this.username;
}
public int getAge(){
return this.age;
}
}
13、创建返回json对象类:JsonResult.java,如下代码:
package com.win.cas.bean;
public class JsonResult {
private String status = null;
private Object result = null;
public JsonResult status(String status) {
this.status = status;
return this;
}
public void setResult(Object user){
this.result=user;
}
public Object getResult(){
return this.result;
}
public void setStatus(String status){
this.status=status;
}
public String getStatus(){
return this.status;
}
}
14、创建dao接口类:UserDao.java,如下代码所示:
package com.win.cas.dao;
import com.win.cas.bean.User;
import java.util.List;
public interface UserDao {
public List<User> getUserById(Long id);
public User getUserById1(Long id);
public List<User> getUserList();
public boolean add(User user);
public boolean update(Long id, User user);
public boolean delete(Long id);
}
15、实现dao接口类:UserDaoImpl.java,如下代码所示:
package com.win.cas.dao.impl;
import com.datastax.driver.core.*;
import com.datastax.driver.core.exceptions.DriverException;
import com.win.cas.bean.User;
import com.win.cas.cqltemplite.CqlTemp;
import com.win.cas.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.cassandra.core.cql.RowMapper;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class UserDaoImpl implements UserDao {
@Autowired
private CqlTemp cqlTemp;
@Override
public List<User> getUserById(Long id){
List<User> list = cqlTemp.getCqlTemplate().query("select * from user where id = ?",new RowMapper<User>() {
@Override
public User mapRow(Row row, int i) throws DriverException {
User user=new User();
user.setId(row.getLong("id"));
user.setAge(row.getInt("age"));
user.setUsername(row.getString("username"));
return user;
}
}, id);
if(list!=null && list.size()>0){
return list;
}else{
return null;
}
}
@Override
public User getUserById1(Long id){
User usero = cqlTemp.getCqlTemplate().queryForObject("select * from user where id = ?", new RowMapper<User>() {
@Override
public User mapRow(Row row, int i) throws DriverException {
User user=new User();
user.setId(row.getLong("id"));
user.setAge(row.getInt("age"));
user.setUsername(row.getString("username"));
return user;
}
}, id);
if(usero!=null){
return usero;
}
return null;
}
@Override
public List<User> getUserList(){
List<User> list = cqlTemp.getCqlTemplate().query("select * from user", new RowMapper<User>() {
@Override
public User mapRow(Row row,int rowNum) throws DriverException{
User user=new User();
user.setId(row.getLong("id"));
user.setAge(row.getInt("age"));
user.setUsername(row.getString("username"));
return user;
}
});
if(list!=null && list.size()>0){
return list;
}else{
return null;
}
}
@Override
public boolean add(User user){
return cqlTemp.getCqlTemplate().execute("insert into user(id,username, age) values(?, ?, ?)",
user.getId(),user.getUsername(),user.getAge());
}
@Override
public boolean update(Long id, User user){
return cqlTemp.getCqlTemplate().execute("UPDATE user SET username = ? , age = ? WHERE id=?",
user.getUsername(),user.getAge(), id);
}
@Override
public boolean delete(Long id){
return cqlTemp.getCqlTemplate().execute("DELETE from user where id = ? ",id);
}
}
16、service接口类:UserService.java,如下代码所示:
package com.win.cas.service;
import com.win.cas.bean.User;
import java.util.List;
public interface UserService {
public List<User> getUserById(Long id);
public User getUserById1(Long id);
public List<User> getUserList();
public boolean add(User user);
public boolean update(Long id, User user);
public boolean delete(Long id);
}
17、实现service接口类:UserServiceImpl.java,如下代码所示:
package com.win.cas.service.impl;
import com.win.cas.bean.User;
import com.win.cas.dao.UserDao;
import com.win.cas.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public List<User> getUserById(Long id){
return userDao.getUserById(id);
}
@Override
public User getUserById1(Long id){
return userDao.getUserById1(id);
}
@Override
public List<User> getUserList(){
return userDao.getUserList();
}
@Override
public boolean add(User user){
return userDao.add(user);
}
@Override
public boolean update(Long id, User user){
return userDao.update(id, user);
}
@Override
public boolean delete(Long id){
return userDao.delete(id);
}
}
18、控制层代码UserController.java类,如下代码:
package com.win.cas.web;
import com.win.cas.bean.JsonResult;
import com.win.cas.bean.User;
import com.win.cas.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
public class UserController {
@Autowired
private UserService userService;
/**
* 根据ID查询用户
* @param id
* @return
*/
@RequestMapping(value = "user/{id}", method = RequestMethod.GET)
public ResponseEntity<JsonResult> getUserById (@PathVariable(value = "id") Long id){
JsonResult r = new JsonResult();
try {
List<User> user = userService.getUserById(id);
r.setResult(user);
r.setStatus("ok");
} catch (Exception e) {
r.setResult(e.getClass().getName() + ":" + e.getMessage());
r.setStatus("error");
e.printStackTrace();
}
return ResponseEntity.ok(r);
}
/**
* 根据ID查询用户
* @param id
* @return
*/
@RequestMapping(value = "user1/{id}", method = RequestMethod.GET)
public ResponseEntity<JsonResult> getUserById1 (@PathVariable(value = "id") Long id){
JsonResult r = new JsonResult();
try {
User user = userService.getUserById1(id);
r.setResult(user);
r.setStatus("ok");
} catch (Exception e) {
r.setResult(e.getClass().getName() + ":" + e.getMessage());
r.setStatus("error");
e.printStackTrace();
}
return ResponseEntity.ok(r);
}
/**
* 查询用户列表
* @return
*/
@RequestMapping(value = "users", method = RequestMethod.GET)
public ResponseEntity<JsonResult> getUserList (){
JsonResult r = new JsonResult();
try {
List<User> users = userService.getUserList();
r.setResult(users);
r.setStatus("ok");
} catch (Exception e) {
r.setResult(e.getClass().getName() + ":" + e.getMessage());
r.setStatus("error");
e.printStackTrace();
}
return ResponseEntity.ok(r);
}
/**
* 添加用户
* @param user
* @return
*/
@RequestMapping(value = "user", method = RequestMethod.POST)
public ResponseEntity<JsonResult> add (@RequestBody User user){
JsonResult r = new JsonResult();
try {
boolean orderId = userService.add(user);
if (!orderId) {
r.setResult(orderId);
r.setStatus("fail");
} else {
r.setResult(orderId);
r.setStatus("ok");
}
} catch (Exception e) {
r.setResult(e.getClass().getName() + ":" + e.getMessage());
r.setStatus("error");
e.printStackTrace();
}
return ResponseEntity.ok(r);
}
/**
* 根据id删除用户
* @param id
* @return
*/
@RequestMapping(value = "user/{id}", method = RequestMethod.DELETE)
public ResponseEntity<JsonResult> delete (@PathVariable(value = "id") Long id){
JsonResult r = new JsonResult();
try {
boolean orderId = userService.delete(id);
if (!orderId) {
r.setResult(orderId);
r.setStatus("fail");
} else {
r.setResult(orderId);
r.setStatus("ok");
}
} catch (Exception e) {
r.setResult(e.getClass().getName() + ":" + e.getMessage());
r.setStatus("error");
e.printStackTrace();
}
return ResponseEntity.ok(r);
}
/**
* 根据id修改用户信息
* @param user
* @return
*/
@RequestMapping(value = "user/{id}", method = RequestMethod.PUT)
public ResponseEntity<JsonResult> update (@PathVariable("id") Long id, @RequestBody User user){
JsonResult r = new JsonResult();
try {
boolean ret = userService.update(id, user);
if (!ret) {
r.setResult(ret);
r.setStatus("fail");
} else {
r.setResult(ret);
r.setStatus("ok");
}
} catch (Exception e) {
r.setResult(e.getClass().getName() + ":" + e.getMessage());
r.setStatus("error");
e.printStackTrace();
}
return ResponseEntity.ok(r);
}
}
19、启动类代码:Application.java类,如下代码:
package com.win.cas;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableAutoConfiguration
@SpringBootApplication
public class Application {
public static void main( String[] args )
{
System.out.println( "start....." );
SpringApplication.run(Application.class, args);
}
}
20、通过Debug启动程序,然后在浏览器中输入:http://127.0.0.1:8080/user/1或http://127.0.0.1:8080/user1/2,即可查询cassandra数据表中的内容,第一个地址是当表中有多个id值时返回的是一个列表,而第二个地址是表中只有一个ID值,且只返回一个对象,如下图所示可以看出一个有[],一个没有:
21、输入:http://127.0.0.1:8080/users,即可查询user表中的所有记录,如下图所示:
22、添加用户,打开火狐浏览器的RESTClient调试工具,然后添加http头,如下图所示:
23、请求方法选择Post,然后输入:,在正文中输入:{"id":4,"username":"zl-cqltempliate","age":26},如下图所示:
24、修改用户信息,选择put请求,然后输入:http://127.0.0.1:8080/user/4,输入要修改的内容:{"id":4,"username":"zl-cqltempliate-modify","age":30},表示修改指定ID的信息,点击发送即可修改,并且有返回状态,如下图所示:
25、再次刷新获取用户列表,如下图所示:
26、删除用户信息,选择DELETE请求,然后输入:http://127.0.0.1:8080/user/2,不需要输入内容,点击发送即可删除,并且有返回状态,如下图所示:
27、重新刷新即可删除,如下图所示: