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);
}
}