<select id="getPerson" parameterClass=”int” resultClass="xml" xmlResultName=”person”>
SELECT
PER_ID as id,
PER_FIRST_NAME as firstName,
PER_LAST_NAME as lastName,
PER_BIRTH_DATE as birthDate,
PER_WEIGHT_KG as weightInKilograms,
PER_HEIGHT_M as heightInMeters
FROM PERSON
WHERE PER_ID = #value#
</select>
위 select 구문은 다음 구조의 XML객체를 생성할 것이다.
<person>
<id>1</id>
<firstName>Clinton</firstName>
<lastName>Begin</lastName>
<birthDate>1900-01-01</birthDate>
<weightInKilograms>89</weightInKilograms>
<heightInMeters>1.77</heightInMeters>
</person>
<parameterMap id=”insert-product-param” class=”com.domain.Product”>
<parameter property=”id”/>
<parameter property=”description”/>
</parameterMap>
<insert id=”insertProduct” parameterMap=”insert-product-param”>
insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (?,?)
</insert>

com.domain.Product 클레스로 넘어온값을
파라메타를 다시 제정의한다 순서를 정한다.
그후
인서트 부분에
? ?
 순서대로 들어간다

insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (id값이들어오고,description값이온다)



<!--  테이블 구조와 where 구조를 블럭화 한다 -->
<sql id="selectItem_fragment">
FROM items
WHERE parentid = 6
</sql>
<!-- 셀렉트 문 밑에 iclude 를 이용하여 붙여 넣기했다 -->
<select id="selectItemCount" resultClass="int">
SELECT COUNT(*) AS total
<include refid="selectItem_fragment"/>
</select>

<select id="selectItems" resultClass="Item">
SELECT id, name
<include refid="selectItem_fragment"/>
</select>


<!-- 파라메타 있는 구분도 가능 하다 -->

<sql id="selectItem_fragment">
FROM items
WHERE parentid = #value#
</sql>
<select id="selectItemCount" parameterClass="int" resultClass="int">
SELECT COUNT(*) AS total
<include refid="selectItem_fragment"/>
</select>
<select id="selectItems" parameterClass="int" resultClass="Item">
SELECT id, name
<include refid="selectItem_fragment"/>
</select>


maxRequests - 실행되는 쓰레드 갯수
maxSessions -
maxRequests   작게 maxTransactions 크게 설정한다. 최대치줄이면 메모리 사용량을 줄일수있다.
이유 - DB에 맺는 세션인데 생성자를 생성하는거다 컴퓨터에 가장 많은 부하를 일으키는것이
1. 파일 읽고 쓰기
2. 네트워크 요청 커넥션
3. 기타 IO
일명 IO라고 하겠다.
IO를 미리 맺어놓는 역활을 하는것이 Session 인데.. 이분분에는 생성자가 생기고 매모리가 추가된다 이때문에 매모리 가 늘어날수박에없다.
DB의 세션 한계도 한번 체크해보자 .!!
maxTransactions -
이것은 한꺼번에 SqlMapClient.startTransaction()에 들어갈수 있는 쓰레드
의 최대갯수이다.  maxSessions보다 작거나 같고 maxRequests보다 작아야함
이것은 DB의에 명령을 한번에할수있는부분이다.. 셀렉트는 시간이 오래걸리고 인서트는 금방한다. 모 차이는 종종있겠지만 .이런 부분을 한거번에 처리하는 갯수

cacheModelsEnabled -
이 셋팅은 SqlMapClient 를 위한 모든 캐쉬모델을 가능하게 하거나 가능하지 않게 한다. 이것은 디버깅시 도움이 된다.
enhancementEnabled -
 
이 셋팅은 향상된 늦은(lazy)로딩처럼 최적화된 자바빈즈 속성 접근을 위해 런
타임시 바이트코드 향상을 가능하게 한다.

useStatementNamespaces -
이 셋팅을 가능하게 하면 당신은 sqlmap이름과 statement이름으로 구성된 전
체적인 이름(fully qualified name)으로 매핑 구문를 참조해야 한다.


 
 


<html>
<head>
 <title></title>
 <script type="text/javascript">
 
 function commify(obj) {
  var n = obj.value;
  n = unNumberFormat(n);
    var reg = /(^[+-]?\d+)(\d{3})/;   // 정규식
    n += '';                          // 숫자를 문자열로 변환
    while (reg.test(n))
      n = n.replace(reg, '$1' + ',' + '$2');
   
    obj.value = n;     
 }

 function numberFormat(obj) {
  var pattern = /(-?[0-9]+)([0-9]{3})/;
  while(pattern.test(num)) {
   num = num.replace(pattern,"$1,$2");
  }
  return num;
 }

 //콤마제거
 function unNumberFormat(num) {
  return (num.replace(/\,/g,""));
 }  
 
</script>


 <input type=text name='aaaa' onkeyup="commify(this)"/>
</head>
<body>

</body>
</html>

여기저기 퍼와서 만들었다....


[ StringTokenizer 이용 ]

예제>
  String str = "MouseVM,,StringTokenizer";
  StringTokenizer tokens = new StringTokenizer( str, "," );를 사용 할 경우
 
  for( int x = 1; tokens.hasMoreElements(); x++ )
  {
    System.out.println( "문자(열) " + x + " : " + tokens.nextToken() );
  }

결과>
  문자(열) 1 : MouseVM
  문자(열) 2 : StringTokenizer


[ Split 를 이용 ]

예제>
  String str = "MouseVM,,Slpit";
  String[] values = str.split(",");

  for( int x = 0; x < values.length; x++ )
  {
    System.out.println( "문자(열) " + (x+1) + " : " + values[x] );
  }

결과>
  문자(열) 1 : MouseVM
  문자(열) 2 :
  문자(열) 3 : Slpit

이 두가지의 차이점은, StringTokenizer 는 값이 없는것은 무시 한다는 점입니다.
즉, 값이 없어도 처리를 하고 싶을경우 split를 이용하고, 그외의 경우는 StringTokenizer 를 사용하면 됩니다.

출처 :
http://cafe.naver.com/pgzoo.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=14


※ 주의사항
문자열을 나누기 위해 Split 함수를 쓸때 주의할 사항이 있습니다.
저도 오늘 사용하면서 알게 되었는데요~

String의 멤버함수들 중

replaceAll ( 정규식 , 대체문자열 )
split ( 정규식 )
matches ( 정규식 )

과 같이 정규식을 인수로 넣도록 하는 하는 것들이 있습니다.

정규식은 예약된 표기법을 이용 규칙적인 패턴을 갖는 문자열을 찾는다거나 혹은 변형하는 기능을 갖도록 합니다.

고로, 문자열이 만약 "MouseVM..Slpit" 로 정의되어 있다면
이렇게 str.split("."); 호출하여도 원하는 결과를 얻을 수 없다는 것을 의미합니다.

원하는 결과를 얻기 위해서는
str.split("\\.");
이렇게 사용하여야 합니다.

점(.)은 정규식에서 개행문자를 제외한 아무문자하나를 말합니다.
점을 점 그데로 인식 시키려면 예약어를 일반문자처럼 사용하기 위해 back slash를 앞쪽에 하나 넣어 주는데,  위에서 두 개를 넣은 것은  자바 문법에서  ""  내부에서 \ 가 예약어라 \\개를 넣어 줍니다.

출처 :
http://kin.naver.com/db/detail.php?d1id=1&dir_id=10106&eid=u+9cW21TVvIUIAhHBMe3iW90aKtjWOc/&qb=c3BsaXQoIi4iKQ==

다량의 인서트와 업데이트 할때 유용하다.


SqlMapClient client = getSqlMapClient();
try{
client.startTransaction(); //선언해죠야하낟.
client.startBatch();
for (int i = 0; i < listDeptIDs.size(); i++) {
Object res = getSqlMapClientTemplate().queryForObject("select-role-dept", params); // 객체있는지 판단
   //System.out.println("res : " + res + ", " + deptid + " : " + rid);
   if (res == null || Integer.parseInt("" + res) <= 0) {
    client.insert("insert-role-dept", params); // 인서트할 쿼리를 넣는다.
   }
}
client.executeBatch();
} catch (Exception e) {
   e.printStackTrace();
   return false;
  } finally {
   try {
    client.endTransaction(); // 종료 확실히
   } catch (Exception e) {
    e.printStackTrace();
    return false;
   }
  }

잘사용하자.

펌 - http://naucika.tistory.com/63

Jakarta POI



VII. 엑셀 쓰기예제


쓰기도 역시 읽기와 비슷합니다.

엑셀 워크북을 생성합니다. 행과 셀을 생성하려면 당연한 절차겠죠?

HSSFWorkbook workbook = new HSSFWorkbook();


시트를 생성합니다.

시트명을 파라미터로 바로 생성 합니다.

HSSFSheet sheet = workbook.createSheet("sheet name");


만약 한글로 시트명을 만들려면 다음과 같이 인코딩이 필요합니다.

HSSFSheet sheet = workbook.createSheet();

workbook.setSheetName( 0 , "한글" , HSSFWorkbook.ENCODING_UTF_16 );


셀에 사용할 스타일을 미리 생성해 둡니다.

HSSFCellStyle style = wb.createCellStyle();
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBottomBorderColor(HSSFColor.BLACK.index);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setLeftBorderColor(HSSFColor.GREEN.index);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setRightBorderColor(HSSFColor.BLUE.index);
style.setBorderTop(HSSFCellStyle.BORDER_MEDIUM_DASHED);
style.setTopBorderColor(HSSFColor.BLACK.index);

등 여러가지 스타일을 만들 수 있습니다.


스타일은 다음 주소를 참고하세요

http://jakarta.apache.org/poi/apidocs/org/apache/poi/hssf/usermodel/HSSFCellStyle.html


로우를 하나 생성합니다.

HSSFRow row = sheet.createRow(0);


셀츨 하나 생성하여 스타일을 주고 값을 입력합니다.

HSSFCell cell = row.createCell((short)0);

cell.setCellStyle(style);

cell.setCellValue("jakarta project!");


만약 한글을 입력한다면 인코딩 해야 하며 값 세팅전에 해야 합니다.

cell.setEncoding(HSSFCell.ENCODING_UTF_16);  //한글 처리

cell.setCellStyle(style);

cell.setCellValue("자카드타 프로젝트!");


모든 셀이 다 입력되었으면 파일을 만듭니다.

FileOutputStream fs = new FileOutputStream("excelfile.xls");
workbook.write(fs);
fs.close();



VIII. 쓰기샘플 소스


<%@ page language="java" contentType="text/html;charset=euc-kr" %>
<%@ page import="java.io.*" %>
<%@ page import="org.apache.poi.poifs.dev.*" %>
<%@ page import="org.apache.poi.hssf.record.*" %>
<%@ page import="org.apache.poi.hssf.record.formula.*" %>
<%@ page import="org.apache.poi.hssf.model.*" %>
<%@ page import="org.apache.poi.hssf.usermodel.*" %>
<%@ page import="org.apache.poi.hssf.util.*" %>


<html>
<body>

<%

    String filepath = "C:\\Tomcat 5.0\\webapps\\ROOT\\write.xls";


    try {

        String[] cell_value = {"자카르타","프로젝트","www.jakartaproject.com"};


        HSSFWorkbook workbook = new HSSFWorkbook();


        HSSFSheet sheet = workbook.createSheet();
        workbook.setSheetName(0 , "한글명" ,HSSFWorkbook.ENCODING_UTF_16);


        HSSFCellStyle style = workbook.createCellStyle();
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        style.setBottomBorderColor(HSSFColor.BLACK.index);
        style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        style.setLeftBorderColor(HSSFColor.GREEN.index);
        style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        style.setRightBorderColor(HSSFColor.BLUE.index);
        style.setBorderTop(HSSFCellStyle.BORDER_MEDIUM_DASHED);
        style.setTopBorderColor(HSSFColor.BLACK.index);           


        HSSFRow row = sheet.createRow(0);
        for (int i = 0 ; i < cell_value.length; i++){
            HSSFCell cell = row.createCell((short)i);
            cell.setEncoding(HSSFCell.ENCODING_UTF_16);
            cell.setCellStyle(style);
            cell.setCellValue(cell_value[i]);
        }
           
        FileOutputStream fs = null;
        try {
            fs = new FileOutputStream(filepath);
            workbook.write(fs);
        } catch (Exception e) {
        } finally {
            if (fs != null) fs.close();
        }
       
    } catch (Exception e) {
%>
        Error occurred:  <%= e.getMessage() %>
<%  
        e.printStackTrace();
    }   
   
%>

</body>
</html>



자 결과화면 입니다.





성공!


위의 소스를 기본으로 한다면 그리 어렵지 않을겁니다 ^^


참고로 셀병합은


HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("new sheet");

HSSFRow row = sheet.createRow((short) 1);
HSSFCell cell = row.createCell((short) 1);
cell.setCellValue("This is a test of merging");

//셀병합
//Region(int 시작row, short 시작col, int 종료row, short 종료col)
sheet.addMergedRegion(new Region(1,(short)1,1,(short)2));

FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();

와 같이하면 됩니다


XML 예약문자

<, >, &는 XML tag 표시와 entity를 표시하는 XML 예약문자로, XML 문서에 그대로 사용할 수 없다.

< (less-than sign)  &lt;
> (greater-than sign)  &gt;
& (ampersand)  &amp;


그리스문자

그리스 문자는 풀어서 사용한다.

α alpha
β beta
γ gamma
δ,Δ delta
ε epsilon
ζ zeta
η eta
θ theta
ι iota
κ kappa
λ lambda
μ micron
ν nu
ξ xi
ο omicron
π pi
ρ rho
σ, Σ sigma
τ tau
υ upsilon
φ phi
χ chi
ψ psi
ω, Ω omega


기호 & 부호

&lt; or =
&gt; or =
± +/-
˚ degrees
degrees C
--&gt;
㎍, μG microgram
㎕, μL microliter
㎛, μM micrometer
® (R)
(TM)
χ2 chi─square


화학기호

화학기호는 윗첨자나 아랫첨자를 지정하지 않고 그대로 입력한다.

K+ K+
Cl- Cl-
Mg2+ Mg2+
CO2 CO2
H2O H2O


수학기호

수학기호는 윗첨자나 아랫첨자를 괄호 "( )" 안에 넣어서 입력한다.

102 10(2)
10-2 10(-2)
height2.239 height(2.239)


오라클  Sequence
 <insert id="extractionDao.insertNumber" parameterClass="ExtractionInfoBean">   
     <selectKey resultClass="log" keyProperty="id" >
      <![CDATA[           
    select event_seq.nextval from dual     
   ]]>
     </selectKey>
   <![CDATA[ 
    insert into event ( type, id, extension ) values ( #type#, #id#, #extension# )   
   ]]>          
 </insert> 


<!— Microsoft SQL Server IDENTITY Column Example -->
<insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">
insert into PRODUCT (PRD_DESCRIPTION)
values (#description#)
<selectKey resultClass="int" >
SELECT @@IDENTITY AS ID
</selectKey>
</insert>

1. 주의할점
-->keyProperty 는 parameterClass넘어오는 객체에 Set 과 Get으로 이름이존재해야한다.
--> parameterClass 클래스 객체의 타입과 resultClass="log" 의 값은 같아야한다.
--> DB 형식에 따라 selectKey  의 위치가 틀려질수있다.
      오라클은 먼저 MYSQL 및 MS_SQL은 뒤에 입력해야한다. 그이유는 DB 마다 스킨스 생성하는 방식이 틀리기 떄문이다.