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