[구디아카데미][IT국비지원] 4주차 where 조건문 알고리즘 짜보기

띵거니·2023년 4월 27일
0

이전에 배웠던 for each, if, ArrayList를 이용해서 간단하게 sql문을 짤 수 있는 알고리즘을 짜보았다.

수업에선 if문으로 들어오는 parameter값에 따라 if문으로 분기를 줘서 sql문을 나눴는데, 들어오는 값이 많아질수록 분기가 엄청 늘어나기때문에 해결할 방법이 없을까 생각해서 만들어 보았다.

먼저 parameter 값을 받아 올 수 있게 주소창에 변수명과 변수 값을 넣을 wherePar를 만든다.

// where에 들어가는 조건어 따라 달라지는 파라미터를 자동적으로 주소에 넣기위해 만든 변수
// 빈값을 넣을경우 null값으로 인식한다 그래서 오류남 따라서 의미없는 &를 넣음
	String wherePar = "&";
	
// +=을 사용함으로 나중에 다른 변수가 추가될때 if (변수 != null){ wherePar += 내용}만 넣으면 자동으로 추가된다
	if (!"".equals(gender)) {
		wherePar += "&gender=" + gender;
	}
	if (!"".equals(empNoStart)) {
		wherePar += "&empNoStart=" + empNoStart;
	}
	if (!"".equals(empNoEnd)) {
		wherePar += "&empNoEnd=" + empNoEnd;
	}

	System.out.println(wherePar + " <-wherePar 값");

ArrayList에 where 뒤에 올 조건들을 넣어준다.

// and 를 마지막 빼고 넣기위해 ArrayList를 써서 값을 만들어둠
	ArrayList<String> whereSqlArray = new ArrayList<String>();
	if (!"".equals(gender)){
		// gender 값 앞뒤로 ' 를 안달아두면 문자로 인식안함 문자는 전부 해줘야함
		String s = " gender=" + "'" + gender + "'";
		whereSqlArray.add(s);
	}
    
// empNoStart의 값과 empNoEnd 값이 둘다 null이 아닐경우 between으로 입력
// 아닌경우 따로 입력되게 해둠
	if (!"".equals(empNoStart)
			&& !"".equals(empNoEnd)) {
		String s = " emp_no BETWEEN " + empNoStart + " AND " + empNoEnd;
		whereSqlArray.add(s);
	} else {
		if (!"".equals(empNoStart)){
			String s = " emp_no >= " + empNoStart;
			whereSqlArray.add(s);
		}
		if (!"".equals(empNoEnd)){
			String s = " emp_no <= " + empNoEnd;
			whereSqlArray.add(s);
		}
	}
    
 // whereSqlArray에 알맞게 들어갔는지 확인하기 위함
	System.out.println(whereSqlArray.size() + " <- ArrayListSize");

foreach 문을 이용해서 마지막 조건뒤에만 and가 안나오게 whereSql 변수에 값을 넣는다.

// 빈 공백을 기본값으로 넣어줌 앞에있는 쿼리 구문과 띄워두기 위함
	String whereSql = " ";
	
// foreach 문을 이용해서 whereSql에 값을 이어줌
// 마지막위치에 and를 빼주기위해 j값을설정
	int j = 0;
	for (String s : whereSqlArray) {
		if (j < whereSqlArray.size() - 1){
			whereSql += s + " and";
			j++;
		} else { 
			whereSql += s;
		}
	}
// whereSql 문이 제대로 짜졌나 디버깅
	System.out.println(whereSql + " <- whereSql");

whereSqlArray.size()가 0이면 where조건이 없다는 뜻이므로 where조건문이 없는 쿼리문으로 가고, 아닐경우 있는 쿼리문으로가서 값을 대입해서 쿼리문을 완성한다.

// 한페이지 나타내는량 변수 설정
	int pagePerView = 10;
	int limitStart = (currentPage - 1) * pagePerView;
	
	// if문으로 분기를 주기때문에 생명주기 때문에 미리 선언함
	String sql1 = null;
	PreparedStatement stmt1 = null;
	
// ArrayList의 크기가 0이면 where 문에 들어갈것이 아무것도 없음을 뜻함
	if (whereSqlArray.size() == 0) {
		// 쿼리문 짜기
		sql1 = "select emp_no empNo, birth_date birthDate, first_name firstName, last_name lastName, gender, hire_date hireDate from employees order by "
						+ col
						+ " "
						+ ascDesc
						+ " limit ?, ?";
		stmt1 = conn.prepareStatement(sql1);
		stmt1.setInt(1, limitStart);
		stmt1.setInt(2, pagePerView);
	} else {
		sql1 = "select emp_no empNo, birth_date birthDate, first_name firstName, last_name lastName, gender, hire_date hireDate from employees"
						+ " where"
						+ whereSql
						+ " order by "
						+ col
						+ " "
						+ ascDesc
						+ " limit ?, ?";
		stmt1 = conn.prepareStatement(sql1);
		stmt1.setInt(1, limitStart);
		stmt1.setInt(2, pagePerView);
	}
	
	
	System.out.println(stmt1 + " <- empList stmt");
	ResultSet rs1 = stmt1.executeQuery();
	System.out.println(rs1 + " <- empList rs");
profile
발효 중인 국비생

0개의 댓글