java 2022/02/25(시퀀스 , map)

무간·2022년 2월 25일

nosqlbooter에서 시퀀스 생성( seq값을 long)

//int64
db.sequence.insert({
    _id : 'SEQ_ITEM2_NO',
    seq : NumberLong(1)
})

파일명 / vo/ Item.java

package com.example.vo;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

@Setter
@Getter
@ToString
@NoArgsConstructor
@AllArgsConstructor

public class Item {

    // 물품번호, 제목, 가겨, 수량
    private long no = 0;
    private String name = null;
    private int price = 0;
    private int quantity = 0;    
}

파일명 / db/ ItemDB.java

package com.example.db;

import java.util.List;
import java.util.Map;

import com.example.vo.Item;

public interface ItemDB {

    // 시퀀스를 이용해서 물품 등록
    public int insertItem(Item item);

    // 물품삭제
    public int deleteItem(long code) throws Exception;

    // 물품변경
    public int updateItem(Item item);

    // 물품 1개 조회
    public Map<String, Object> selectOneMapItem(long code);
    public Item selectOneItem(long code);

    // 물품 전체 조회
    public List<Item> selectListItem();

    // 조회 페이지단위로
    public List<Item> selectListPageItem(int page);
    
}

파일명 / db/ ItemDBImpl.java

package com.example.db;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.example.vo.Item;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.Projections;
import com.mongodb.client.model.Updates;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.InsertOneResult;
import com.mongodb.client.result.UpdateResult;

import org.bson.Document;
import org.bson.conversions.Bson;

public class ItemDBImpl implements ItemDB{
    private final String url = "mongodb://id219:pw219@1.234.5.158:37017/db219";

    private MongoCollection<Document> collection = null; //item2
    private MongoCollection<Document> seqCollection = null; //sequence
    
    // DB접속
    public ItemDBImpl() {
        
        MongoClient client = MongoClients.create(this.url);        
        MongoDatabase db = client.getDatabase("db219");        
        this.collection = db.getCollection("item2");
        this.seqCollection = db.getCollection("sequence");
    }

    // 시퀀스를 이용해서 물품 등록
    @Override
    public int insertItem(Item item) {
        try {

            Bson bson = Filters.eq("_id","SEQ_ITEM2_NO");
            Bson update = Updates.inc("seq",1);
            Document doc = this.seqCollection.findOneAndUpdate(bson, update);
            long seq = doc.getLong("seq");
            
            Document doc1 = new Document();
            doc1.append("_id", seq);
            doc1.append("name", item.getName());
            doc1.append("price", item.getPrice());
            doc1.append("quantity", item.getQuantity());        
            
            InsertOneResult result = this.collection.insertOne(doc1);

            if(result.getInsertedId().asInt64().getValue() == seq){
                return 1;
            }            
            return 0;
        } 
        catch (Exception e) {
            e.printStackTrace(); //오류출력
            return -1;            
        }
    }

    // 물품삭제
    @Override
    public int deleteItem(long code) throws Exception {  //throws Exception => App.java에서 직접 오류를 검사함     
        Bson filter = Filters.eq("_id", code);
        DeleteResult result = this.collection.deleteOne(filter);
        if(result.getDeletedCount() == 1L){
            return 1;
        }
        return 0;        
    }

    // 물품변경
    @Override
    public int updateItem(Item item) {
        try {
            // 수정할 조건
            Bson filter = Filters.eq("_id", item.getNo());

            // 수정할 항목(3) => combine
            Bson bson1 = Updates.set("name", item.getName());
            Bson bson2 = Updates.set("price", item.getPrice());
            Bson bson3 = Updates.set("quantity", item.getQuantity());
            Bson update = Updates.combine(bson1,bson2,bson3);

            UpdateResult result = this.collection.updateOne(filter, update);
            if(result.getModifiedCount() == 1L) {
                return 1;
            }            
            return 0;
        } 
        catch (Exception e) {
            e.printStackTrace(); //오류출력
            return 0;            
        }   
    }

    // 물품 1개 조회 map
    @Override
    public Map<String, Object> selectOneMapItem(long code) {
        try {
            Bson filter = Filters.eq("_id", code);

            Map<String, Object> map = new HashMap<>();
            // map.put("_id", 1L);            

            FindIterable<Document> result = this.collection.find(filter);
            for(Document tmp : result){ // 1회반복
                // map 키(변수)를 마음대로 해서 추가함
                map.put("ID",    tmp.getLong("_id") );
                map.put("NAME",  tmp.getString("name") );
                map.put("PRICE", tmp.getInteger("price") );
                map.put("QTY",   tmp.getInteger("quantity") );
            }                      
            return map;
        } 
        catch (Exception e) {
            e.printStackTrace(); //오류출력
            return null;            
        }        
    }

    // 물품 1개 조회    
    @Override
    public Item selectOneItem(long code) {
        try {
            Bson filter = Filters.eq("_id", code);
            Item item = new Item();            
            FindIterable<Document> result = this.collection.find(filter);
            for(Document tmp : result){ // 1회반복
                item.setNo( tmp.getLong("_id"));
                item.setName( tmp.getString("name"));
                item.setPrice( tmp.getInteger("price"));
                item.setQuantity( tmp.getInteger("quantity"));
            }                      
            return item;
        } 
        catch (Exception e) {
            e.printStackTrace(); //오류출력
            return null;            
        }        
    }

    // 물품 전체 조회
    @Override
    public List<Item> selectListItem() {
        try {
            // 정렬조건 => 오름차순(1), 내림차순(-1)
            Bson sort = Filters.eq("_id",1);

            // 일부데이터만 가져오기 projection
            // 제외시킴(exclude), 포함시킴(include)
            Bson projection = Projections.exclude("name");

            FindIterable<Document> rows = this.collection.find().projection(projection).sort(sort);

            List<Item> list = new ArrayList<>();

            for(Document tmp : rows){
                Item item = new Item(
                    tmp.getLong("_id"),
                    null,
                    tmp.getInteger("price"),
                    tmp.getInteger("quantity")
                );
                list.add(item);
            }                                  
            return list;
        } 
        catch (Exception e) {
            e.printStackTrace(); //오류출력
            return null;            
        }          
    }

    // 조회 페이지단위로
    @Override
    public List<Item> selectListPageItem(int page) {
        try {
            Bson sort = Filters.eq("_id",1);

            // page 1 => 스킵  0, 가지고올 갯수 10
            // page 2 => 스킵 10, 가지고올 갯수 10
            // page 3 => 스킵 20, 가지고올 갯수 10
            int skip = (page-1) * 10;
            int limit = 10;

            FindIterable<Document> rows = this.collection.find().sort(sort).skip(skip).limit(limit);

            List<Item> list = new ArrayList<>();
            for(Document tmp : rows){
                Item item = new Item(
                    tmp.getLong("_id"),
                    tmp.getString("name"),
                    tmp.getInteger("price"),
                    tmp.getInteger("quantity")
                );
                list.add(item);
            }                                  
            return list;
        } 
        catch (Exception e) {
            e.printStackTrace(); //오류출력
            return null;            
        } 
    }    
}

파일명 / App.java

package com.example;

import java.util.List;

import com.example.db.ItemDB;
import com.example.db.ItemDBImpl;
import com.example.vo.Item;



// 프로그램 시작 위치
public class App {
    public static void main(String[] args) {        

        // 0. 객체 생성, 클래스명 객체명 = new 생성자();
        ItemDB obj = new ItemDBImpl();
        
        // 페이지 단위로 조회
        int page = 1;
        List<Item> list = obj.selectListPageItem(page);
        for(Item tmp : list){
            System.out.println(tmp.toString());
        };
        
        // // 물품 전체 조회
        // List<Item> list = obj.selectListItem();
        // for(Item tmp:list){
            //     System.out.println(tmp.toString());
        // };        
        
        // // 물품 1개 조회
        // Item item = obj.selectOneItem(9L);
        // System.out.println(item.getNo());
        // System.out.println(item.getName());
        // System.out.println(item.getPrice());
        // System.out.println(item.getQuantity());
        
        // // 1개 조회 map
        // Map<String,Object> map = obj.selectOneMapItem(10L);
        // System.out.println( map.get("ID"));
        // System.out.println( map.get("NAME"));
        // System.out.println( map.get("PRICE"));
        // System.out.println( map.get("QTY"));
        
        /* // 컬렉션 => 수집        
        // ex) array => ["aaa","bbb",13] // 순서대로 데이터를 수집(순차적으로 출력)
        List<String> list1 = new ArrayList<>();
        
        // ex) json => {"id":"aaa","name":"bbb", "age":"13"} // 키를 부여해서 데이터 수집 (특정한 내용을 출력할때)
        Map<String, String> map1 = new HashMap<>();
        */
        
        // // 물품변경
        // Item item = new Item(9L,"이름",5000,400);
        // int ret = obj.updateItem(item);
        // System.out.println(ret);        

        // // 물품 삭제   
        // try {  // ItemDBImpl.java 에서 throws Exception으로 App.java에서 직접 오류 검사 하도록 함
        //     int ret = obj.deleteItem(8L);
        //     System.out.println(ret);
        // } catch (Exception e) {            
        //     e.printStackTrace();
        // }
        
        // // 물품 등록
        // Item item = new Item();
        // item.setName("사과");
        // item.setPrice(2000);
        // item.setQuantity(200);

        // int ret = obj.insertItem(item);
        // System.out.println(ret);
    }
}
       
profile
당신을 한 줄로 소개해보세요

0개의 댓글