Idea建立Maven多模組+Spring-boot cassandra-CqlTemplate的使用
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、重新重新整理即可刪除,如下圖所示: