Idea创建Maven多模块+Spring-boot cassandra-CqlTemplate的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sunxiaoju/article/details/84583887

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/1http://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、重新刷新即可删除,如下图所示:

猜你喜欢

转载自blog.csdn.net/sunxiaoju/article/details/84583887
今日推荐