시험
물품 수정
추가
삭제
조회
테이블 하나
요약정리
insertOne 출력 결과에 따른 데이터 꺼내기
아직 selectlist 안함. map으로 만들어 본다는데 오후에 할 예정(CourseServiceImpl.java)
entity에서 변수의 타입(중요)
view쪽으로 집중공부
데이터 꺼내줄 때 어떻게 꺼내줄껀지 고민할때 아래 두개 고민하다가 결국 하나라서 first()를 씀.
cursor?
iterator?
first?
데이터 가져올때 쓰는 cursor, iterator개념 정리 해야할 듯.
List, Map, cursor, iteratro 개념 정리
https://brandpark.github.io/java/2021/01/24/iterator.html
[ JAVA ] Iterator의 내부동작 - 자바니또의 Tech선물
개요 요즘 코딩테스트 준비를 위해 알고리즘 문제들을 풀고있다. 그러던 중 옆에서 같이 공부하던 생각한대로 동작하지 않는다며 보여준 코드를 보고 이번 포스팅의 주제를 정했다. public void met
brandpark.github.io
selectOne할때 교수 정보 들고 오는 것 중요중요중요중요
쿼리문 합치기 (Filters.eq , Filters.and)
업데이트 합치기 (Updates.set, Updates.combine)
출력 결과가 이상하게 나오면
entity에 toString확인
regex 포함된 문자 찾기
Bson query = Filters.regex("name", ".*" + text + ".*");
map
selectlist
추상화 클래스
설계를 할때 함수를 만들고 그 함수의 순서 같은 것을 만들때 추상화가 좋음.
또한 추상화된 서비스에서 코드기입으로 작업 가능(인터페이스는 무조건 impl에서 해야함)
웹은 인터페이스 형식을 많이씀
안드로이드는 abstract를 많이 씀.(복잡)
오전일과
RepositoryService<T> 제너릭 클래스
package com.example.service;
import java.util.List;
import java.util.Map;
// Course
public interface RespositoryService<T> {
// 등록
public short insert( T obj );
// 수정
public short update( T obj );
// 삭제
public short delete( T obj );
// 1개 조회
public T selectOne( T obj );
// 전체 조회
public List<T> selectList( int page, String text );
// 전체 조회 (파라미터 1개)
public List<T> selectList( Map<String, Object> map );
}
CourseServiceImpl
package com.example.service;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.bson.Document;
import org.bson.conversions.Bson;
import com.example.config.MongoConfig;
import com.example.entity.Course;
import com.example.entity.Professor;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.Updates;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.InsertOneResult;
import com.mongodb.client.result.UpdateResult;
public class CourseServiceImpl implements RespositoryService<Course>{
// 생성자 => DB접속하고 collection정보 가져오기
// 교과목 저장용
private MongoCollection<Document> collection = MongoConfig.create().getConnection("courses");
// 시퀀스 저장용
private MongoCollection<Document> collectionSeq = MongoConfig.create().getConnection("counters");
// 교수
private MongoCollection<Document> collectionPro = MongoConfig.create().getConnection("professors");
// short(16) -> int(32) -> long(64)
@Override
public short insert(Course obj) {
try{
// 1. 값을 가져올 조건
Bson query = Filters.eq("id", "SEQ_COURSE_NO");
// 가져온 값 이후의 변경 조건
Bson set = Updates.inc("seq", 1);
Document doc = collectionSeq.findOneAndUpdate(query, set);
System.out.println(doc.toJson());
// 시퀀스 값 가져오기
long seq = doc.getLong("seq");
// 저장하기 위한 Document객체 생성 및 값 추가
Document doc1 = new Document();
doc1.append("_id", seq);
doc1.append("name", obj.getName());
doc1.append("point", obj.getPoint());
doc1.append("regdate", new Date());
doc1.append("professorno", obj.getProfessorno().getId());
// DB에 저장하기
InsertOneResult result = collection.insertOne(doc1);
// System.out.println(result);
if (result.getInsertedId().asInt64().getValue() == seq) {
return 1;
}
return 0;
}
catch(Exception e){
return -1;
}
}
@Override
public short update(Course obj) {
Bson query1 = Filters.eq("professorno", obj.getProfessorno().getId());
Bson query2 = Filters.eq("_id", obj.getId());
Bson query = Filters.and(query1, query2);
Bson update1 = Updates.set("name", obj.getName());
Bson update2 = Updates.set("point", obj.getPoint());
Bson update = Updates.combine(update1, update2);
UpdateResult result = collection.updateOne(query, update);
if(result.getModifiedCount() == 1L){
return 1;
}
return 0;
}
@Override
public short delete(Course obj) {
Bson query1 = Filters.eq("professorno", obj.getProfessorno().getId());
Bson query2 = Filters.eq("_id", obj.getId());
Bson query = Filters.and(query1, query2);
DeleteResult result = collection.deleteOne(query);
if(result.getDeletedCount() == 1L){
return 1;
}
return 0;
}
@Override
public Course selectOne(Course obj) {
try{
Bson query1 = Filters.eq("professorno", obj.getProfessorno().getId());
Bson query2 = Filters.eq("_id", obj.getId());
Bson query = Filters.and(query1, query2);
Document doc = collection.find(query).first();
if(!doc.isEmpty()){
Course course = new Course();
course.setId(doc.getLong("_id"));
course.setName(doc.getString("name"));
course.setPoint(doc.getInteger("point"));
course.setRegdate(doc.getDate("regdate"));
// 교수코드를 이용해서 DB에서 가져옴
Bson query3 = Filters.eq("_id", obj.getProfessorno().getId());
Document doc1 = collectionPro.find(query3).first();
Professor professor = new Professor();
professor.setId(doc1.getLong("_id"));
professor.setName(doc1.getString("name"));
professor.setRoom(doc1.getString("room"));
professor.setRegdate(doc1.getDate("regdate"));
course.setProfessorno(professor);
return course;
}
return null;
}
catch(Exception e){
e.getStackTrace();
return null;
}
}
@Override
public List<Course> selectList(int page, String text) {
// TODO Auto-generated method stub
return null;
}
@Override
public List<Course> selectList(Map<String, Object> map) {
// TODO Auto-generated method stub
return null;
}
}
collection에서 private로 써봄
// 교과목 저장용
private MongoCollection<Document> collection = MongoConfig.create().getConnection("courses");
// 시퀀스 저장용
private MongoCollection<Document> collectionSeq = MongoConfig.create().getConnection("counters");
// 교수
private MongoCollection<Document> collectionPro = MongoConfig.create().getConnection("professors");
시퀀스 사용 db에 만들어 줄 것임.
사진 참고
db.counters.insert( {id :"SEQ_COURSE_NO", seq:NumberLong(100001)})
Impl에 시퀀스 끌고오기
private MongoCollection<Document> collectionSeq = MongoConfig.create().getConnection("counters");
example> service> CourseServiceImpl.java
insert
시퀀스 이용할때 _id 아님 id임 몽고디비 확인
시퀀스 impl에서 사용 방법
// 1. 값을 가져올 조건
Bson query = Filters.eq("id", "SEQ_COURSE_NO");
// 가져온 값 이후의 변경 조건
Bson set = Updates.inc("seq", 1);
Document doc = collectionSeq.findOneAndUpdate(query, set);
서비스를 써야하는 객체가 없다
그래서 만들도록함.
// 저장하기 위한 Document객체 생성 및 값 추가
Document doc1 = new Document(); // 객체 만들기
doc1.append("_id", seq);
doc1.append("name", obj.getName());
doc1.append("point", obj.getPoint());
doc1.append("regdate", new Date());
doc1.append("professorno", obj.getProfessorno().getId());
insert에서
professorno 교수키 넣을때 기본키만 넣어야함.
doc1.append("professorno", obj.getProfessorno().getId());
insert부분에서 professorno 부분
view에서 어떻게 받아오는지 생각해봐야함
view> CourseView.java
Professor을 선언해주고(professor 선언이유는 entity 타입 선언 때문)
불러온뒤 setProfessorno를 사용하여 배열[2]에 있는 숫자만 넣어줌.
// 이렇게 쓰는 이유는 entity> course에서 professor을 professor형태로 선언했기 때문임.
Professor p = new Professor();
p.setId( Long.valueOf(str[2]));
course.setProfessorno(p); // 교수자 정보(교수번호)
update
쿼리문 합치기 (Filters.eq , Filters.and)
Bson query1 = Filters.eq("professorno", obj.getProfessorno().getId());
Bson query2 = Filters.eq("_id", obj.getId());
Bson query = Filters.and(query1, query2);
업데이트 합치기 (Updates.set, Updates.combine)
Bson update1 = Updates.set("name", obj.getName());
Bson update2 = Updates.set("point", obj.getPoint());
Bson update = Updates.combine(update1, update2);
수정
UpdateResult result = collection.updateOne(query, update);
selectOne
데이터 들고올때 아래 함수가 의미하는 것은 뭘까?
cursor?
iterator?
first?
교수코드를 가져오기 위해서 collectionPro를 만듬
private MongoCollection<Document> collectionPro = MongoConfig.create().getConnection("professors");
Professor 선언부터 중요 중요 중요 중요 중요 중요 중요 중요 중요 중요
교과목 쫙읽고
교수 정보를 들고와서 싸악 넣어서
나옴
@Override
public Course selectOne(Course obj) {
try{
Bson query1 = Filters.eq("professorno", obj.getProfessorno().getId());
Bson query2 = Filters.eq("_id", obj.getId());
Bson query = Filters.and(query1, query2);
Document doc = collection.find(query).first();
if(!doc.isEmpty()){
Course course = new Course();
course.setId(doc.getLong("_id"));
course.setName(doc.getString("name"));
course.setPoint(doc.getInteger("point"));
course.setRegdate(doc.getDate("regdate"));
// 교수코드를 이용해서 DB에서 가져옴
Bson query3 = Filters.eq("_id", obj.getProfessorno().getId());
Document doc1 = collectionPro.find(query3).first();
Professor professor = new Professor();
professor.setId(doc1.getLong("_id"));
professor.setName(doc1.getString("name"));
professor.setRoom(doc1.getString("room"));
professor.setRegdate(doc1.getDate("regdate"));
course.setProfessorno(professor);
return course;
}
return null;
}
catch(Exception e){
e.getStackTrace();
return null;
}
}
오후일과
menu5
map
키도 보관, 데이터도 보관하고 싶으면 map
else if(menu == 5){
// 배열에 해당 순차적으로 데이터를 보관하는 용도
// List<String> list = new ArrayList<String>();
// list.add("데이터추가");
System.out.print("ex)페이지,검색어(1,가나다) => ");
String[] str = scanner.next().split(",");
// 키와 값의 구조, 순차적데이터 아님.
// 키가 중복되면 덮어쓰기가 됨.
// Map => JSON => {"page":1, "text","검색어"}
Map<String, Object> map = new HashMap<>();
map.put("page", Integer.valueOf(str[0]));
map.put("text", str[1]);
List<Course> courses = courseService.selectList(map);
for(Course course : courses) {
System.out.println(course.toString());
}
// // 꺼낼때 서비스로 넣어줌
// int page = (int) map.get("page");
// String text = (String) map.get("text");
}
CourseServiceImpl.java
selectList
@Override
public List<Course> selectList(int page, String text) {
Map<String, Object> map = new HashMap<>();
map.put("page", page);
map.put("text", text);
return selectList(map); //다른메소드 호출하기
}
@Override
public List<Course> selectList(Map<String, Object> map) {
try{
// 꺼낼때 사용
int page = (int) map.get("page");
String text = (String) map.get("text");
Bson query = Filters.regex("name", ".*" + text + ".*");
Bson sort = Filters.eq("_id", -1); // 과목코드 내림차순
FindIterable<Document> list = collection.find(query).sort(sort).skip((page-1)*10).limit(10);
List<Course> retList = new ArrayList<>();
for(Document doc : list){
Course course = new Course();
course.setId(doc.getLong("_id"));
course.setName(doc.getString("name"));
course.setPoint(doc.getInteger("point"));
course.setRegdate(doc.getDate("regdate"));
// 교수코드를 이용해서 DB에서 가져옴
Bson query3 = Filters.eq("_id", doc.getLong("professorno"));
Document doc1 = collectionPro.find(query3).first();
Professor professor = new Professor();
professor.setId(doc1.getLong("_id"));
professor.setName(doc1.getString("name"));
professor.setRoom(doc1.getString("room"));
professor.setRegdate(doc1.getDate("regdate"));
course.setProfessorno(professor);
retList.add(course);
}
return retList;
}
catch(Exception e){
return null;
}
}
regex 포함된 문자 찾기
Bson query = Filters.regex("name", ".*" + text + ".*");
selectList
아래에 쓰던 map 호출해서 써줌
@Override
public List<Course> selectList(int page, String text) {
Map<String, Object> map = new HashMap<>();
map.put("page", page);
map.put("text", text);
return selectList(map); //다른메소드 호출하기
}
추상화 클래스
클래스인데 인터페이스처럼 씀
service> ClassRoomService.java
package com.example.service;
import java.util.List;
// 추상화 클래스 => 구현, 변수성정등등 가능
// 인터페이스 => 구현x, 변수설정x
public abstract class ClassRoomService<T> {
public abstract int insert(T obj);
public abstract int update(T obj);
public abstract int delete(T obj);
public abstract List<T> selectList(T obj);
public abstract T selectOne(T obj);
public void myPrint1(){
System.out.println("myPrint1");
}
public void myPrint2(){
System.out.println("myPrint2");
}
public abstract void myPrint3();
public void myPrint(){
myPrint1(); // myPrint1
myPrint3(); // 만드는 내용에 따라 출력
myPrint2(); // myPrint2
}
}
ClassRoomServiceImpl.java
package com.example.service;
import java.util.List;
// 추상화 클래스 => 구현, 변수성정등등 가능
// 인터페이스 => 구현x, 변수설정x
public abstract class ClassRoomService<T> {
public abstract int insert(T obj);
public abstract int update(T obj);
public abstract int delete(T obj);
public abstract List<T> selectList(T obj);
public abstract T selectOne(T obj);
public void myPrint1(){
System.out.println("myPrint1");
}
public void myPrint2(){
System.out.println("myPrint2");
}
public abstract void myPrint3();
public void myPrint(){
myPrint1(); // myPrint1
myPrint3(); // 만드는 내용에 따라 출력
myPrint2(); // myPrint2
}
}
여기도 추상화할 수 있는데
추상화가 계속 하지말고, 끊어냄
public abstract class ClassRoomServiceImpl extends ClassRoomService<ClassRoom>
public class ClassRoomServiceImpl extends ClassRoomService<ClassRoom>
abstract를 또 붙여주면 추상화가 또 됨
설계를 할때
함수를 만들고
그 함수의 순서 같은 것을 만들때
추상화가 좋음.
print3또한 추상화라 impl로 작성
override로 myprint1가져와봄
super.myPrint1이 생김
수퍼 없애면 서비스에서 짯던 print1이 출력 안됨.
코드 추가하면 부모일 + 내가 시키고 싶은 일이 실행됨.
웹은 인터페이스 형식을 많이씀
안드로이드는 abstract를 많이 씀.(복잡)
실습
package com.example.service;
import java.util.List;
import com.example.entity.ClassRoom;
public class ClassRoomServiceImpl extends ClassRoomService<ClassRoom>{
@Override
public int insert(ClassRoom obj) {
// TODO Auto-generated method stub
return 0;
}
@Override
public void myPrint1() {
super.myPrint1(); // 부모의 일을 수행
System.out.println("myPrint1에 추가된 기능");
}
@Override
public int update(ClassRoom obj) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int delete(ClassRoom obj) {
// TODO Auto-generated method stub
return 0;
}
@Override
public List<ClassRoom> selectList(ClassRoom obj) {
// TODO Auto-generated method stub
return null;
}
@Override
public ClassRoom selectOne(ClassRoom obj) {
// TODO Auto-generated method stub
return null;
}
@Override
public void myPrint3() {
System.out.println("BBBBBBBBBBB");
}
}
'java' 카테고리의 다른 글
42일차 가장 어려웠던 날, 실습 문제(완료) mqtt, item, book, mqtt, ArrayList로 단편적 db, 연동 (0) | 2022.08.23 |
---|---|
국비 코딩 풀스택 수업 41일차 실시간 채팅 (0) | 2022.08.22 |
39일차 오후 개인 공부(따로 보충) (0) | 2022.08.19 |
국비 코딩 풀스택 수업 39일차 틀린거 많은 날, app제외 실행, 형변환, List사용법 및 개념, entity의 이동(mvc) (0) | 2022.08.18 |
국비 코딩 풀스택 수업 38일차 lombok, static, 서버관리 폴더따로, entity, ArrayList (1) | 2022.08.18 |