DB에 값 을 넣을때 INSERT INTO 를 이용해서 값을 넣을때

sqlMap 에서 넣을려면 ,

<insert id="insertBbs" parameterClass="bbsvo">
<selectKey keyProperty="idx" resultClass="int">
SELECT BBS_NEW_IDX.NEXTVAL as idx FROM DUAL
</selectKey>
INSERT INTO BBS 
(idx, subject, writer, writedate, content, s_file, pwd, readHit, ip,re_level)
VALUES 
(#idx#, #subject#, #writer#, sysdate, #content#, #s_file#, #pwd#, #readHit#, #ip#,#re_level#)
</insert>


위 처럼 이런 코드가 있다고 치면, 지저분하지 않은가?

이런 작업이 많아지면? 추가해야되면? 유지보수가 지랄같아진다.


이런걸 편하게 하기위해서 준비된게 있다!!            

<parameterMap>

바로 코드를 보자.

<typeAlias alias="article" type="Struts_BBS.ItemBean"/>

<parameterMap id="setContent" class="article">

    <parameter property="id"             jdbcType="VARCHAR"/>    // 1

<parameter property="title"           jdbcType="VARCHAR"/>   //  2
<parameter property="body"         jdbcType="VARCHAR"/>      ....
<parameter property="password"  jdbcType="VARCHAR"/>
<parameter property="count"        jdbcType="NUMBER"/>
<parameter property="depth"        jdbcType="NUMBER"/>
<parameter property="fileName"   jdbcType="VARCHAR"/>  // 7
</parameterMap>


딱 봐도 그냥 알 것 같지 않은가?

프로퍼티는 자바빈의 변수명이고, jdbcType 은 컬럼타입이다.

저런식으로 해주면 "setContent"를 parameterMap 에서 부르면 알아서 매핑되어서 순서대로 

자바코드에서 preparedStatement 를 이용해서 .setString(index, "value") 하듯이

자기가 알아서 파라미터가 코딩된 순서대로 그냥 들어간다. 



그럼 어떻게 불러쓰는지 함보자.

<insert id="setContent" parameterMap="setContent" >
INSERT INTO margo 
VALUES(margo_sequence.NEXTVAL,?,?,?,?,?,?,sysdate, ?)
</insert>


맨위에 그 지저분한 코드가 이렇게 변했다...

VALUES 안에 '?' 들에 차례로 프로퍼티 값이 들어가서 글이 써지게 되겠음.



머 호출 코드는 그냥
(ItemBean)this.queryForObject("getContent", new Integer(contentNum)); 












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




DAOManager 에서 생성된 실제 DAO 작업을 처리할 클래스의 메소드가 실행되면

그에 해당하는 SQL 이 정의되어 있는 XML 파일이 실행될 텐데

실행시키면서 인자값을 던져 줄 수있다. 클래스가 됐던, 기본형식 이 됐던.





* 아래파일은 실제 수행하는 클래스이다.*
package Struts_BBS;



import java.util.ArrayList;

import com.ibatis.dao.client.DaoManager;
import com.ibatis.dao.client.template.SqlMapDaoTemplate;

public class IBATISDAOimpl extends SqlMapDaoTemplate implements IBATISDAO {

	// 생성이되면서, 
	// 저렇게 설정해놓은 IBATISDAOimpl 클래스가 인자로 들어온다??????
	public IBATISDAOimpl(DaoManager daoManager) {
		super(daoManager);
		// TODO Auto-generated constructor stub
	}

	@Override
	public ArrayList getArticles(int index) {
		// TODO Auto-generated method stub
		return (ArrayList)queryForList("Allarticles", index);
	}

}

위 코드에서 처럼 


queryForList("Allarticles", index);


xml 의 ID 와 일치되는 스트링값과, 그 인자로 int 값을 넘겨주고있다.

이제 xml 파일에서 저 인자값을 빼다쓰는 작업을 해보자.  






*아래는 SQL 작업을 수행하는 XML 이다.*

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/dao-2.dtd">


<sqlMap>

<!-- Struts_BBS.ItemBean 클래스를 alias 속성을 줘서 artcle 이라는 이름으로 쓰겠다고 정의 -->

<typeAlias alias="article" type="Struts_BBS.ItemBean"/>

<!-- 긴 sql 문이나 자주쓰는 sql문장을 sql 엘리먼트를 이용해서 정의 -->

<sql id="select-all-index">

SELECT * FROM 

(SELECT ROWNUM rnum,A.*  

FROM 

(SELECT * FROM margo ORDER BY article_num DESC) A ) 

</sql>

<select id="Allarticles" parameterClass="int" resultClass="article">

  <include refid="select-all-index"/>

WHERE rnum BETWEEN #index# + 1 AND  #index# + 10

 

</select>


</sqlMap>


위코드에서 parameterClass="int" 처럼 파라미터를 int 형으로 받겠다고 선언하면 int 가 되고 

저기에 클래스를 쓴다면 클래스가 된다. 일단은 int 형으로 받을때는 #index#
형식으로 써주면 넘어온 값을 쓸 수있다. (index 로 넘겼다고, index 로 쓰지않아도 되더라..#a# 해도 값이 나오긴 마찬가지임, 단 기본타입만 되는듯)


클래스를 쓰는 방법은 



만약 맵을 넘긴다고 치자.

map.put("a", 1);

    map.put("b", 20);


그러면 저걸 xml 에서 뽑아 쓸때는 

parameterClass 에는 map 클래스를 써줘야한다. 

parameterClass="java.util.Map"

 이렇게 설정해주고 쓸때는 맵에 KEY 값을 지정한 이름을 #KeyName# 하면 값이 뽑힌다.

<select id="Allarticles" parameterClass="java.util.Map" resultClass="article">
<include refid="select-all-index"/>
 
WHERE rnum BETWEEN #a# AND  #b#
 
</select>




















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