2013. 3. 15. 01:21

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();
params.add(args[0]);

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);

}

}

}

 

http://levin01.blog.me/100011050694

'ApplicationPrograming > Java' 카테고리의 다른 글

자바 암호화  (0) 2015.02.25
Commons-Fileupload의 한글관련 문제 추가  (0) 2013.03.15
Commons-Fileupload의 한글관련 문제 추가  (0) 2013.03.15
JDOM  (0) 2013.01.31
me2DAY XML Parsing (DOM) - 자바 XML파싱  (0) 2012.07.24
Posted by 물색없는세상