Springboot整合cassandra

44 阅读1分钟
  • pom依赖

         <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-cassandra -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-cassandra</artifactId>
            </dependency>
    
  • yml配置

    spring:
      data:
        cassandra:
          contact-points: xxxxx
          port: xxxx
          keyspaceName: xxxx
          local-datacenter: datacenter1
    
  • 实现类代码

    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.cassandra.core.CassandraTemplate;
    import org.springframework.data.cassandra.core.query.CassandraPageRequest;
    import org.springframework.data.cassandra.core.query.Criteria;
    import org.springframework.data.cassandra.core.query.Query;
    import org.springframework.data.domain.PageRequest;
    import org.springframework.data.domain.Slice;
    import org.springframework.stereotype.Service;
    ​
    import java.nio.ByteBuffer;
    import java.util.List;
    import java.util.Objects;
    ​
    @Service
    @Slf4j
    public class UserServiceImpl implements UserService {
    ​
        @Autowired
        private CassandraTemplate cassandraTemplate;
    ​
        @Override
        public List<User> getAll() {
            return cassandraTemplate.select(Query.query(), User.class);
        }
    ​
        @Override
        public Slice<User> getByPage(ByteBuffer pageable, Integer pageSize) {
        
            //不支持查询时候排序,想对聚簇列做 ORDER BY,就必须在 WHERE 子句里把“整个分区键”用 = 或 IN 限定死。
            //Cassandra 不支持跨分区全局排序。
            Query query = Query.query();
            PageRequest pageRequest;
            if (Objects.isNull(pageable)) {
                pageRequest = CassandraPageRequest.first(pageSize);
            } else {
                pageRequest = CassandraPageRequest.of(CassandraPageRequest.first(pageSize), pageable);
            }
            Query criteriaDefinitions = query.pageRequest(pageRequest);
            return cassandraTemplate.slice(criteriaDefinitions, User.class);
        }
    ​
        @Override
        public User getById(int id) {
            return cassandraTemplate.selectOne(Query.query(Criteria.where("id").is(id)), User.class);
        }
    ​
        @Override
        public List<User> getByName(String name) {
            //查询必须是索引字段才行,必须是精准查询
            //如果要模糊查询等等,需要建立sai索引,需要在cassandra中配置sai索引开启
            return cassandraTemplate.select(Query.query(Criteria.where("name").is(name)), User.class);
        }
    ​
        /**
         * 添加用户
         *
         * @param user
         * @return
         */
        @Override
        public User addUser(User user) {
            return cassandraTemplate.insert(user);
        }
    ​
        /**
         * 删除用户
         *
         * @param id
         * @return
         */
        @Override
        public boolean deleteUser(int id) {
            return cassandraTemplate.delete(Query.query(Criteria.where("id").is(id)), User.class);
        }
    ​
        /**
         * 修改用户
         *
         * @param user
         * @return
         */
        @Override
        public User updateUser(User user) {
            return cassandraTemplate.update(user);
        }
    ​
    
  • 调用

     @Autowired
        private UserService userService;
    ​
        @Autowired
        private ObjectMapper objectMapper;
    ​
        @SneakyThrows
        @Test
        void contextLoads() {
            List<User> all = userService.getAll();
            log.info("all: {}", objectMapper.writeValueAsString(all));
            log.info("size: {}", all.size());
        }
    ​
        @SneakyThrows
        @Test
        void test1(){
            User user = userService.getById(1);
            log.info("user: {}", objectMapper.writeValueAsString(user));
        }
    ​
    ​
        @SneakyThrows
        @Test
        void test2(){
            List<User> user = userService.getByName("z5");
            log.info("user: {}", objectMapper.writeValueAsString(user));
            log.info("size: {}", user.size());
        }
    ​
        @SneakyThrows
        @Test
        void test3(){
            Slice<User> users = userService.getByPage( null,2);
            List<User> content = users.getContent();
            log.info("users: {}", objectMapper.writeValueAsString(content));
            log.info("size: {}", content.size());
            Pageable pageable = users.getPageable();
            CassandraPageRequest pageable1 = (CassandraPageRequest) pageable;
            ByteBuffer pagingState = pageable1.getPagingState();
            Slice<User> byPage = userService.getByPage(pagingState, 3);
            log.info("byPage: {}", objectMapper.writeValueAsString(byPage.getContent()));
            log.info("size: {}", byPage.getContent().size());
        }
    ​
        @SneakyThrows
        @Test
        void test4(){
            User user = new User();
            user.setId(16);
            user.setName("zzzz2");
            User user1 = userService.addUser(user);
            log.info("user: {}", objectMapper.writeValueAsString(user1));
        }
    ​
        @SneakyThrows
        @Test
        void test5(){
            User user = new User();
            user.setId(16);
            user.setAge(18);
            user.setName("12344");
            User user1 = userService.updateUser(user);
            log.info("user: {}", objectMapper.writeValueAsString(user1));
        }
    ​
        @SneakyThrows
        @Test
        void test6(){
            boolean b = userService.deleteUser(123);
            log.info("b: {}", b);
        }