JDBC 2일차

0

데이터 입력하기와 PreparedStatement

  • 이번에 한 것은 DB에 값을 Insert 하는 것이다.
String title = "TEST2";
		String writerId = "newlec";
		String content = "hahaha";
		String files = "";
		String sql = "INSERT INTO notice (" + "    id," + "    title," + "    writer_id," + "    content," + "    files"
				+ ") VALUES (notice_id_seq.nextval,?,?,?,?)";

		Class.forName(driver);
		Connection con = DriverManager.getConnection(url, user, password);
		//Statement st = con.createStatement();
		PreparedStatement st = con.prepareStatement(sql);
		st.setString(1, title);
		st.setString(2, writerId);
		st.setString(3, content);
		st.setString(4, files);
		
		int result = st.executeUpdate();
		
		System.out.println(result);
  • 값을 Insert 할 때는 prepareStatement()를 써야하고 이 경우 ResultSet을 따로 만들 필요가 없다.
  • SELECT를 하면 값을 반환하는 것이지만 INSERT는 값을 넣는 행위이기 때문이다.
  • 이 때는 int 값이 반환되는데 이는 성공한 행의 개수이다.
    <setString() 함수>
  • String의 형태로 sql 쿼리를 작성할 때 INSERT할 속성이 많다면 코드가 굉장히 복잡하고 난잡해 보일 것이다.
  • 이때 사용하는 것으로 첫번째 인자는 물음표의 INDEX이다. 이는 1부터 시작한다.
  • 두번째 인자는 삽입할 값이다.

데이터 수정을 위한 쿼리 준비하기

String sql = "UPDATE NOTICE"
				+ " SET"
				+ "    TITLE=?,"
				+ "    CONTENT=?,"
				+ "    FILES=?"
				+ "WHERE ID=?";

		Class.forName(driver);
		Connection con = DriverManager.getConnection(url, user, password);
		//Statement st = con.createStatement();
		PreparedStatement st = con.prepareStatement(sql);
		st.setString(1, title);
		st.setString(2, content);
		st.setString(3, files);
		st.setInt(4, id);
		
		int result = st.executeUpdate();
		
		System.out.println(result);
		

		st.close();
		con.close();
  • 위에서 INSERT문을 UPDATE문으로 바꿨을 뿐이고 그에대한 setString(), setInt()를 설정해주었다.
  • 여기서 주의할 점은 sql문을 작성할 때인데 SQL문이 +로 연결되어있기 때문에 띄어쓰기에 주의해야한다.
  • 만약 SET앞에 띄어쓰기가 없다면 NOTICESET으로 붙어버려 오류가 발생한다. 이런점에서 주의해야한다.

데이터 삭제하기

  • SQL문을 DELETE로 작성하면 된다.
String sql = "DELETE NOTICE WHERE ID=?";

		Class.forName(driver);
		Connection con = DriverManager.getConnection(url, user, password);
		//Statement st = con.createStatement();
		PreparedStatement st = con.prepareStatement(sql);
		st.setInt(1, id);

CRUD를 담당하는 NoticeService 생성하기

?. CRUD란?

  • 대부분의 컴퓨터 소프트웨어가 가지는 기본적인 데이터 처리 기능인 Create(생성), Read(읽기), Update(갱신), Delete(삭제)를 묶어서 일컫는 말이다.
  • 이전에 강의에서는 받고자하는 테이블의 속성들을 하나씩 다 받아왔지만 이를 하나의 클래스로 생성하고 받아오고 List로 저장하면서 함수로 만들었다.

<Notice.java>

package com.newlecture.app.entity;

import java.sql.Date;

public class Notice {
	private int id;
	private String title;
	private String writedId;
	private Date regDate;
	private String content;
	private int hit;
	
	public Notice() {
		
	}
	
	public Notice(int id, String title, String writedId, Date regDate, String content, int hit) {
		this.id = id;
		this.title = title;
		this.writedId = writedId;
		this.regDate = regDate;
		this.content = content;
		this.hit = hit;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getWritedId() {
		return writedId;
	}

	public void setWritedId(String writedId) {
		this.writedId = writedId;
	}

	public Date getRegDate() {
		return regDate;
	}

	public void setRegDate(Date regDate) {
		this.regDate = regDate;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	public int getHit() {
		return hit;
	}

	public void setHit(int hit) {
		this.hit = hit;
	}
	
	
	
}

<getList()>

public List<Notice> getList() throws ClassNotFoundException, SQLException{
		
		String driver = "oracle.jdbc.driver.OracleDriver";
		String url = "jdbc:oracle:thin:@localhost:1521/xepdb1";
		String user ="NEWLEC";
		String password = "**********"; // 비밀번호 가림
		String sql = "SELECT * FROM NOTICE";
		
		Class.forName(driver);
		Connection con = DriverManager.getConnection(url, user, password);
		Statement st = con.createStatement();
		ResultSet rs = st.executeQuery(sql);
		
		List<Notice> list = new ArrayList<Notice>();
		
		while(rs.next()) {
			
			int hit = rs.getInt("HIT");
			/*
			if(hit<10)
				continue;*/
			
			int id=rs.getInt("ID");
			String title = rs.getString("TITLE");
			String writedId = rs.getString("WRITER_ID");
			String content = rs.getString("CONTENT");
			Date regDate = rs.getDate("REGDATE");
			
			Notice notice = new Notice(
					id,
					title,
					writedId,
					regDate,
					content,
					hit
					);
			
			list.add(notice);
		}
		
		
		rs.close();
		st.close();
		con.close();
		
		return list;
	}

SQL 페이지 개념

  • 일반적으로 웹 사이트에서 게시판의 글을 불러올 때 등록된 시간순서대로 올라온다.
  • SQL에서 일련번호로 사용할 수 있는 개념은 ROWNUM이다.
    등록시간대로 정렬 -> ROWNUM열 추가 -> WHERE절로 필터링
  • 위의 순서대로 이뤄져야 한다.
SELECT * FROM 
(SELECT ROWNUM NUM, N.* FROM 
    (SELECT * FROM NOTICE ORDER BY REGDATE DESC) N)
WHERE NUM BETWEEN 2 AND 3;
  • 서브쿼리가 2개가 필요하다.

  • 하지만 위의 SQL쿼리를 코드로 입력하기엔 좀 길다고 느껴질 수도 있다.

  • 여기서 사용할 수 있는것이 바로 VIEW이다.

  • 위의 쿼리를 뷰로 생성하고 이를 조회하게하면 코드가 굉장히 간단하게된다.

CREATE VIEW NOTICE_VIEW
AS
SELECT * FROM 
(SELECT ROWNUM NUM, N.* FROM 
    (SELECT * FROM NOTICE ORDER BY REGDATE DESC) N);

0개의 댓글