1. Collection | |
| |
2. HashMap | |
| |
3. TreeMap | |
| |
4. Hashtable | |
|
'분류 전체보기'에 해당되는 글 278건
- 2008.03.10 java :: Java Map(HashMap, TreeMap, Hashtable) 1
- 2008.03.10 java :: [컬렉션] Collection / HashTable
- 2008.03.10 flex :: DataGrid Row 배경색 바꾸기
- 2008.03.10 flex :: Flex DataGrid 컬럼 동적 생성
- 2008.03.07 ORACLE :: oracle 내장함수
- 2008.03.06 java :: iterator 주의사항
- 2008.03.06 java :: 자바실행 파일 만들기
- 2008.03.06 jsp :: Commons-DbUtils
- 2008.02.28 oracle :: [Oracle] 임시테이블 사용하기 temptable
- 2008.02.28 flex :: chart 퍼센테이지 및 기본 설정
보통은 컬렉션을 배열로 구현을 하는게 맞다.
사용하는 입장이라면 기존의 있는 자료형을 그대로 쓰는게 좋겠지.
우리는 컬렉션을 다루기가 쉽거든.
배열과 컬렉션의 선택기준
단일타입의 집합은 배열을 쓰자.
배열은 막무가내로 짜지 않는다. 중학교 관리프로그램이라고 치면 어느정도 예상치를 알기에
적정하게 잡고 만들지.
다중타입의 집합은 컬렉션을 쓰자. 가변적인 방의 갯수.. 배열과 달리 줄이거나 늘리는데 유동적.
배열이나 컬렉션을 만들고 탐색을 많이 하지.
아이템에 대한 접근을 하는데 배열은 for문을 쓰고 컬렉션은 foreach문 쓰자. 실제 컬렉션은 for문
보다 foreach문이 월등히 빠르다.
배열과 컬렉션의 차이점.
[배열]
: 데이터의 집합, 배열도 오브젝트형을 만들 수 있다. 배열은 고정된 크기만 갖는다.
첨에 방이 10개면 계속 10만 가능하다.
[컬렉션]
: 다중 데이터형 집합, 오브젝트형의 집합
동적으로 메모리 확장가능(크기가 가변적이다, 가장 많이 쓰는 이유)
확실하지 않은 데이터의 크기는 컬렉션을 많이 쓰지.
방을 늘리거나 줄이거나 가능하기 때문이야
ArrayList
- 크기가 필요에 따라 동적으로 증가되는 배열
- 데이터를 넣을때
list.Add();
Ilist : 아이리스트를 부모로 갖는(상속) 놈들은 인덱서를 쓰도록 하자
Array list = new Array(); -> list[0]
이런 방법으로 입/출력할 수 있는 것.
ICollection : 얘를 상속받은 모든 클래스는 자기가 가지고 있는 구성요소를 count
라는 이름으로 반환하게 되어 있어.
쩜.count 이런 식으로 쓰인다.
IEnumerable : 도움말 참조~
ICloneable : clone 이라는 메소드를 구현해야 한다. 왜 배열을 clone으로 카피하는 이유
list.clone(); 복사할 때 이런 문법을 쓰는데 이 인터페이스를 상속받았기
때문이야.
개념을 알고 가자
Add : 추가의 개념, 다른 메소드에서는 Append 라고도 한다. 내용이 있으면 밑에다 계속 추가.
Insert : 삽입의 개념. 자료가 있으면 사이에 비짚고 넣겠다는 거야.
가변적인 ArrayList 왜???
배열은 방을 만들면 끝이다. int[] num = new int[5];
그러나 이놈은 신기하게 방갯수 변경이 가능하다. 하지만 이놈도 원래 방의 크기가 있다.
ArrayList mm = new ArrayList();
list.Add(10);
list.Add(20);
list.Add(30);
원래 기본적으로 3개의 방이 생성이 되는데 4번째 방을 만들고자 Add로 넣으면
기본크기의 2배가 되는 방을 만들고 원래있던 값들을 복사한다.
list.Add(40);
내부적으로는 객체가 2번 생성이 된것이지.. 그리고 방의 크기는 6개가 되는거야.
보통 기본크기도 잡을 수 있다.
근데 항상 요소의 갯수가 100개와 101개를 넘나들면 빈방이 많아지겠지.
이까지는 좋아. 4번째방에 40을 넣으면 2개의 남는 방이 있잖아.
이 때, 죽어도 4개이상의 방을 넘어갈 일이 없다... 즉 남는방을 없앨 때
우리는 list.TrimToSize(); 를 써서 공간낭비를 줄일 수 있다.
========================================================================================
using System;
using System.Collections; // 컬렉션을 구동하기 위해 추가하는 using문
namespace ConsoleApplication1
{
public class Class6
{
public static void Main(string[] args)
{
// 배열같은 놈을 하나 만들자
// #### ArrayList #########
// 배열과 달리 길이가 가변적이라 방의 갯수를 지정할 필요 없다.
// foreach문을 지원한다.
ArrayList list = new ArrayList();
list.Add(100);
list.Add(200);
list.Add(300);
Console.WriteLine("list의 크기 : {0}", list.Count); // 3 을 반환
Console.WriteLine(list[1]); // 200 을 반환
foreach(int n in list)
{
Console.WriteLine(n); // 100 200 300 을 반환
}
// 요소를 모두 제거하는 clear
list.Clear();
Console.WriteLine(list.Count); // 0 을 반환
// 지운 값을 다시 넣고...
list.Add(100);
list.Add(200);
list.Add(300);
// 유/무를 반환, 검색용 메소드
Console.WriteLine(list.Contains(200)); // true를 반환
// Insert....
list.Insert(1,400); // 1번째 위치에 400을 넣겠다는 의미다.
foreach(int n in list)
{
Console.WriteLine(n);
}
// Insert를 ADD랑 같게 만들고 싶다면
list.Insert(list.Count, 777);
foreach(int n in list)
{
Console.WriteLine(n);
}
// Remove는 찾아서 지우는 놈.... 200을 넣으면 200이란 값을 찾아서 지운다.
// 만약 200이 두개 있으면 첫번째 놈만 지운다.
list.Remove(200);
// 찍어서 지운다.
list.RemoveAt(1);
// sort는 배열의 sort와 같다.
list.Sort();
// 이놈은 쓰는게 좋다.
// 왜 이 ArrayList란 놈은 가변적일까???
// 그 질문과 연장선상에 있다. 이놈은 남는 방을 잘러버리거든
list.TrimToSize()
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
HashTable
IDictionary 기능을 가지고 있다. 방이름(키값)을 지정해주는것
이 놈은 hash[0] 이라고 하면 0번째 방이 아닌 0의 키값을 가지는지 보는거야..
패턴이 없기 때문에 반복시키기가 좀 애매해.. 못하는건 아닌데 많이 까다로워
직관적인 대신에 이런 약점을 가지지...
list[0] - "스칼라배열", 인덱스로 구분
list["id"] - "연관배열", HashTable
// 사용자의 입장에서 주소값만 보고는 사실 머가 들어있는지 잘 모르잖아
// 근데 방이름만 잘 정해주면 방속에 있는 데이터가 먼지를 어느정도 알수있잖아~
Hashtable hash = new Hashtable();
hash.Add("one", "하나");
hash.Add("two","둘");
hash.Add("three","셋");
hash.Add("402","닷넷전문가");
hash.Add("301","DB전문가");
// Hashtable을 불러내기 위해서는 방의 이름표(키값)를 요구한다.
// ADD 할때 키와 값의 쌍으로 이루어지게 된다.
Console.WriteLine(hash["one"]);
Console.WriteLine(hash["402"]);
Console.WriteLine(hash[0]); // 0번째 방이 아닌 0의 키값을 찾아보는거다.
// Queue, 입/출력 데이터는 역시 오브젝트이다.
// 선입선출(FIFO : first in first out) : 파이프에 공을 넣고 끝에서 하나씩 받는다고 생각해.
// 우리가 쓰는 원도우에 딜레이가 있어도 먼저 클릭한 것부터 진행하잖아~
// 이는 메시지를 담아놓는 Queue가 존재해서 그래.
Queue queue = new Queue();
queue.Enqueue(10);
queue.Enqueue(20);
queue.Enqueue(30); // 차곡차곡 순서대로 데이터를 넣었다.
// 데이터를 끄집에 낼때는 단순한 메소드 호출 10->20->30의 순서로 호출된다.
Console.WriteLine(queue.Count); // 3 이 호출
Console.WriteLine(queue.Dequeue());
Console.WriteLine(queue.Dequeue());
Console.WriteLine(queue.Dequeue());
Console.WriteLine(queue.Count); // 0 이 호출 : Dequeue()라는 놈은 가져온 만큼 데이터 소멸
queue.Enqueue(500);
Console.WriteLine(queue.Peek()); // 요소를 제거하지 않고 그냥 반환.. 데이터 소멸 X
Console.WriteLine(queue.Count); // 1 이 호출
// Stack =========================================================
// 후입후출(LIFO : last in first out) 맨 마지막에 들어간 놈이 맨 첨에 나온다.
// 바닥이 막힌 세로로 생긴 통이라고 생각해라.
Stack stack = new Stack();
stack.Push("일");
stack.Push("이");
stack.Push("삼");
Console.WriteLine(stack.Count); // 3 이 호출
Console.WriteLine(stack.Pop()); // "삼" 이 호출
Console.WriteLine(stack.Pop()); // "이" 가 호출
Console.WriteLine(stack.Pop()); // "일" 이 호출
Console.WriteLine(stack.Count); // 0 이 호출
stack.Push("십");
Console.WriteLine(stack.Peek()); // "십" 이 호출
Console.WriteLine(stack.Count); // 1 이 호출
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
}
}
}
[출처] [컬렉션] Collection / HashTable|작성자 지니진
How to change the background color of a row is an often-asked question. In Flex 2.0 it is easy. Follow these steps:
- Create a new class that extends mx.controls.DataGrid. This class can be an MXML file or an ActionScript file, whichever you are most comfortable with.
- Overide the protected function, drawRowBackground:
override protected function drawRowBackground(s:Sprite, rowIndex:int, y:Number, height:Number,
color:uint, dataIndex:int):void
{
// make any tests here, then change color accordingly. For example: color = 0xFF0000;
// call the super function to make it happen.
super.drawRowBackground(s,rowIndex,y,height,color,dataIndex);
} - Now use your new grid in place of the <mx:DataGrid> in your application.
Within drawRowBackground you can test your data. The dataIndex argument can be used to look up the item in the dataProvider that corresponds to this row. For example, suppose you want to color any row green whose quantity is greater than 1000:
var item:Object = (dataProvider as ArrayCollection).getItemAt(dataIndex);
if( item.quantity > 1000 ) color = 0x00FF00;
It's just that easy.
출처 : http://weblogs.macromedia.com/pent/archives/2006/10/datagrid_tip_ro.cfm
출처 : http://www.ihelpers.co.kr/programming/tipntech.php?CMD=view&TYPE=8&KEY=&SC=S&&CC=&PAGE=1&IDX=547
1.데모
2. 소스
MiyaGrid.mxml
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:ns1="*" creationComplete="initApp()" viewSourceURL="srcview/index.html" fontSize="12"> <mx:Script> <![CDATA[ import mx.controls.dataGridClasses.DataGridColumn; import mx.collections.ArrayCollection; import mx.controls.Alert; [Bindable] private var ArrCol:ArrayCollection = new ArrayCollection(); public function initApp():void{ myGrid.dataProvider = ArrCol; } public function onChangeColumn():void{ // Grid init myGrid.columns = []; ArrCol.removeAll(); var arrCol:Array = new Array(); for(var i:uint = 0; i<chgColumn.value;i++){ var col:DataGridColumn = new DataGridColumn("col"+i); var colRender:ClassFactory = new ClassFactory(LabelRenderer); colRender.properties = {headerText:"컬럼"+i}; col.headerRenderer = colRender; col.setStyle("textAlign","right"); arrCol.push(col); } myGrid.columns = arrCol; for(i=0;i<100;i++){ var colval:Object = new Object; for(var j:uint = 0; j<chgColumn.value;j++){ colval["col"+j] = (i+1)*(j+1); } ArrCol.addItem(colval); } } ]]> </mx:Script> <mx:Component id="HeaderLabelRenderer"> <mx:HBox horizontalAlign="left" verticalAlign="middle"> <mx:Label text="" textIndent="3" width="100%" textAlign="left"/> </mx:HBox> </mx:Component> <mx:DataGrid left="10" right="10" top="70" bottom="10" id="myGrid" fontSize="12"/> <mx:HBox left="10" right="10" top="10" bottom="518"> <mx:Form width="100%"> <mx:FormItem label="컬럼수"> <mx:HSlider id="chgColumn" width="236" minimum="5" maximum="10" snapInterval="1" enabled="true" change="onChangeColumn()"/> </mx:FormItem> </mx:Form> </mx:HBox> </mx:Application> |
LabelRenderer.mxml
Grid HeaderText 값을 동적으로 사용하기 위해 headerText 사용하였습니다.
<?xml version="1.0" encoding="utf-8"?> private var _headerText:String; public function initComp():void { |
3. 참고
ORACLE 내장함수
* abs() - 절대값구하기
array(배열) - 배열을 반환
asc() - 문자의 ANSI문자값을 반환
atn() - 아크 탄젠트로 반환
cbool() - boolean형식으로 반환
cbyte() - byte형식으로 반환
ccur() - currency형식으로 반환
cdate() - date형식으로 반환
cdbl() - double형식으로 반환
* chr() - asc()함수의 반대, ANSI문자를 일반문자로 변환
* cint() - interger형식으로 반환
clng() - long형식으로 반환
cos(각도) - 주어진 각도의 코사인 값을 반환
** createobject() - 자동화 인터페이스를 통해 다른 응용프로그램이나
프로그래밍 도구에 나타나는 객체에 대한 참조를 만들어 반환
cstr() - string형식으로 반환
** date() - 현재의 날자를 반환
dateserial(년,월,일) - 주어진 년,월,일에 대한 date형식을 반환
exp() - 주어진 수에대한 자연로그(승수로 거듭제곱하는 수) 밑인 e를 반환
filter(inputstring,값[,include[,비교]])) - inputstring는 검색할 문자열의 1차원 배열
include는 true나 false값을 가지는데, true로 설정되면 값발견시 그값을 가진
배열을 반환하고,flase로 설정되면 검색에 맞지않는 부분의 배열을 반환
비교는 비교형식을 나타내는 숫자값입니다
fix() - 주어진 수의 정수를 반환
* formatcurrency() - 원화 형식으로 반환 예) \1,000
formatdatetime() - 날자와 시간으로 형식화하여 반환
* formatnumber(숫자,소수자릿수) - 숫자로 형식화된 식을 반환 소숫점 몇째자리...
* formatpercent(수,소수자리수) - 퍼센트형식으로 반환 기본 소수2째자리까지.
hex() - 주어진 수를 16진수로 변환
hour() - 0과23 사이의 시간을 나타낸다
inputbox(프롬프트[,제목][,기본값][,xpos][,ypos][,helpfile,context]) - 대화상자
* instr([시작,]문자열1,문자열2[,비교]) - 시작은 문자열 검색 시작위치, 문자열1은 검색할
문자이며, 문자열2는 찾아야할 문자, 비교는 비교상수를 나타냄
* instrrev() - instr()과 반대로 문자 끝에서부터 검색
* int() - 주어진 수의 정수부분을 반환
isarray() - 주어진 변수가 배열인지 판단하는 boolean값을 반환
isdate() - 주어진 식이 날짜로 전환 될수 있는지 나타내는 boolean값을 반환
isempty() - 주어진 변수가 초기화 되었는지 나타내는 boolean값을 반환
isnull() - 주어진 식이 유효한 데이터가 있는지 없는지 boolean값을 반환
isnumberic() - 주어진 식이 숫자로 값이 정해질 수 있는지 나타내는 boolean값 반환
* isobject() - 자동화 객체를 참조하는지 여부를 나타내는 boolean값을 반환
join(목록[,구분기호]) - 배열에 포함되어 있는 여러 문자열을 결합하여 만든 문자열을 반환
모록은 1차원 배열이름, 구분기호는 문자열을 구분하기위해 사용하고 기본값은 "" 공백
lbound(배열이름[,차원]) - 주어진 배열에서 사용할 수 있는 가장 작은 첨자를 반환
배열이름은 배열 변수의 이름, 차원은 배열의 차원중 가장 작은 값을 나타냄
* lcase() - 주어진 문자를 소문자로 반환
** left(문자열,수) - 주어진 문자를 왼쪽으로부터 주어진 수만큼의 문자열을 반환
* len() - 주어진 문자열의 문자 개수를 세는 함수
loadpicture(그림파일의이름) - 그림객체를 반환
log() - 주어진수의 자연 로그를 반환
ltime() - 앞에 공백이 없는 문자열을 반환
** mid(문자열,시작[,길이]) - 주어진 문자열에서 주어진 위치에서부터의 길이만큼의 문자를 반환
minute(시간) - 시간에서 분값(0~59)을 반환
month(날짜) - 달의 값(1~12)을 반환
* monthname(달) - 주어진달의 숫자표현을 문자표현으로 바꾸어준다
msgbox(프롬프트[,단추][,제목][,helpfile,context]) - 프롬프트는 대화상자 안의 내용
단추는 단추모양,제목은 제목표시줄이름, helpfile은 도움말위치,context는 도움말 문맥번호
* now() - 현재 날자와 시간을 반환
oct() - 주어진 숫자의 8진수 값을 나타내는 문자를 반환
** replace(문자열,찾을문자열,바꿀문자열[,시작[,횟수[,비교]]]) - 문자열은 바꿀 대상, 찾을문자열은
문자열에서 바꾸어야 할 문자, 바꿀문자열은 찾은 문자열을 대치할 문자열, 시작은 검색시작위치
횟수는 바꾸는 횟수, 비교는 바꿀 때의 비교형식
** right(문자열,수) - 주어진 문자의 오른쪽으로 부터 주어진 수만큼의 문자를 반환
rnd(수) - 난수를 반환 수는 생략가능
round(수) - 반올림한 수를 반환, 소수 첫째자리 반올림
rtrim(문자열) - 뒤에 공백이 없는 문자열을 반환
scriptengine() - 사용중인 스크립트 언어를 나타낼때 사용
scriptenginebuildversion() - 사용중인 스크립트 엔진의 버전 수를 반환
scriptenginemajorversion() - 사용중인 스크립트 엔진의 주 버전 수를 반환
scriptengineminorversion() - 사용중인 스크립트 언어의 보조 버전 수를 반환
* second(시간) - 시스템 시간중 초값(0~59)을 반환
sgn(수) - 주어진 숫자의 부호를 나타내는 정수를 반환 0보다크면 1, 같으면 0, 작으면 -1을 반환
sin() - 주어진 라디안 값의 사인값을 반환
space(수) - 주어진 수만큼의 공백이 포함된 문자열을 반환
* split(문자열[,구분기호[,수[,비교]]]) - 문자열은 배열에 포함될 문자열, 구분기호는 문자열 구분하기
위한기호를 표시. 생략시 "" 공백, 수는 반환될 문자열의 수를 나타냄, 비교는 바꿀때의 비교형식
sqr(수) - 주어진 수의 제곱근을 반환
strcomp(문자열1,문자열2[,비교]) - 두개의 문자열을 비교하여 결과값을 반환
strreverse(문자열) - 주어진 문자열을 뒤에서부터 읽은 문자열을 반환
* string(수,문자) - 주어진 문자가 주어진 수만큼의 반복된 문자열을 반환
tan(수) - 주어진 라디안 값의 수 만큼의 탄젠트 값을 반환
* time() - 현재 시간을 반환
timeserial(시, 분, 초) - 주어진 시간,분,초에 대한 시간 값을 반환
timeval!!ue(시간) - 시간이 포함된 date형식을 반환해주는 함수
trim(문자열) - 앞뒤 공백이 없는 문자열을 반환해 줄 때 사용
typename(변수이름) - 주어진 변수의 정보를 나타내는 문자열 반환
ubound(배열이름[,차원]) - 배열의 차원으로 가장 큰 첨자를 반환
* ucase(문자열) - 주어진 문자를 대문자로 바꾸어 줍니다
vartype(변수) - 변수의 형식을 나타내는 값을 반환
weekday(날짜[,firstday of week]) - 요일을 나타내는 정수를 반환, firstday for week는 첫재요일을 숫자로
weekdayname(요일,약어, firsrday of week) - 요일은 숫자, 약어는 약어의 유무의 부울값
* year() - 현재의 년도를 나타낼때 쓰임
무한루프
while (param.getSampleCodes().iterator()) {
System.out.println(itr.next());
}
올바른 사용
Iterator<String> itr = param.getSampleCodes().iterator();
while (itr.hasNext()) {
System.out.println(itr.next());
}
Iterator<String> itr = param.getSampleCodes().iterator();
while (itr.hasNext()) {
System.out.println(itr.next());
}
for (String s : param.getSampleCodes())
System.out.println(s);
별것 아니지만 기록으로 남긴다.
1. Java 프로그램을 exe 파일로 만드려면 별도의 프로그램이 필요하다.
나는 그 중에서 JSmooth 를 사용. 일단 다운부터 받자.
JSmooth Download
2. notepad 에 Main-Class: package_name 을 적어서 MANIFEST.MF 로 저장하자.
패키지이름끝은 main()이 들어있는 클래스파일명으로 끝나게.
예) 패키지명 com.project.BBmachine
main()이 들어있는 클래스파일 BeatBox.class
저 줄을 입력하고 마지막에 엔터키를 쳐 개행을 해야한다고 한다.
3. .jar 로 압축하기.
jar cmf manifest.mf BJar.jar com/project/BBmachine/BeatBox
BJar.jar - 만들고자 하는 jar 파일명
com/project.... - 프로그램 디렉토리(상대주소)
4. JSmooth 실행
왼쪽에 있는 Skelector 메뉴 선택 - skeleton selection에서 콘솔 or 윈도우 선택 (자신의 프로그램에 따라)
- skeleton properties 에서 세번째 줄 체크박스 체크
5.
Executable 메뉴 - Executable Binary 에 만들고자 하는 exe 파일명 입력 - Executable Icon 에 원하는
아이콘 이미지 삽입 (아이콘 파일 형식에 따라 삽입이 안되는 경우 있으니 그림이 뜨는지 확인)
6.
Application 메뉴 - Classpath 부터 지정. 오른쪽 추가버튼 클릭하여 아까 만든 .jar 파일 선택
- Main class 에는 ..디렉토리 버튼을 눌러 main() 이 있는 클래스파일 선택
7.
JVM Selection 메뉴 - Minimum JVM Version 에 자신이 사용한 java 버전 입력
8.
톱니바퀴 모양의 아이콘을 누르면 jsmooth 파일이 생김(파일이름 지정해주어야 함)
Done 으로 뜨면 exe 파일이 만들어진것임
(참고사이트)
http://blog.naver.com/easy20/90014252360
http://blog.naver.com/sungback/80019669157
처음으로 요런 포스트를 만들었다. 힘들다. 특히 print screen 이 귀찮은 정도~ 나름 뿌듯 ^^
출처 자바실행 파일 만들기|작성자 욱이천재
Commons-DbUtils
I. 어디서 다운을 받나요?
http://jakarta.apache.org/site/downloads/downloads_commons-dbutils.cgi
II. 설치는 어떻게 하나요?
다운 받은 commons-beanutils.jar는 자신의 /WEB-INF/lib/ 에 복사합니다
III. DbUtils란 무엇인가요?
DbUtils는 JDBC 작업을 좀더 쉽게 할수있도록 해주는 작은 클래스 집합입니다.
IV. 왜 DbUtils를 사용해야 하는가요?
① resource 누출에 대한 어떠한 가능성도 없습니다
JDBC코딩을 하는데 있어서 쉽지않고 양도 만만치 않으며 지루해 지기 쉽습니다
이러다 보면 자기도 모르게 Connection 누수를 발생시킬수 있는데 이러한 가능성을 배재해 줍니다
② 코드의 가독성이 높아집니다
데이터베이스 처리하는데 필요한 코드의 양을 절대적으로 줄여야 합니다.
남아있는 코드로 당신의 의도를 정확하게 나타내어야 합니다.
③ ResultSet으로 부터 JavaBean property로 세팅을 해줍니다!
더이상 setter메소드를 이용하여 ResultSet으로부터 컬럼값을 가져오는 코딩을 하지 않아도 됩니다
ResultSet 각각의 row는 bean instance의 에 완벽하게 전달해 줍니다
V. 어떻게 사용하나요?
① Connection, Statement, ResultSet 의 close를 간단하게!
이럴때는 org.apache.commons.dbutils.DbUtils 클래스를 이용하자!
이 클래스는 모두 static 메소드들로 구성되어있습니다
사용예)
DbUtils.close(conn);
DbUtils.close(stmt);
DbUtils.close(rs);
DbUtils.closeQuietly(conn);
DbUtils.closeQuietly(stmt);
DbUtils.closeQuietly(rs);
DbUtils.closeQuietly(conn, stmt, rs);
DbUtils.commitAndClose(conn);
DbUtils.commitAndCloseQuietly(conn);
DbUtils.loadDriver("com.mysql.jdbc.Driver");
DbUtils.rollback(conn);
closeQuietly 메소드처럼 뒤에 Quietly라고 붙어 있는 메소드는 익셉션 처리는 자체적으로 처리합니다,
즉 자신을 call한곳으로 throw 하지 않습니다
commitAndCloses는 connection을 commit 후 close 하며 rollback는 connection을 rollback 합니다
loadDriver 는 JDBC 드라이버를 로딩 합니다
② 파일로 저장된 SQL을 사용하자!
이럴 때는 org.apache.commons.dbutils.QueryLoader 클래스를 이용합니다
이 클래스는 SingleTone 패턴의 클래스입니다
즉 파일로 저장된 SQL을 읽어 HashMap으로 로드하는 클래스 입니다
사용예)
QueryLoader queryloader = QueryLoader.getInstance(); //싱글톤
HashMap hashmap = queryloader.load("sql");
queryloader.upload("sql");
queryloader는 싱클톤이므로 위와같이 객체를 얻어옵니다
load 함수는 Properties 클래스를 이용하여 sql.properties 파일을 읽어
HashMap으로 저장하여 리턴하여 줍니다
unload는 load시 따로 메모리에 저장해 놓았던 sql 정보를 해제합니다
③ Setter함수로 더이상 머리 아프지 말자!
이럴때는 org.apache.commons.dbutils.QueryRunner 클래스를 이용합니다
사용예)
...
BoardVO boardVO = null;
ArrayList arraylist = new ArrayList();
resultset = statement.executeQuery("SELECT * FROM board_t");
while (resultset.next()) {
boardVO = new BoardVO();
boardVO.setTitle("title");
boardVO.setContent("content");
boardVO.setWriter("writer");
arraylist.add(boardVO);
}
..
와 같은 코드는 다음과 같이 간략화 됩니다
ResultSetHandler rsh= new BeanListHandler(BoardVO.class);
QueryRunner queryRunner = new QueryRunner();
List list = (List)queryRunner.query(conn, "SELECT * FROM board_t", rsh);
정말 간단해 집니다 만약 테이블에 컬럼이 30~40개가 된다면..
select 한문장 할려면 코드수가 몇십줄 입니다. 더이상 노가다 하지 맙시다~
QueryRunner는 다음과 같은 함수를 지원합니다
사용예)
QueryRunner queryrunner = new QueryRunner();
QueryRunner queryrunner = new QueryRunner(DataSource ds); //datasource를 바로 이용할 수 있다
queryRunner.query(Connection conn, String sql, ResultSetHandler rsh)
queryRunner.query(Connection conn, String sql, Object param, ResultSetHandler rsh)
queryRunner.query(Connection conn, String sql, Object[] params, ResultSetHandler rsh)
여기서 말하는 Object param은 파라미터 전달시 사용됩니다
ArrayList params = new ArrayList();
params.add("100");
params.add("200");
ResultSetHandler rsh = new BeanListHandler(BoardVO.class);
QueryRunner queryRunner = new QueryRunner();
List list = (List)queryRunner.query(conn, "SELECT * FROM board_t WHERE boardNo > ? and boardNo < ?", params.toArray(), rsh);
select 뿐만 아니라 update, delete역시 가능합니다
사용예)
QueryRunner queryRunner = new QueryRunner();
queryRunner.update(Connection conn, String sql)
queryRunner.update(Connection conn, String sql, Object param)
queryRunner.update(Connection conn, String sql, Object params[])
ArrayList params = new ArrayList();
params.add(boardId);
queryRunner.update(connection, "UPDATE board_t SET read = read + 1 WHERE boardNo = ?", params.toArray());
와 같이 사용할 수 있습니다
VI. 샘플코드
public class DbUtilsExample() { public static void main(String[] args) { HashMap map = QueryLoader.getInstance().load("sql"); // (주의) load함수는 실행할때마다 파일을 읽습니다 Connection conn = null; try { DbUtils.loadDriver("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost/mysql", "root", ""); ArrayList params = new ArrayList(); ResultSetHandler rsh = new BeanListHandler(BoardVO.class); QueryRunner qr = new QueryRunner(); List list = qr.query(conn, (String)map.get("select"), params.toArray(), rsh); for (int i = 0; i < list.size(); i++) { BoardVO board = (BoardV)list.get(i); System.out.println(board.getTitle()); System.out.println(board.getContent()); System.out.println(board.getWriter()); ) } catch (Exception e) { System.out.println(e); } finally { DbUtils.closeQuitely(conn); } } } |
오라클에서는 왜 MSSQL에서 사용하는 임시 테이블을 만들수없을까
고민했던 적이 있었습니다. 임시테이블 만들수 있습니다. 있구요.
임시 테이블을 생성하되 duration은 transaction단위로 한다는 것을 기억해야 합니다.
아래의 순서를 따라 하시면 임시 테이블을 만드실 수 있습니다.
1. 임시 테이블생성
SQL> create global temporary table temp_tab (col1 number, col2 char(15))
on commit delete rows ;
--> on commit delete rows 를 잘 기억해 두세요.
[Commit 을 하면 삭제작업을 하는것으로 설정한다는 말입니다.]
2. 임시 테이블에 인덱스 만들기
SQL> create index temp_tab_n1 on temp_tab(col1);
3. 임시 테이블에 데이터 인서트
SQL> insert into temp_tab values ( 1 , '구미지엔') ;
★ 주의 : Insert/Update 했다고 Commit 하시면 안됩니다.
4. 임시 테이블에서 데이터 가져오기
SQL> select * from temp_tab ;
COL1 COL2
--------- ------------
1 구미지엔
5. 임시 테이블 관찰
생김새를 자세히 보시려면 토드(Toad)에서 desc temp_tab 하시고
스크립트를 살펴보시면 기존에는 있던 Tablespace 구절이 빠져 있는것을 알 수 있습니다.
이는 임시테이블이나 인덱스가 메모리에 생성된다는 것을 말합니다.
DBA 업무 하시는 분들은 다이나믹 퍼포먼스 뷰 보시면(user_objects 등) 알수 있습니다.
6. 임시 테이블의 데이터를 메모리에서 내리기
SQL> commit ;
Commit complete.
7. 임시 테이블을 다시 보면
duration이 transaction단위이기 때문에 commit을 수행하면 모든 data가 사라집니다.
일반적으로, Customizing Tablespace 에 만들어 둔 영구테이블들은
레포트가 실행 될때마다 테이블에 데이터가 계속 쌓이거나
테이블의 내용을 모두 지우거나 Truncate 한후
데이터를 다시 입력하는 번거러움이 있는 줄로 압니다.
그때 마다의 물리적인 I/O(삭제작업 시) 발생은 서버에 상당한 부하를 주겠죠
(물론 데이터 수십건 처리하는 트랜잭션이라면 부하를 주진 않겠죠. )
그래서 메모리를 사용하면 물리적인 I/O 가 메모리에서 발생하므로
다른 사용자 트랜잭션에 영향을 거의 주지 않겠죠.
또하나 , Disk 보다는 메모리의 속도가 빠르다.
위의 일반적인 방법과 임시테이블 사용에는 서로 장단점이 있겠습니다만,
실행 속도는 비교가 안되겠죠.(제 생각)
<임시테이블 관련 자료 출처 : 한국오라클>
출처 [Oracle] 임시테이블 사용하기|작성자 구미지엔
The following example shows the differences between a clustered, stacked, 100%, and overlaid Bar chart in Flex 3.
Full code after the jump.
<?xml version="1.0" encoding="utf-8"?> <!-- http://blog.flexexamples.com/2007/10/11/creating-clustered-stacked-overlaid-and-100-bar-charts-in-flex-3/ --> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" verticalAlign="middle" backgroundColor="white"> <mx:ApplicationControlBar dock="true"> <mx:Form> <mx:FormItem label="type:"> <mx:ComboBox id="comboBox"> <mx:dataProvider> <mx:Object label="clustered" /> <mx:Object label="stacked" /> <mx:Object label="100%" /> <mx:Object label="overlaid" /> </mx:dataProvider> </mx:ComboBox> </mx:FormItem> <mx:FormItem label="showDataTips:"> <mx:CheckBox id="checkBox1" /> </mx:FormItem> <mx:FormItem label="showAllDataTips:"> <mx:CheckBox id="checkBox2" /> </mx:FormItem> </mx:Form> <mx:Spacer width="100%" /> <mx:Legend dataProvider="{barChart}"/> </mx:ApplicationControlBar> <mx:BarChart id="barChart" type="{comboBox.selectedItem.label}" showDataTips="{checkBox1.selected}" showAllDataTips="{checkBox2.selected}" height="100%" width="100%"> <mx:dataProvider> <mx:Array> <mx:Object name="R Winn" obp=".353" slg=".445" avg=".300" /> <mx:Object name="P Feliz" obp=".290" slg=".418" avg=".253" /> <mx:Object name="O Vizquel" obp=".305" slg=".316" avg=".246" /> <mx:Object name="B Molina" obp=".298" slg=".433" avg=".276" /> <mx:Object name="R Durham" obp=".295" slg=".343" avg=".218" /> </mx:Array> </mx:dataProvider> <mx:verticalAxis> <mx:CategoryAxis categoryField="name"/> </mx:verticalAxis> <mx:series> <mx:BarSeries yField="name" xField="obp" displayName="OBP"/> <mx:BarSeries yField="name" xField="slg" displayName="SLG"/> <mx:BarSeries yField="name" xField="avg" displayName="AVG"/> </mx:series> </mx:BarChart> </mx:Application>
View source is enabled in the following example.