구현하는 자세한 설명은 전편에 있음 ( http://winmargo.tistory.com/117 )

이번 글에서는 전편에 다못한 Statement 처리를 위한 다양한 메소드들의 사용법을 살펴보자.

메소드에 쿼리문에 값을 전달하는 방법에는  인덱스 방식과, 네임드 방식이 있다

인덱스는 전편에서도 했고, 쉽기때문에 넘어가고

여기서는 네임드 방식을 쓰겠다.

네임드 방식은 인덱스에서 쿼리에 ? 를 넣은것과같이, ':변수명 또는 :맵의키값' 형식으로 넣는다 .
':' 콜론을 붙이면 되는것이다.

NamedParameterJdbcTemplate 에는 이름 기반의 파라미터를 설정할 수 있도록 해준다.

그 방식에는 두가지 방식이 있는데,

1. Map 을 이용한 파라미터 값 설정

말 그대로 맵을 이용한다. 쿼리문내에 ':' 콜론을 이용해서 키값과 같이 써주고
맵을 인자로 넣어주면, 매핑된다.


2. SqlParameterSource 를 이용한 파라미터 값 설정( 실제는 BeanPropertySqlParameterSource 클래스)

SqlParameterSource 는 인터페이스이기 때문에 실제로 사용할때는 구현한 클래스를 사용한다.

그 클래스가 바로 BeanPropertySqlParameterSource  이다.

생성할 때 인자로 자바빈 클래스를 넣어주면, 자동으로 Bean 클래스 변수와 쿼리안의 : 콜론과 붙여쓰는 이름을

같게 해주면 자동으로 매핑된다.

(MapSqlParameterSource 클래스도 있긴한데 쓸일이 없을것같다.. 불편하다)




이제부터 볼 예제들은  SimpleJdbcTemplate 을 이용한 것이다.



아래 코드는 Map 방식과 BeanPropertySqlParameterSource가 다들어있는 아주 중요한 코드다.
눈 크게 뜨고 살펴보자!!
'
public int setReply(ItemBean itemBean, int originalNumber, int depth){
		
		
		int state = 0;
		
		int firstNumber = originalNumber - 1;
		
		itemBean.setArticle_num(firstNumber);
		
		int lastNumber = firstNumber - (firstNumber % 1000) + 1;
		
		paramSource = new BeanPropertySqlParameterSource(itemBean);
		
		Map map = new HashMap();
		
		map.put("first", firstNumber);
		
		map.put("end", lastNumber);
		
		
		//  - map 방식
		sql = "UPDATE margo SET article_num = article_num - 1 WHERE article_num BETWEEN :end AND :first";
		
		template.update( sql, map);	
		
	
				
		//  - sqlParameterSource 방식
		sql = "INSERT INTO margo " + 
			  "VALUES(:article_num, :id, :title, :body, :password, :count, :depth, sysdate, :fileName)";
		
		return template.update( sql, paramSource);
		
	} // setReply() end;
	
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

23라인을 보면, 쿼리에 값을 주입할때, (BETWEEN :end AND :first) 라고 되어있다

바로 맵으로 end 와, first 키를 생성해 놓은것을, 키값을 콜론과 같이 쓰면

맵에서 자동으로 뽑아 쓴다.


그 다음은 31라인은 BeanPropertySqlParameterSource() 메소드를 이용해서 값을 주입하는 방식이다.

 13라인에서 paramSource에 생성자로 메소드 인자로 넘겨받은 자바빈 파일을 넣어주면,

자동으로 자바빈안의 변수와 값을 매핑 시켜준다.

위 두가지 방식인 네임드(이름기반) 파라미터방식은 여러모로 쓸모가 많을것 같다. 잘 배워두자~ 

 




아래는 간단한 컬럼하나 가지고오는 예제
_
	// 총글의 개수를 가지고온다. 안에 사용한 두 가지 코드는 결과는 동일하다.
	public int getArticleCount() {
	
		sql = "SELECT COUNT(*) FROM margo";
		
		
		// Object 로 리턴값을 명시해주고 컬럼 하나를 받아온다.
		totNum = template.queryForObject( sql, Integer.class);
		 

		// queryForInt 메소드를 써서 int값 만 받아올때 쓸 수 있다.
		totNum = template.queryForInt(sql);
		
		return totNum;
		
	}
	
 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

코드만 봐도 대충 알수있을 만큼 간단하다.
어떤 객체 하나를 받아올때는 QeuryForObject 를 쓰고, 리턴타입을 지정해주려면,
9라인의 방식을 쓴다. 여기서는 int 지만, 아래 예제에서 클래스를 쓰는법을 설명하겠다.
정수만 받을때는 13라인을 쓰면된다. 






QueryForObject 로 클래스(자바빈)를 리턴받는 법
<T> T
queryForObject(String sql, RowMapper<T> rm, Object... args) 
.
	public ItemBean getContent(final int contentNum) {
		
		sql = "SELECT * FROM margo WHERE article_num=?";
			
		// 익명클래스 이용한 방법.
		return template.queryForObject( sql, 
									
			new RowMapper(){
					
					@Override
					public ItemBean mapRow(ResultSet rs, int rowNum) throws SQLException{
						
						ItemBean itemBean = new ItemBean();
						
						itemBean.setArticle_num(rs.getInt("article_num"));
						itemBean.setId(rs.getString("id"));
						itemBean.setTitle(rs.getString("title"));
						itemBean.setBody(rs.getString("body"));
						itemBean.setCount(rs.getInt("hit"));
						itemBean.setDepth(rs.getInt("depth"));
						itemBean.setPassword(rs.getString("password"));
						itemBean.setWrite_date(rs.getTimestamp("write_date"));
						itemBean.setFileName(rs.getString("filename"));
					
						return itemBean;
					
					}// mapRow() end;
					
			}, // RowMapper 클래스 여기까지임.
			
			new Object[]{ contentNum });
		
	}
 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

익명클래스 방식을 이용해서 리턴 클래스를 지정해주고, ResultSet 을 이용해서 리턴받는 방법이다.

RowMapper클래스는 mapRow() 메소드를 오버라이드 해야된다.
(35라인은 무시, 코드하이라이트 버그같은데, 제네릭을 태그로인식해서 지맘대로 닫는코드를 생성...짜증난다 ㅡㅡ;) 






아래 코드는 UPDATE 메소드를 이용해서 DB에 자료를 Insert 하는 쓰는 법이다.
(SQL쿼리 update와 헷갈리면 안된다. 쓰는건 전부 update() 메소드다)
int update(String sql, Object... args)
public int setContent(ItemBean itemBean){
		
		int state = 0;
		
		String sql = "INSERT INTO margo VALUES(margo_sequence.NEXTVAL,?,?,?,?,?,?,sysdate, ?)";
		
		
		state = template.update( sql, 
							new Object[]{ itemBean.getId(),
											itemBean.getTitle(),
											itemBean.getBody(),
											itemBean.getPassword(),
											itemBean.getCount(),
											itemBean.getDepth(),
											itemBean.getFileName()});
		
		return state;
	}
	

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

update() 메소드가 나왔는데, 
쿼리에 값 주입방식은 인덱스 기반 파라미터 방식으로 집어넣고 있다.
뭐...간단하다  .


YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST